问题:第一次调用非常OK,看到了微信支付界面,有自己生成的订单号还有金额,但是放弃支付后再进入,就连微信客户端都调用不起来了,换个订单也是这样,换个手机也是第一单可以调用微信客户端,展示订单号,金额,但是第二单说什么也不行了,定格在自己APP的支付界面,不报错,任何反应也没有。
解决方案见
申请以后你看到的就是图片上的应用签名,这个签名是如何生成的在这里有介绍:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
问题是这个Key的生成是跟正式发布时打包做签名有关的,我们把Android应用公开release的时候会将这个Key加进去作为应用的key防止被恶意覆盖等等,我们在申请注册微信应用的时候必然要提供正式生成的这个应用的Key给微信官网。
因此这件事就被忽略了,以至于在开发的过程中,我们在自己的本地运行打包,访问微信服务器调起支付的时候,微信第一次拿到了我们的应用发来的请求,仿佛建立了连接开始了心跳,这时微信会异步地根据留存的应用包名和应用Key与你现在发送的包名和应用Key进行验证,我相信即使你第一次进行付款,也是很有可能不成功的,但是这块我就没有验证了,因为这个时候已经有验证结果回调回来了。
所以跟运维人员拿了Release时把Key打到APK安装包里的命令,进行包含正式Key的打包,命令如下:
cordova build --release android
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA1 -keystore E:\android-release-key.keystore E:\项目名称\platforms\android\build\outputs\apk\android-release-unsigned.apk android-release-key.keystore
//运行完这条命令需要输入密码
zipalign -v 4 E:\项目名称\platforms\android\build\outputs\apk\android-release-unsigned.apk a.apk
问题就解决了。每次访问都能顺利地调用微信支付了。
不得不感慨下,微信用这一手也严格控制了在他那里注册的应用,注册一个Key用一个,再想用,那么重新走流程吧。
————————————————
微信支付第一次成功,其它支付不成功,可能的原因有:
1:订单号重复,这个重新生成一个订单号就可以了。
2:项目包名不对(包名必须与微信开发者平台上的一致,详情见参考链接)。
3:APP的应用签名不对,这个着重讲一下哈(在这里我被坑了一个大跟头,请大家尽量避免)。
(注:APK签名步骤分为两步,首先通过keytool生成用来签名的 xxx.keystore,再用jarsigner签名apk文件)
Android签名用keytool和jarsigner制作apk文件https://www.cnblogs.com/linn/p/3784363.html
Android签名用keytool和jarsigner制作apk文件
生成证书 keytool -genkey -alias aeo_android.keystore -keyalg RSA -validity 20000 -keystore aeo_android.keystore 签名 jarsigner.exe -verbose -keystore aeo_android.keystore -signedjar soccer-release.apk soccer-release-unsigned.apk aeo_android.keystore 验证签名 jarsigner.exe -verify soccer-release.apk
备注 同样的程序发布过程,在同事的机器上(JDK 1.6)签名后可以正常安装,但是在我机器上(JDK 1.7)签名后安装说签名错误无法安装。 找到了解决的办法,需要在签名程序 jarsigner 增加如下参数 -digestalg SHA1 -sigalg MD5withRSA https://github.com/mobileresearch/weibo_android_sdk/blob/master/app_signatures.apk 另外微博和微信的app校验签名工具,实际对比的是程序签名和包名,包名在AndroidManifest.xml: package=""
jarsigner -verbose -keystore feelyou.keystore -storepass feelyou.info -signedjar signed.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk feelyou
解释:
1、-keystore feelyou.keystore:指定需要使用的签名文件,直接写文件名说明在当前目录下,否则请自行指定具体路径
2、-storepass feelyou.info:自动输入密码,keystore的密码和alias的密码都是我用的都是feelyou.info
3、-signedjar signed.apk:指定签名后的文件存储路径,这里是说以signed.apk的文件名存在当前路径下
4、-digestalg SHA1 -sigalg MD5withRSA:这就是必须加上的参数,如果你是jdk 1.6也不受影响
5、unsigned.apk:未签名的apk路径,这里是当前路径下的unsigned.apk文件
6、feelyou:最后这个是alias