背景
现在随着支付方式的便捷,各种各样的APP都需要集成支付功能,国内主要的支付方式主要就是 微信支付 和 支付宝。
支付宝 集成比较方便,而且没什么坑,官方文档也比较完善这里暂且不谈。主要谈谈 微信支付 ,这个东西还是比较麻烦很少有一次性成功的,大多数都是在调起微信支付的时候返回 -1,然后去百度一大堆。
问题来源
Android端大多数情况是签名的问题,网上也能百度的,但这里还是记录一下。
-
1.检查APPID是否正确
-
2.支付能力申请开通
-
包名和应用签名
这里主要讲一下签名的问题,如果你用AS,你可以用AS生成,
Build -> Generate Signed APK -> Create new 填好参数即可生成。
打开cmd命令行工具进入.android 目录下输入 keytool -list -v -keystore 你的签名文件目录
然后输入你设置的密码就可以看到签名信息了
切记!微信填入的要去除冒号,字母全部小写
然后不能用调试的应用来测试微信支付,不然又是一个-1,调试默认用的是的debug.keystore ,要么你打个带签名的release包出来,但是这样很麻烦,不便于调试,所有,我们在调试的使用用我们自己的签名即可。
在build.gradle 文件 android{}下添加
signingConfigs {
release {
//将你的签名文件放在app目录下
storeFile file("keystore.jks")
storePassword "123456"
keyAlias "mucool"
keyPassword "123456"
// 满足下面两个条件时需要此配置
// 1. Gradle版本 >= 2.14.1
// 2. Android Gradle Plugin 版本 >= 2.2.0
// 作用是只使用旧版签名,禁用V2版签名模式
v2SigningEnabled false
}
}
buildTypes {
debug {
signingConfig signingConfigs.release
debuggable true
jniDebuggable false
minifyEnabled false
zipAlignEnabled false
proguardFile 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.release
debuggable false
jniDebuggable false
minifyEnabled true
zipAlignEnabled true
proguardFile 'proguard-rules.pro'
}
}
}
大功告成!!!
然鹅,有时候还是会返回-1,这就很尴尬啦!而且IOS还能跑通,这就更尴尬啦!
这个时候你就需要检查一下调起微信支付的参数是否正确啦!
PayReq req = new PayReq();
req.appId = App.PLUS_APP_ID;
req.partnerId = response.payResult().partnerId();
req.prepayId = response.payResult().prepayId();
req.packageValue = response.payResult().packageName();
req.nonceStr = response.payResult().nonceStr();
req.timeStamp = response.payResult().timeStamp();
req.sign = response.payResult().sign();
App.plusApi.sendReq(req);
在 uniapp 中一定要注意appid,要小写,不然后果就是IOS能调起,而Android调起返回-1。
配合后台检查后台填写的参数是否,大小写,商户ID,任何一个错都会返回-1.
最后总结一下,微信支付是真的坑,错误码太少,基本上碰到的都只有-1,根本不清楚是什么参数错误导致,所以比较难排查,但是一定要胆大心细,相对支付宝就很简单,错误码完善,移动端工作少。在工作中一定要耐得住寂寞才行,不要浮躁。