做到微信支付的时候都会吐槽一下他的返回错误码-1,简直是迷之存在

android 微信支付返回商家 微信支付返回码_微信

虽然他的解决方案已经说明了多种可能原因,但是我们也很难定位到哪里。下面说下自己遇到的问题以及排查步骤,以便后面再遇到快速解决。

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跑起来的应用,通过签名工具获取的签名,这个签名主要用于自己调试的时候;一个是大正式签名包后,装上应用通过签名工具获取的签名,这个签名是上线的时候用到的。)

把自己调试的时候的签名配置到微信开放平台,步骤如下

android 微信支付返回商家 微信支付返回码_支付_02


点进修改去修改应用签名

android 微信支付返回商家 微信支付返回码_微信_03


这个应用签名要跟手机安装的签名工具拿到的签名一致(这里手动输入进来),可以保存到文本中备用。


3、应用签名没有问题了,仍然返回-1的话,就需要去验证下后台返回的预支付订单信息以及sign是否匹配了。比如说返回的预支付订单信息是如下json

android 微信支付返回商家 微信支付返回码_android 微信支付返回商家_04


不同公司的后台返回的key的名称可能不同,没关系,只要字段对应就OK。打开微信的验签工具https://pay.weixin.qq.com/wiki/tools/signverify/,选择自定义接口如下

android 微信支付返回商家 微信支付返回码_-1_05


android 微信支付返回商家 微信支付返回码_android 微信支付返回商家_06


将预支付订单信息按key-value加入到参数中,填入商户key应该是商户秘钥,然后生成签名,微信验签工具会在下面自动生成一个sign值,这个值与后台返回的预支付订单中的sign对比

android 微信支付返回商家 微信支付返回码_android 微信支付返回商家_04


如果一致,证明后台生成的签名是OK的,如果不一致,那就是后台生成签名是的规则有问题,找后台协调解决。


4、如果还是不幸sign一致,返回结果仍然是-1,那就需要检查代码了,我是这样一步步检查的

android 微信支付返回商家 微信支付返回码_-1_08

5、如果还是-1,那简直就是要撞墙了(我遇到的就是还是-1),这时候我就去找到ios同事,看他们是否可以支付成功,如果他们能成功的话,就再按上面步骤仔细走一遍,如果他们也不成功并且上面步骤走过了一遍没问题,那么百分之八九十是后台配置问题了。

IOS排查问题很简单,不像Android,他们没有应用签名这一说,他们只需要把demo中的预支付订单信息,配到自己工程中运行,可以调起支付就是代码OK,后台问题。

然后后台、移动端一起联调排除问题。

Ps:我遇到的就是后台配置出了问题,很难找到问题点,然后IOS和Android都不能调起,但IOS可以运行demo,所以定位到后台,果然他们的签名规则跟官方的规则有出入,最后解决搞定。