微信支付仅能成功调用一次的问题
2017-03-16 11:04
134 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
本人使用Android开发有一段时间了,但是本身没有系统学,而且多年专注服务端开发,总觉得因为项目需要接触Android移动端开发只是暂时的,所以没有太上心,结果碰到一个大难题折腾了一天,最后被有经验的小伙伴提示了一下才迎刃而解,感觉无地自容的同时,又非常窃喜,毕竟跨过一个一个的坎,就成长了,在这里丢人等换个地方就成牛了也未可知,哈哈。闲言就絮叨到这里,赶紧分享:
微信支付调用接口整体的流程有必要简述一下(目前网上的资料大部分都是适配微信支付旧版的代码,最新的微信支付官方文档中并没有服务端的Demo,而且一些接口都变了,参数名称也有变化,希望小伙伴们能够注意):
微信支付不需要访问获取Token那个接口了;
直接访问https://api.mch.weixin.qq.com/pay/unifiedorder 获得Prepayid,参数以 xml格式传输就可以;
有了Prepayid再加上一些其他的官网中提到的参数就可以调起客户端的微信支付接口了;
此时就出现问题了:第一次调用非常OK,看到了微信支付界面,有自己生成的订单号还有金额,但是放弃支付后再进入,就连微信客户端都调用不起来了,换个订单也是这样,换个手机也是第一单可以调用微信客户端,展示订单号,金额,但是第二单说什么也不行了,定格在自己APP的支付界面,不报错,任何反应也没有。
原因就出现在这里:
我们申请微信支付的时候,有个地方会让你填写你的应用Key:
申请以后你看到的就是图片上的应用签名,这个签名是如何生成的在这里有介绍:
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的打包,命令如下:
2
3
4
1
2
3
4
[/code]
问题就解决了。每次访问都能顺利地调用微信支付了。
不得不感慨下,微信用这一手也严格控制了在他那里注册的应用,注册一个Key用一个,再想用,那么重新走流程吧。
本人使用Android开发有一段时间了,但是本身没有系统学,而且多年专注服务端开发,总觉得因为项目需要接触Android移动端开发只是暂时的,所以没有太上心,结果碰到一个大难题折腾了一天,最后被有经验的小伙伴提示了一下才迎刃而解,感觉无地自容的同时,又非常窃喜,毕竟跨过一个一个的坎,就成长了,在这里丢人等换个地方就成牛了也未可知,哈哈。闲言就絮叨到这里,赶紧分享:
微信支付调用接口整体的流程有必要简述一下(目前网上的资料大部分都是适配微信支付旧版的代码,最新的微信支付官方文档中并没有服务端的Demo,而且一些接口都变了,参数名称也有变化,希望小伙伴们能够注意):
微信支付不需要访问获取Token那个接口了;
直接访问https://api.mch.weixin.qq.com/pay/unifiedorder 获得Prepayid,参数以 xml格式传输就可以;
有了Prepayid再加上一些其他的官网中提到的参数就可以调起客户端的微信支付接口了;
此时就出现问题了:第一次调用非常OK,看到了微信支付界面,有自己生成的订单号还有金额,但是放弃支付后再进入,就连微信客户端都调用不起来了,换个订单也是这样,换个手机也是第一单可以调用微信客户端,展示订单号,金额,但是第二单说什么也不行了,定格在自己APP的支付界面,不报错,任何反应也没有。
原因就出现在这里:
我们申请微信支付的时候,有个地方会让你填写你的应用Key:
申请以后你看到的就是图片上的应用签名,这个签名是如何生成的在这里有介绍:
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.apk1
2
3
4
1
2
3
4
[/code]
问题就解决了。每次访问都能顺利地调用微信支付了。
不得不感慨下,微信用这一手也严格控制了在他那里注册的应用,注册一个Key用一个,再想用,那么重新走流程吧。
相关文章推荐
- 微信支付仅能成功调用一次的问题
- 微信支付仅能成功调用一次问题的解决方法(Android)
- 微信支付集成第一次调用支付界面成功,以后调不起来支付界面返回-1,等微信支付问题。
- 第一次调微信支付正常弹出支付页面并成功支付了,再次调用时就支付异常,换个微信账号又能调用一次
- CSDN上下载的一些关于Android程序调用Webservice运行不成功的问题
- Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题
- 关于32位和64位部署出现C#调用动态库DLL不成功的问题
- mysql存储过程一次连接多次调用失败的问题解决
- js在html文件中调用ActiveXObject对象成功,在jsp页面调用错误问题
- ODBC测试成功,调用失败的问题。
- webservice发布问题,部署iis后调用不成功
- js在html文件中调用ActiveXObject对象成功,在jsp页面调用错误问题
- ShareSDK微信支付成功不调用onResp、openURL、handleOpenURL等方法
- 关于微信支付IWXAPIEventHandler接口中onresp不能调用的问题
- 调用微信支付遇到的问题
- 使用LitePalFramework/LitePal,调用save方法,数据插入不成功的细节问题
- android webview onJsAlert只调用一次的问题
- MOSS服务器场迁移1-有关切换登录用户时需要刷新一次才能成功的问题
- android webview onJsAlert只调用一次的问题
- 微信支付调用和支付成功后的跳转