做到微信支付的时候都会吐槽一下他的返回错误码-1,简直是迷之存在
虽然他的解决方案已经说明了多种可能原因,但是我们也很难定位到哪里。下面说下自己遇到的问题以及排查步骤,以便后面再遇到快速解决。
1、首先是WXPayEntryActivity这个微信提供的支付结果处理类,是否按照微信接口文档中的规则配置
public void onResp(BaseResp resp) {
LogUtil.d("onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
// resp.errCode== 0 :表示支付成功
// resp.errCode== -1 :表示支付失败
// resp.errCode== -2 :表示取消支付
这个方法中判断返回码,再决定下一步的操作。
2、返回码一直是-1,但就是不知道哪错了,可以先看下应用签名是否正确(应用签名会用到两个,一个是自己本地Run跑起来的应用,通过签名工具获取的签名,这个签名主要用于自己调试的时候;一个是大正式签名包后,装上应用通过签名工具获取的签名,这个签名是上线的时候用到的。)
把自己调试的时候的签名配置到微信开放平台,步骤如下
点进修改去修改应用签名
这个应用签名要跟手机安装的签名工具拿到的签名一致(这里手动输入进来),可以保存到文本中备用。
3、应用签名没有问题了,仍然返回-1的话,就需要去验证下后台返回的预支付订单信息以及sign是否匹配了。比如说返回的预支付订单信息是如下json
不同公司的后台返回的key的名称可能不同,没关系,只要字段对应就OK。打开微信的验签工具https://pay.weixin.qq.com/wiki/tools/signverify/,选择自定义接口如下
将预支付订单信息按key-value加入到参数中,填入商户key应该是商户秘钥,然后生成签名,微信验签工具会在下面自动生成一个sign值,这个值与后台返回的预支付订单中的sign对比
如果一致,证明后台生成的签名是OK的,如果不一致,那就是后台生成签名是的规则有问题,找后台协调解决。
4、如果还是不幸sign一致,返回结果仍然是-1,那就需要检查代码了,我是这样一步步检查的
5、如果还是-1,那简直就是要撞墙了(我遇到的就是还是-1),这时候我就去找到ios同事,看他们是否可以支付成功,如果他们能成功的话,就再按上面步骤仔细走一遍,如果他们也不成功并且上面步骤走过了一遍没问题,那么百分之八九十是后台配置问题了。
IOS排查问题很简单,不像Android,他们没有应用签名这一说,他们只需要把demo中的预支付订单信息,配到自己工程中运行,可以调起支付就是代码OK,后台问题。
然后后台、移动端一起联调排除问题。
Ps:我遇到的就是后台配置出了问题,很难找到问题点,然后IOS和Android都不能调起,但IOS可以运行demo,所以定位到后台,果然他们的签名规则跟官方的规则有出入,最后解决搞定。