起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19357|回复: 32

[分享] 微信支付中商户对个人用户付款案例

  [复制链接]

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
发表于 2016-7-14 22:37:25 | 显示全部楼层 |阅读模式
本帖最后由 wgs7909 于 2016-7-19 19:24 编辑

      随着微信支付的普及,越来越的APP要求支持微信支付。相信大多数开发者也碰到了这样的需求。百度了一下,大家用到最多的是微信支付中个人对商户的支付业务,而很少有人用到微信中商户对个人付款的业务。我最近就碰到了这样的需求,因为从来没有做过,所以只能查资料,可是百度到的资料很少,并且是过时的东西。又问了圈子里的高手,可是大家都没有做过。没办法只有硬着头皮自己拱吧!还好还好,功夫不负有心人啊!终于被我整明白了,现在得空,拿出来跟大家一起分享。
      首先给大家吃颗定心丸,所有的东西在你没有用过之前,它都是神秘的,当你用过之后,就会发现,也就那么回事。呵呵,开始正题吧!
      这是企业付款的文档地址,大家需要先仔细看两遍。https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1 (就算有我的指导,也建议大家先看文档,看文档能便于加深大家的理解)
      总体思路: 1、准备数据;2、把所有的参数连接成一个字符串,然后进行MD5,把MD5得到的一个字符串做为最后一个参;3、把微信提供的安全证,封装到要提交的数据;(商户证书获取方法:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3   4、通过JAVA程序向微信提供的接口POST数据。微信接口返回处理结果。
      1、准备数据:所谓的数据就是请求参数,有9个参数是必须的,详细说明见文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。下面我给大家提供我的示例代码。
                     
  1. //配置接口参数,以下是9个必须的参数。
  2.                         signParams.put("mch_appid", appid); // 微信分配的公众账号ID(企业号corpid即为此appId)
  3.                         signParams.put("mchid", mchid);// 微信支付分配的商户号
  4.                         signParams.put("nonce_str", uuid); // 随机字符串,不长于32位
  5.                         signParams.put("partner_trade_no", partner_trade_no); // 商户订单号,需保持唯一性
  6.                         signParams.put("openid", openid); // 商户appid下,某用户的openid
  7.                         signParams.put("check_name", "NO_CHECK"); // NO_CHECK:不校验真实姓名
  8.                                                                                                                 // FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
  9.                                                                                                                 // OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
  10.                         signParams.put("amount", amount); // 企业付款金额,单位为分
  11.                         signParams.put("desc", desc); // 企业付款操作说明信息。必填。
  12.                         signParams.put("spbill_create_ip", ip); // 调用接口的机器Ip地址
  13.                  
复制代码
注意map.put()中的key是死的写法,不能改。
      2、把所有的参数拼接成一个字符串,然后进行MD5运算,把得到的运算结果,做为签名参数,一起POST给接口。详细做法参考文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3
      3、为了提高程序的可用性,我把一些受微信影响,会变动的参数写到了配置文件里。配置文件和JAVA文件放在同一目录里就可以了。
           安全证书这一步是关键,微信为了提高接口的安全性,所以增加了安全证书,以保证资金的安全。JAVA里用到的证书是pkcs12格式,大家按照文档里的提示,去下载相关证书,然后放到自己指定的目录里就可以了。下面是获取证书,并发起POST请求的代码示例。

  1.                         // 获取证书,发送POST请求;
  2.                         KeyStore keyStore = KeyStore.getInstance("PKCS12");
  3.                         FileInputStream instream = new FileInputStream(new File(config.elementTextTrim("cert_path"))); // 从配置文件里读取证书的路径信息
  4.                         keyStore.load(instream, mchid.toCharArray());// 证书密码是商户ID
  5.                         instream.close();
  6.                         SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
  7.                         SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
  8.                         CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
  9.                         HttpPost httpost = new HttpPost(url); //发起POST请求
复制代码
4、向接口POST数据 ,获得返回结果。下面是我的示例代码。

  1.                         CloseableHttpResponse response = httpclient.execute(httpost);
  2.                         HttpEntity entity = response.getEntity();

  3.                         String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
  4.                         EntityUtils.consume(entity);
  5.                         // 把返回的字符串解释成DOM节点
  6.                         Document dom = DocumentHelper.parseText(jsonStr);
  7.                         Element root = dom.getRootElement();
  8.                         String returnCode = root.element("result_code").getText(); // 获取返回代码
  9.                         if (StringUtils.equals(returnCode, "SUCCESS")) { // 判断返回码为成功还是失败
  10.                                 String payment_no = root.element("payment_no").getText(); // 获取支付流水号
  11.                                 String payment_time = root.element("payment_time").getText(); // 获取支付时间
  12.                                 map.put("state", returnCode);
  13.                                 map.put("payment_no", payment_no);
  14.                                 map.put("payment_time", payment_time);
  15.                                 return map;
  16.                         } else {
  17.                                 String err_code = root.element("err_code").getText(); // 获取错误代码
  18.                                 String err_code_des = root.element("err_code_des").getText();// 获取错误描述
  19.                                 map.put("state", returnCode);// state
  20.                                 map.put("err_code", err_code);// err_code
  21.                                 map.put("err_code_des", err_code_des);// err_code_des
  22.                                 return map;
  23.                         }
复制代码
以上4步,就完成了微信企业付款的业务。

附件里有,需要用到的jar包和我的程序示例代码。喜欢拿来就用的伙伴只需要写写配置文件,下载了安全证书,我的程序就可以直接拿来用了。
有问题可以跟帖咨询。
欢迎大家共同学习,共同进步。






QQ截图20160714232714.png

微信企业支付.zip

1.87 MB, 下载次数: 1683

评分

参与人数 7威望 +155 收起 理由
kenminkajp + 10 很给力!
负暄 + 10 很给力!
liangyongfei + 50 很给力!
ysk007 + 15 很给力!
X5联盟帮扶部 + 40 赞赞赞!

查看全部评分

企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667

53

主题

267

帖子

896

积分

高级会员

Rank: 4

积分
896
QQ
发表于 2016-7-15 08:22:08 | 显示全部楼层
"所有的东西在你没有用过之前,它都是神秘的,当你用过之后,就会发现,也就那么回事。"
这句话说得好,先赞一个!

所有技术问题在我们程序员面前,都是纸老虎!
东莞相思鸟软件 专业X5开发团队 长期招收学徒 推荐工作
http://www.leiothrixsoft.com QQ:402807176
回复 支持 2 反对 0

使用道具 举报

5

主题

56

帖子

97

积分

初级会员

Rank: 2

积分
97
QQ
发表于 2016-7-15 00:20:16 | 显示全部楼层
这个好,得支持
欢迎加入WeX5微信运营技术QQ群 10479381(长期有效)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-7-15 07:43:14 | 显示全部楼层
牛逼
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复

使用道具 举报

16

主题

118

帖子

265

积分

中级会员

Rank: 3Rank: 3

积分
265
QQ
发表于 2016-7-15 08:02:25 | 显示全部楼层
赞一个!
回复

使用道具 举报

19

主题

76

帖子

195

积分

初级会员

Rank: 2

积分
195
QQ
发表于 2016-7-15 08:04:08 | 显示全部楼层
赞一个
回复

使用道具 举报

191

主题

688

帖子

3325

积分

论坛元老

Rank: 8Rank: 8

积分
3325
QQ
发表于 2016-7-15 08:05:40 | 显示全部楼层
强悍,顶一个
轻量化ERP--企业邦  网址:meiprocess.cn
qq:8269301
手机:13801998595
回复 支持 反对

使用道具 举报

718

主题

2841

帖子

5657

积分

论坛元老

Rank: 8Rank: 8

积分
5657
QQ
发表于 2016-7-15 08:17:22 | 显示全部楼层
支持分享
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复

使用道具 举报

73

主题

345

帖子

1695

积分

金牌会员

Rank: 6Rank: 6

积分
1695
QQ
发表于 2016-7-15 08:17:49 | 显示全部楼层
大爱,支持
回复

使用道具 举报

16

主题

94

帖子

351

积分

中级会员

Rank: 3Rank: 3

积分
351
QQ
发表于 2016-7-15 08:36:27 | 显示全部楼层
66666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-21 21:15 , Processed in 0.058770 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表