项目背景
最近我在为我公司优达学城的支付项目重构做准备,不可避免的需要对接支付宝和微信。
由于在调研和写demo的过程中,遇到了很多的问题,除了官方文档,网上的资料又十分稀缺(特别是对于Java, PHP和.Net以外的语言,因为没有官方提供的SDK,所有逻辑都要自己写,我使用的是Golang),因此写下此文愿能帮助到大家。如果有不正确和希望继续补充的地方也希望在评论中指出。
方案选定
对于web应用来说,我采用了微信扫码支付,支付宝电脑网站支付的方案。由于微信官方提供了两种扫码支付的方案,我选择第二种,因为这样就能和支付宝的的支付逻辑统一。
流程图
流程说明
- 用户下单。
服务器收到请求,生成唯一的订单号,并且带上接口要求的参数和签名,发送请求。
支付签名
- 发送请求
- 微信和支付宝要求的都是POST请求。文档没有直接说明是POST还是其他方法,我是通过阅读文档提供的demo的代码和源码知道的,在开发支付宝的时候我一直以为是GET请求,所有的参数都是param,导致我浪费了挺多时间。
- 微信的Post Body是xml格式,到统一下单的API,注意带上header
Content-Type: text/xml。 - 支付宝的POST Body是Form表单,我的测试是以
x-www-form-urlencoded的形式提交,能够获得正确的响应。
- 将支付供应商的返回的数据(支付宝是HTML代码;微信是二维码链接,需要根据链接内容生成二维码)在前端渲染显示给用户。
- 用户支付订单,然后用户的支付App会通知支付供应商的服务器。
- 用户支付成功,支付供应商会调用商户提供的回调API,通知用户是否支付成功。(如果支付失败,需要调用订单关闭接口)。
- 验证调用的请求是否合法,处理内部逻辑,并且返回对应的响应,支付供应商会根据响应决定是否再次发送回调请求。
- 如有需要,可以调用订单查询API,检查订单状态。
沙盒模式测试(重要)
- 支付宝的沙盒模式,你必须先下载支付宝提供的沙盒模式的App才能测试。还可以参考论坛上这篇《如何使用沙箱环境测试手机网站》。
- 微信的沙盒模式,必须按照验收文档的步骤来做。我有一段时间发现自己不管怎么样都无法测试成功,后面在一个地方看到,必须用验收文档的金额来测试,也就是3.01元。
付款金额单位差异(重要)
微信的单位是分,因此3.01元,提交的时候应该是301。我一直没注意这个,结果沙盒测试时候一直过不了。最后知道是这个原因的时候,我给自己灌了一瓶82年的可乐。我只能怪自己太年轻。
支付宝单位为元,精确到小数点后两位,取值范围[0.01,100000000]。
总结
- 在做支付开发的时候,先仔细阅读文档,想清楚步骤再开发。磨刀不误砍柴工。
- 支付宝和微信支付的开发团队如果看到这篇文章,希望能把文档再润色一下。文档不是给开发者设置障碍,而是提供帮助,让开发者快速完成开发。
小福利
在人工智能anywhere的时代,我们不希望若干年后的30岁是否要转行不再写代码,我们不希望纠结于40岁因为落伍而被时代淘汰。我们都希望过上自己喜欢的生活打王者去旅行。那就让我们一起来组队学习Google认证的机器学习,不再做代码的“搬运工”,能够把握未来的是现在的你。