现象:APP调用微信SDK支付返回“-1”。但是卸载微信再重新安装时,第一次可以正常调用微信并支付成功,但第二次以后不能调用支付一直返回“-1”。
排查过程
服务端:
A):统一下单接口正常下单, 证明签名,appid,mch_id, key参数配置是正常的。
B):统一下单返回的预付订单参数"prepay_id, nonce_str"返回给客户端调用
// 预付订单下单
$preOrderInfo = $this->preOrder($payload);
// 生成签名参数, 严格对比参数, 注:必需是"package"
$pay_request = [
'appid' => $payload['appid'],
'partnerid' => $payload['mch_id'],
'prepayid' => $preOrderInfo->prepay_id,
'timestamp' => strval(time()),
'noncestr' => $preOrderInfo->nonce_str,
'package' => 'Sign=WXPay',
];
$pay_request['sign'] = Support::generateSign($pay_request);
// 返回给安卓客户端packageValue,不参与签名。 因为package参数在安卓里是关键字,多加一个字段返回给安卓用
$pay_request['packageValue'] = 'Sign=WXPay';
return JsonResponse::create($pay_request);
C):因为第一次可以调用微信支付,我确定服务端返回给客户端的参数是没有问题的
客户端:
A): 客户端只有短短不到三十行代码,参数也是服务端给的,排除客户端问题
问题找出
https://developers.weixin.qq.com/community/pay/doc/000002156506e025554885e9051800
https://blog.csdn.net/ws1836300/article/details/53893102
原因:在设置安卓签名是设置错误,把证书指纹的MD5值,直接设置成签名了。正确的做法是用微信官方提供的签名生成工具。或者把证书指纹的MD5值所有的冒号去掉,英文全改为小写也可以,但是不推荐这样做。
总结:归根结底还是配置问题,除了服务端的配置,还有客户端配置,在开发之前再三确让配置问题