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

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

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

需要注意的有三步:
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. Bitbucket Pipes发布,带来30+自动化CI/CD管道的方法
  2. 计划策略-40-最终装配计划
  3. 理解神经网络函数高频成分的收敛率界限
  4. 腾讯二面,我被 “赛马” 问题难住了
  5. c#使用CefSharp开发winform——环境搭建
  6. python if elif else
  7. Python捕捉命令输出、错误输出及赋值命令到变量的方法
  8. 请确保dx环境安装正常后进行开播_虎牙直播助手常见问题汇总
  9. GAMMA初学笔记一
  10. 33-Jenkins-修改插件源
  11. Node-RED使用指南:28:撤销与删除恢复
  12. db2 日期英式写法_英式与美式日期写法 基数与序数词辨析
  13. Proteus仿真-步进电机
  14. 机器学习-54-RL-06-Actor-Critic(强化学习-A2C,A3C,Pathwise Derivative Policy Gradient)
  15. 网络营销好学吗?自学和培训该怎么选?
  16. 《机器学习(周志华)》 习题5.5答案
  17. bootstrap-switch开关按钮表单插件
  18. SQLSERVER 集合处理——INTERSECT
  19. Multi-Object Tracking with Multiple Cues and Switcher-Aware Classification多目标跟踪论文
  20. html语音聊天室,h5聊天室模板|仿微信聊天室html5

热门文章

  1. Pandas里面的加权平均,我猜你不会用!
  2. 16. Segmentation
  3. 音视频篇 - Android 音视频涉及到的技术
  4. 传奇地图文件MapInfo参数大全
  5. 《高情商修炼手册》 by 小粥超人(小hi)Hygge @Chou
  6. Linux Mint系统常用软件安装
  7. 项目中 前后台接口 请求项目移植的问题
  8. easypanel php.ini,虚拟主机控制面板(easypanel)下载_虚拟主机控制面板(easypanel)官方下载-太平洋下载中心...
  9. win7打开chm文件显示“已取消到该网页导航”
  10. UI设计师面试时如何自我介绍