项目背景
最近我在为我公司优达学城的支付项目重构作准备,不可避免的须要对接支付宝和微信。
因为在调研和写demo的过程当中,遇到了不少的问题,除了官方文档,网上的资料又十分稀缺(特别是对于Java, PHP和.Net之外的语言,由于没有官方提供的SDK,全部逻辑都要本身写,我使用的是Golang),所以写下此文愿能帮助到你们。若是有不正确和但愿继续补充的地方也但愿在评论中指出。php
方案选定
对于web应用来讲,我采用了微信扫码支付,支付宝电脑网站支付的方案。因为微信官方提供了两种扫码支付的方案,我选择第二种,由于这样就能和支付宝的的支付逻辑统一。前端
流程图
流程说明
- 用户下单。
服务器收到请求,生成惟一的订单号,而且带上接口要求的参数和签名,发送请求。git
支付签名github
- 微信支付签名我选择MD5,我相信MD5各个语言都支持并且都很方便,这里就不赘述。
支付宝签名推荐RSA2。这里写下Golang版本的核心签名方法。web
// 使用sha256
h := sha256.New()
h.Write(data)
d := h.Sum(nil)
sign := rsa.SignPKCS1v15(rand.Reader, r.PrivateKey, crypto.SHA256, d)复制代码
完整代码能够移步个人Gist。api
- 发送请求
- 微信和支付宝要求的都是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年的可乐。我只能怪本身太年轻。
bash
支付宝单位为元,精确到小数点后两位,取值范围[0.01,100000000]。服务器
总结
- 在作支付开发的时候,先仔细阅读文档,想清楚步骤再开发。磨刀不误砍柴工。
- 支付宝和微信支付的开发团队若是看到这篇文章,但愿能把文档再润色一下。文档不是给开发者设置障碍,而是提供帮助,让开发者快速完成开发。
小福利
在人工智能anywhere的时代,咱们不但愿若干年后的30岁是否要转行再也不写代码,咱们不但愿纠结于40岁由于落伍而被时代淘汰。咱们都但愿过上本身喜欢的生活打王者去旅行。那就让咱们一块儿来组队学习Google认证的机器学习,再也不作代码的“搬运工”,可以把握将来的是如今的你。
微信