个人对于企业微信付款到零钱的一些理解与说明,含代码

前段时间因公司业务需求,需要开发一个企业微信直接付款到用户微信账户的功能,然后就去微信官方文档看了一下,点击进入微信企业支付官方文档

没什么特别的地方,也算是一个普通的接口,不过除了代码外,需要特别注意的地方就是调用这个接口需要微信商户端的证书,这是微信官方对商户证书描述的文档

需要注意的有三步:
1.对参数进行排序并拼接
2.对拼接出来的字符串进行签名
3.调用接口时带上证书

接下来直接上代码

/**
*所需要传入的参数就是要付款的金额
*/
public String pay(double amount, HttpServletRequest request) throws Exception {String ip=request.getRemoteAddr();int money=new Double(amount*100).intValue();//生成随机字符串String nonceStr=RandomGenerator.getRandomString();Map<String,String> map=new HashMap<>(10);map.put("amount",String.valueOf(money));//如果需要校验收款方的姓名则将check_name改为FORCE_CHECK,//NO_CHECK可以不传入re_user_name,如果是FORCE_CHECK则必须传入map.put("check_name","NO_CHECK");map.put("desc","卖家余额提现");map.put("mch_appid",wechatAccountConfig.getMpAppId());map.put("mchid",wechatAccountConfig.getMchId());map.put("nonce_str",nonceStr);//各位从自己的系统中获取所要付款的用户的openidmap.put("openid",openid);//付款到用户也算是一笔订单嘛,因此我传入的是付款记录的orderId,需要改动map.put("partner_trade_no",orderId);map.put("spbill_create_ip",ip);//这一步完成了参数的排序及拼接,PayUtil工具类源码在下面String preStr= PayUtil.createLinkString(map);//这一步是最重要的对参数进行签名,微信根据这个进行校验String sign=PayUtil.sign(preStr,wechatAccountConfig.getMchKey(),"utf-8");//这一步构造调用接口需要的数据形式,因为该接口需要xml格式的数据String postXml="<xml>\n" +"<mch_appid>"+wechatAccountConfig.getMpAppId()+"</mch_appid>\n" +"<mchid>"+wechatAccountConfig.getMchId()+"</mchid>\n" +"<nonce_str>"+nonceStr+"</nonce_str>\n" +"<partner_trade_no>"+outDetail.getOrderId()+"</partner_trade_no>\n" +"<openid>"+seller.getOpenid()+"</openid>\n" +"<check_name>NO_CHECK</check_name>\n" +"<re_user_name></re_user_name>\n" +"<amount>"+money+"</amount>\n" +"<desc>卖家余额提现</desc>\n" +"<spbill_create_ip>"+ip+"</spbill_create_ip>\n" +"<sign>"+sign+"</sign>\n" +"</xml>";log.info("开始调用微信企业付款到零钱的接口:"+postXml);//这一步是最重要的,因为在调用付款接口的时候不仅仅需要传数据过去,还要带上证书,最开始我弄得时候在这里出错了好几次String res=PayUtil.HttpRequestForEnterprise(PAY_URL,"POST",postXml);log.info("调用完成,返回数据"+res);Map resMap=PayUtil.doXMLParse(res);System.out.println(resMap.get("return_code"));//如果调用失败,则需要将数据改动回退if(resMap.get("result_code").equals("SUCCESS")){//更改提现订单的状态//根据自身业务需求进行改动}return "";}

二.这个是我调用付款接口的时候使用到的工具类,主要就是三个方法,都有对于网上一些朋友的代码的参考
1.完成参数的排序与拼接

public static String createLinkString(Map<String, String> params) {List<String> keys = new ArrayList<String>(params.keySet());Collections.sort(keys);String prestr = "";for (int i = 0; i < keys.size(); i++) {String key = keys.get(i);String value = params.get(key);if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符prestr = prestr + key + "=" + value;} else {prestr = prestr + key + "=" + value + "&";}}return prestr;}

2.对数据进行签名

text就是所需签名的原数据,key是商户密钥

public static String sign(String text, String key, String input_charset) {text = text + "&key=" + key;return DigestUtils.md5Hex(getContentBytes(text, input_charset));}

3.这里主要是在将之前构造好的数据传入来调用微信付款的接口,并带上证书,切记证书一定一定不能忘记

public static String HttpRequestForEnterprise(String url,String outputStr) throws Exception {//这里填入商户证书的密码,即商户号String PKCS12 = "";//证书地址String fileRoute = "";//指定读取证书格式为PKCS12KeyStore keyStore = KeyStore.getInstance("PKCS12");//读取本机存放的PKCS12证书文件FileInputStream instream = new FileInputStream(new File(fileRoute));try {//指定PKCS12的密码keyStore.load(instream, PKCS12.toCharArray());} finally {instream.close();}//指定TLS版本SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, PKCS12.toCharArray()).build();//设置httpclient的SSLSocketFactorySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[]{"TLSv1"},null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();StringBuffer stringBuffer = new StringBuffer();try {HttpPost httpPost = new HttpPost(url);InputStream is = new ByteArrayInputStream(outputStr.getBytes("UTF-8"));//InputStreamEntity严格是对内容和长度相匹配的。用法和BasicHttpEntity类似InputStreamEntity inputStreamEntity = new InputStreamEntity(is, is.available());httpPost.setEntity(inputStreamEntity);CloseableHttpResponse response = httpclient.execute(httpPost);try {HttpEntity entity = response.getEntity();BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));String inputLine;while ((inputLine = reader.readLine()) != null) {stringBuffer.append(inputLine);}} finally {response.close();}} finally {httpclient.close();}return stringBuffer.toString();}

以上.希望能帮到大家
如果我有讲的不好的地方,或者大家有不理解的,都可以私信或者评论我,一定回复

企业微信付款到零钱,全代码讲解,包含怎么加入商户证书相关推荐

  1. php企业微信付款到零钱,企业付款到零钱功能介绍及常见问题

    Q:为什么我在[产品中心]找不到[企业付款到零钱]产品? A:需同时满足三个条件,才能看到开通入口: 1)入驻满足90天: 2)截止今日往回推30天有连续不间断的交易: 3)交易需为正常的健康交易. ...

  2. 金蝶云星空对接企业微信 - 付款单

    与财务单据对接.业务单据对接不同,易对接的审批流对接产品是指:业务单据在业务系统中生成,推送企业微信进行审批流程处理,然后返回审批结果到业务系统. 本文中的设计原型简单介绍:在金蝶云星空K3 Clou ...

  3. 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件,我公司用的企业微信.然后业务销售部那边需要每天统计销售数据报表然后发在群里(我是开发,我不配在群里).知道这个背景以后,产品给我们的需求是:直接统计数 ...

  4. 做不好这一点,企业微信运营可能要全“白搭”!【企业微信增长神器Vol.1】

    搞客户池运营,最头疼的环节可能不是怎么加人,而是加了几千几万人之后如何有效地管理. 关于好友管理,我们可以给企业微信上的客户手动打上标签,但这样做实在耗时间,如果能更简单点该多好-- 我们同时在销售防 ...

  5. 微信企业支付发送到零钱

    微信企业支付发送到零钱 企业微信付款到零钱,是微信提供的一个支付接口. 一下是代码的具体实现 前置条件 已开通微信应用(服务号或者小程序),主要用到APPID+OPENID 已开通微信商户,并且开通企 ...

  6. 微信提现——企业付款到零钱demo(超详细小白都看得懂的)

    一.p12证书下载 企业付款到零钱API (建议多看) apiclient_cert.p12证书:在微信商户平台–>账户设置–>API安全–>证书中下载的 . (自行下载) 二.开发 ...

  7. 微信零钱数据在服务器,关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案...

    前言: 最近做了一个通过调用微信企业付款到用户零钱的功能,真的挺奇怪的,在我本地调试的时候都没有问题,但是当我发布到服务上的时候却一直无法读取到我的证书信息.读取的代码如下,使用的是微信官方文档提供的 ...

  8. 微信支付、微信企业付款到零钱工具类

    微信支付.微信企业付款到零钱工具类 主要依赖:apache httpclient 4.5 jdk1.8 工具类主要功能: xml参数拼接 签名算法实现 post加密请求 import lombok.e ...

  9. Python实现微信企业付款到零钱

    实现步骤 一.导入库 二.参数配置 三.参数签名 四.发起转账请求 五.调用实例 一.导入库 import random import hashlib import requests from xml ...

  10. 企业支付 开通 企业付款到零钱 开通条件 已解决

    今天两个小程序,一个可以正常体现到零钱, 一个小程序不支持, 配置和代码都一样, 为什么不可以,结果一查找是因为,没有入住够90天,且必须30天有正常交易. 才可以正常使用企业付款到零钱. 代码提示 ...

最新文章

  1. mysql中文乱码问题的解决方案
  2. java项目配置常见问题
  3. 计算机在音乐教学的应用论文开题报告,音乐教育论文开题报告(范文详解)
  4. 重塑技术引擎 阿里落地全球最大规模云原生实践支撑双11
  5. 《Android开发从零开始》——29.Content Providers(1)
  6. (转) 假如女人是一种编程语言
  7. 感谢前任程序员赏饭吃!
  8. 海淀区第九届单片机竞赛获奖名单_第十二届程序设计竞赛暨ACM选拔赛获奖名单...
  9. 脱离极域电子教室软件控制策略(实测有效)
  10. 小米4 miui6 android,小米4 rom刷机包 4.10.11(MIUI6) 官方最新版
  11. Git以及Githup的使用
  12. Python+Django开发游戏充值管理后台
  13. Elastic控制查询精准度-minimum_should_match
  14. win10外接屏显示分辨率不匹配问题解决
  15. 解决Github不能下载,下载速度慢的小妙招
  16. 漫游计算机英语,计算机系统漫游
  17. 计算机辅助医疗未来展望,数字骨科应用与展望:更精确、个性、直观的未来前景...
  18. perf part II
  19. 中国民生银行天眼日志平台架构演进的平凡之路
  20. java线程池介绍(一)

热门文章

  1. 12.4 Borüvka算法
  2. 操写一盒酥三字于盒上
  3. 批量webp格式转换成jpg操作方法
  4. LBS服务LevelUp推二维码支付产品
  5. 扫描QR码即可完成移动支付的LevelUp推出集合NFC、QR码等技术的移动支付终端,供商家免费使用 | 36氪
  6. win10java怎么打开_图文传授win10如何打开java控制面板的解决本领
  7. C#实现QQ窗体的步骤和总结
  8. php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
  9. 以太网卡、IB网卡的详细介绍以及区别分析
  10. rtl8201以太网卡调试