前段时间出去玩了一段时间,回公司得知一个惊天消息——微信支付出问题了!!!这个问题比较奇怪,说是部分机型可以支付成功,部分机型如小米、三星无法调起支付,返回-1。
众所周知返回-1的话代表了各种各样的错误(坑),所以只好从头开始排查,首先排查WXPayEntryActivity.java这个文件是否放在了.wxapi包下,及manifest里的注册是否为.wxapi.WXPayEntryActivity,确定无误后检查后台返回的参数是否有误
/**
* 请求app服务器得到的回调结果
*/
@Override
public void onGet(JSONObject jsonObject) {
if (mWxApi != null) {
PayReq req = new PayReq();
req.appId = WX_APPID;// 微信开放平台审核通过的应用APPID
try {
req.partnerId = jsonObject.getString("partnerid");// 微信支付分配的商户号
req.prepayId = jsonObject.getString("prepayid");// 预支付订单号,app服务器调用“统一下单”接口获取
req.nonceStr = jsonObject.getString("noncestr");// 随机字符串,不长于32位,服务器小哥会给咱生成
req.timeStamp = jsonObject.getString("timestamp");// 时间戳,app服务器小哥给出
req.packageValue = jsonObject.getString("package");// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值
req.sign = jsonObject.getString("sign");// 签名,服务器小哥给出,他会根据:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3指导得到这个
} catch (JSONException e) {
e.printStackTrace();
}
mWxApi.sendReq(req);
Log.d("发起微信支付申请");
}
}
至此如果都正确,可以开始着手检查在后台里的参数设置是否正确
微信支付后台设置
这里需要注意的是应用签名和应用包名,因为出问题的包不是由我打包的,我怀疑问题在于应用签名对不上,最后发现果然如此。打包的同事使用了另一个keystore文件进行打包,导致应用签名与后台填写的不一致,于是重新生成了签名更新后台设置,问题解决。
官方生成签名软件应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。签名工具下载地址
至于为什么部分机型可以正常支付,而部分机型无法调起,我参照有些coder遇到的问题“微信支付只能成功调起一次”
...我们在自己的本地运行打包,访问微信服务器调起支付的时候,微信第一次拿到了我们的应用发来的请求,仿佛建立了连接开始了心跳,这时微信会异步地根据留存的应用包名和应用Key与你现在发送的包名和应用Key进行验证,我相信即使你第一次进行付款,也是很有可能不成功的,但是这块我就没有验证了,因为这个时候已经有验证结果回调回来了。
参考文章链接
因为成功支付的机型为公司测试机,而不成功的机型是用户机,猜测因为公司测试机里曾经调试过微信支付,有正确的包名和签名的缓存,微信在调起时直接读取缓存值,验证正确后直接调起,而当缓存值出错时微信才会再次去读取新的包名和签名重新验证,因此出现了部分机型可支付的问题。也因为这个原因,修改完签名后再次调试,第一次返回的还是-1,但再次点击就可以成功调起,此后也没有再返回-1。个人猜测,如有错误欢迎指出讨论。
微信支付的坑实在是太多了,还有OC编写的iOS的IAP也有很多藏起来的坑,一直想把Unity内调用Java集成的微信、支付宝支付,使用OC集成的iOS内购详细过程写上来,但是一直犯懒。。这段时间一定要写好,给自己做个记录,也给大家作为一个参考。
网友评论