Android App支付场景下的微信支付开发
集成支付宝支付用了两天,集成微信支付却用了一周。
看了大量的帖子学习,没有一个说微信文档写的好的,甚至很多建议向支付宝学习。
微信支付文档给我的感觉是东一块西一块,不连贯,而且在部分细节上甚至互相矛盾。
现在趁着头脑清醒,记录一下:
1.先从这个商户平台的开发指引开始看
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_2.shtml#part-6
2.再看这个API列表
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_3.shtml
我的程序用到了三个API:APP下单、APP调起支付、支付结果通知
- 对于下单API来说,简单发送POST请求是不行的,因为在接口规则文档里说了,所以请求必须设置http头
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml
Content-Type: application/json
Accept: application/json
只加入这两项还是不行,因为文档后面又说了,还需要设置User-Agent
设置了User-Agent还是不行,因为在接口规则-开发指南-签名生成文档里说了:微信支付API v3 要求商户对请求进行签名,并通过HTTP Authorization头来传递签名。
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml
所以请求头中一共含有四项信息。
我的服务器是Node,至于如何在node.js中生成签名以及解密参数,下面这个帖子给了我很大的帮助
https://blog.csdn.net/qq_39653624/article/details/125755335
- 对于调起支付API来说,要注意的是在开发指引文档中有提到:
调用API前,需要先向微信注册您的APPID
再就是要对调起支付的几个参数进行签名,签名方法同下单API中的签名方法是一样的。还有一点就是,APP的签名需与在微信开放平台创建APP时所填写的签名是一致的,不然调起不了支付,也收不到相关提示,我之前没有注意到这个问题,从坑里爬了很久才出来。
- 对于支付结果通知API来说,文档中说接收通知的uri必须是https开头才行,但经咨询微信支付客服,其称http开头的url也可以。这里我遇到了另外一个坑,我的http及https服务是通过express框架来提供的,但是支付成功后,接收到的结果通知消息完全看不懂是什么,咨询了微信支付客服,告诉我已经向我的接收地址正常发送了消息,网上几乎搜不到同类情况,我意识到可能是我自己的问题。经过尝试,最后通过创建最普通的httpsServer正常收到了消息,但express框架为什么不行,我还不知道原因。
var https = require('https')
收到的结果通知消息是需要解密的,解密的方式见上面csdn那个帖子就可以了。
收到结果通知后,要向微信服务器返回确认消息,支付宝支付只是返回success就可以了,但是微信支付却需要返回消息头才行。
res.writeHead(200)
res.end()
以上就是APP支付场景下的微信支付流程,几乎每天都会掉到一个坑里,但幸运的是第二天又能奇迹般的爬出来,真是太不容易了。