是司机都要翻船的.
公众号支付涉及微信平台两个大类的接口,要在客户端最后调用出成功的微信支付界面真是一件不容易的事情.
JSAPI类接口:
1.wx.config
2.wx.chooseWXPay
支付类接口:
1.unifiedorder
2.notify
网上一堆的码工朋友被腾讯坑得不要不要地.现在想总结一下.
1.后台的配置一定要配置好:
1.1.公众号平台:配置好域名,IP白名单.
1.2.商户平台:授权目录配置,API-Key.一定要配置准确.
比如:调用以上JSSDK的页面地址为 http://.com/payaeixin/c.html
那么测试授权目录配置为 http://a.com/pay/weixin/,如果只是配置成 http://a.com/pay/将报以上错误.
1.3.手机微信端:微信程序需要拥有[悬浮窗权限].
2.API的签名一定要准确.参数数量,名称,顺序和加密算法,密钥都要准确.多使用签名工具校验一下.
2.1.参数的数量数一数就可以比较出来的.
2.2.参数的名称就要跟紧API文档了.
最典型的一个错误是:
使用wx.chooseWXPay,需要后台返回的参数列表中有timestamp,而后台生成该参数的值后,要签名,而签名用的名称是timeStamp.注意红色字符s和S.加上中间代码中的名称,那最起码要4个类似的名称了,一定要注意.
2.3.参数的顺序,耐心检查,或跟校验工具对比一下.
2.4.加密算法,我使用的是最新官方JAVA-SDK,默认使用的是HMACSHA256,而前台JSAPI要使用的是MD5,而如果配置useSandBox,则会有一堆奇怪的URL出来,这个我没空地追究了,想用一般的URL,又要用MD5,只能去改源码了.顺便再吐槽一下神奇的IWXPayDomain接口.config.getWXPayDomain().getDomain(config)-->自己使用自己作为参数调用自己的方法.
2.5.加密密钥,使用微信支付一定要使用商户平台的API-KEY,而不是公众号上的APP-SECRET.
2.6校验工具:
微信 JS 接口签名校验工具: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
微信支付接口签名校验工具: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
2.7完成的过程一共需要5次签名,分别是:
wx.config一次,生成JSAPI的sign.参数是:jsapi_ticket,noncestr,timestamp,使用SHA1加密
unifiedorder两次,生成请求一次,参数文档中要求必填的字段.校验返回值一次,如果足够信任,可以不校验返回结果.
wx.chooseWXPay一次,需要将unifiedorder返回的prepay_id连同签名.参数是:appId,timeStamp,nonceStr,package,signType.(注意这里使用的是微信的签名算法,即最后要拼接&key=API-KEY一起加密)
notify一次,用于校验通知信息是否正确.
3.API的参数理解要准确:
统一下单接口中:
终端IP | spbill_create_ip | 是 | String(16) | 123.12.12.123 | APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。 |
这个IP指的是用户端的IP.不是指服务器的IP,也不是指代理IP(如果你使用代理IP).理论上这是一个公网的IP地址,微信可用于二次验证,防止用一个IP请求下单,用另一个IP支付.
4.像腾讯鄙视安卓一样鄙视腾讯.最好是可以先用iphone手机进行调试,苹果手机对错误的提示是很友好的,一下就能看出具体错误了.
如果以上4点看一遍都没办法帮忙解决问题,最好看多两遍.还不行.我觉得最佳的选择是仔细地重写一次.