找回密码
 立即注册

QQ登录

只需一步,快速开始

微信公众号开发资源

关注:848

所属分类: 微信开发 微信公众号开发资源

本版块为微信公众号开发教程与公众号开发相关技术分享板块,技术提问请到其他对应的问答板块发帖:)

[公众号开发博客] 微信支付开发中的“坑”与解决之道

[复制链接]
查看: 3327|回复: 6
最佳答案
0 

7

主题

11

帖子

171

积分

新人求带

积分
171
 楼主| 发表于 2016-5-20 17:37:30 | 显示全部楼层 |阅读模式
微信支付是腾讯公司的支付业务品牌,它提供公众号支付、扫码支付、APP支付、刷卡支付等支付方式,并且还提供代金券、现金红包、企业付款等营销工具。微信支付结合微信公众号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,是移动支付的首选。

2013年8月5日,微信5.0版本引入了微信支付功能。2015年6月1日,腾讯发布了“2015微信用户数据报告”,报告称微信支付用户数达到4亿左右,可见微信支付的发展速度非常惊人。

我有幸于2013年6月微信支付内测期间就开始接触微信支付开发,亲眼见证了微信支付的每一次成长。在此期间,有许多初学者向我咨询微信支付开发。今天,我就来吐槽一下微信支付开发中的各种“坑”。

V2和V3差异大

微信支付接口现在分为V2版和V3版,2014年9月10日之前申请的为V2版,之后申请的为V3版。这两个版本在功能和接口上都有很大差别,不能互用,开发时要特别注意这一点,否则可能会走很多弯路。

开发文档混乱

微信公众平台开发者文档位于http://mp.weixin.qq.com/wiki/,相信大家都比较熟悉,然而有意思的是,这里面唯独没有微信支付的接口文档。微信支付的接口文档要登录微信公众平台才能看得到,如图1所示。
56499f68876d1.jpg

噢,原来藏在这里,也不算难找嘛!然而,仔细观察会发现这里没有代金券、现金红包、企业付款等接口的说明。如果要查看所有的微信支付接口文档,需要去微信支付商户平台,访问地址为https://pay.weixin.qq.com/wiki/doc/api/index.html,如图2所示。
56499fc132f01.jpg

签名算法

为了保证数据安全,微信支付要求所有发送或接收的数据都必须经过签名,相信不少开发者都在签名算法上吃过亏。下面是生成签名时的一些注意事项和经验分享。

【参数按字典序排序】

需要特别注意的是,参数名严格区分大小写,并且值为空的参数不参与签名。最让我记忆犹新的是开发“收货地址共享接口”,调用接口需要传递的参数(appId、timeStamp和nonceStr)在签名时都必须小写。

至于参数按字典序排序,在Java中,可以采用SortedMap来实现,非常简便,不建议开发者自己实现排序算法。

【MD5和SHA1算法】

在微信支付相关的接口中,“收货地址共享接口”使用SHA1算法进行签名,除此之外的其他接口都使用MD5算法进行签名。对于大多数开发者而言,编写SHA1和MD5算法是有一定难度的,虽然最终的实现代码只有几行。

在Java中,可以采用Apache Commons Codec工具包来实现标准的MD5和SHA-1,示例代码如下:
  1. String source = "签名测试";
  2. String md5 = DigestUtils.md5Hex(source);
  3. System.out.println("md5签名结果:" + md5);
  4. String sha1 = DigestUtils.sha1Hex(source);
  5. System.out.println("sha1签名结果:" + sha1);
复制代码

说明:运行以上示例需要在工程中引入jar包commons-codec-1.9.jar。

另外,需要注意的是,在“收货地址共享接口”中,官方给出的SHA1签名示例的结果是错误的,这估计误导了很多开多者,让他们误以为自己的签名算法有误。官方示例如下
5649a080f1457.jpg

经我测试,上述示例中SHA1签名后的正确结果为:
5649a0b951698.jpg

双向证书

首先,我们来简单认识一下SSL证书、单向认证和双向认证。

SSL证书是由受信任的数字证书颁发机构CA(如GlobalSign,WoSign),在验证服务器身份后颁发的,具有服务器身份验证和数据传输加密的功能。单向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,而服务器端不对客户端证书进行校验。双向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,服务器端也需要验证客户端证书的合法性。

在微信支付开发中,申请退款、发放现金红包、发放裂变红包等接口需要用到商户证书,微信服务器会验证商户证书的合法性。API证书文件可按以下路径下载:
5649a1b65f428.jpg

下载到API证书之后,该如何在程序中使用呢?这就需要使用KeyManagerFactory类和KeyStore类,在程序中设定客户端使用的证书。核心代码如下:
  1. // 证书文件(微信商户平台-账户设置-API安全-API证书-下载证书)
  2. String keyStorePath = "D:/apiclient_cert.p12";
  3. // 证书密码(默认为商户ID)
  4. String password = WxPayUtil.partner;
  5. // 实例化密钥库
  6. KeyStore ks = KeyStore.getInstance("PKCS12");  
  7. // 获得密钥库文件流
  8. FileInputStream fis = new FileInputStream(keyStorePath);  
  9. // 加载密钥库
  10. ks.load(fis, password.toCharArray());
  11. // 关闭密钥库文件流
  12. fis.close();

  13. // 实例化密钥库
  14. KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());  
  15. // 初始化密钥工厂
  16. kmf.init(ks, password.toCharArray());

  17. // 创建SSLContext
  18. SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
  19. sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
  20. // 获取SSLSocketFactory对象
  21. SSLSocketFactory ssf = sslContext.getSocketFactory();

  22. URL url = new URL(requestUrl);
  23. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  24. conn.setRequestMethod(requestMethod);
  25. // 设置当前实例使用的SSLSocketFactory
  26. conn.setSSLSocketFactory(ssf);
  27. conn.setDoOutput(true);
  28. conn.setDoInput(true);
  29. conn.connect();
复制代码

希望本篇文章能够帮助开发者顺利避开微信支付开发的各种“坑”,快速掌握微信支付接口的使用。
回复

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-2 04:48:07 | 显示全部楼层
9秒真不错什么都有
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 22:01:14 | 显示全部楼层
看看,谢谢分享
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-7 22:14:08 | 显示全部楼层
感谢分享
回复

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-8 00:07:05 | 显示全部楼层
我想要看看
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4682

帖子

50

积分

新人求带

积分
50
发表于 2018-5-8 00:10:28 | 显示全部楼层
看下哦,好像挺好的。。。。。
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

1

帖子

30

积分

等待验证会员

积分
30
发表于 2019-2-24 08:39:43 | 显示全部楼层
32225669_201902231437510865297877.png

32225669_201902231438270896689297.png


32225669_201902231439090959580808.png


32225669_201902231451370756739065.png


32225669_201902231503100084845495.png

32225669_201902231503370834290238.png

32225669_201902232016230855776896.png

32225669_201902221312490515767718.jpg



回复 支持 反对

使用道具 举报

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

本版积分规则



www.henkuai.com—微信开发者的分享交流平台,专注微信开发生态。

天津市滨海新区
中新生态城中成大道生态建设公寓9号楼3层301

微信公众号

广告推广
QQ:805874290

市场合作
zhongcong@henkuai.com