聚合支付下单流程
最近在写一个聚合支付的系统,支付宝比较好掌控,可是微信支付却有着一大堆的问题亟需解决。
微信支付
微信支付除了需要传订单信息,还需要传递当前支付用户的openid,这就导致了我们不能直接通过接口在服务器直接下单,只能自己构建“预下单”接口先在系统中进行预下单,然后在确定当前的支付对象,然后构建H5/小程序链接,在H5/小程序中获取用户openid,返回给后端进行绑定,然后进行下单支付。
对于小程序而言,获取用户的openid还是比较方便的,但是难题是怎么将订单信息与用户的openid相关联起来,同时在查询到openid之后要怎么进行下单里调用什么接口,我想这是我现在面临的难题吧!
于是,我决定把微信支付接口的调用分为以下的几个流程。
- 用户下单
- 服务器接收订单,返回订单对应的小程序链接
- 首先验证订单的合法性(API调用凭据、用户金额、支付方式等)
- 生成系统订单号
- 将系统订单号(由服务端生成)、商户订单号、商品名称等相关信息存入数据库中
- 返回带有订单号的小程序链接。
- 用户扫描小程序码
- 小程序app.js中首先获取用户的openid,ip等信息,并且存储到小程序的data中
- 在orderPay的onload中获取订单号的信息,同时验证该订单是否已经被扫描或者支付过,此时服务端应做好查重处理
- 用户点击支付,携带openid,订单号向服务器发起请求,获取支付信息,完成当前支付。
- 用户支付
- Adapay回调
- 回调给客户网站
支付宝支付
支付宝支付就相对简单了,我们只需要直接生成支付宝链接传回给前端即可完成支付。
一码聚合支付
如果想做一码聚合支付的话,就要考虑到支付宝和微信等浏览器的鉴别问题。
可行的方法有以下几种:
- 借助js完成识别,统统使用H5支付,需要做默认报错页面
- 借助小程序绑定域名完成,域名不需要做默认页面
- 两者结合
最终选择的是微信使用小程序域名跳转,支付宝采用H5跳转进行下单,这种方法需要制作非支付宝的默认的支付页面,这里就不再赘述了。
微信支付的改造
貌似微信支付不需要进行改造
支付宝的改造
这里采取和微信支付相同的策略,在链接中传递orderID,在浏览器识别到支付宝浏览器环境之后,模仿微信支付那样进行下单和其他操作。
- 用户下单
- 服务器接收订单,返回订单对应的链接
- 首先验证订单的合法性(API调用凭据、用户金额、支付方式等)
- 生成系统订单号
- 将系统订单号(由服务端生成)、商户订单号、商品名称等相关信息存入数据库中
- 返回带有订单号的链接
- 用户扫描该链接对应的二维码
- 浏览器UA判断
- 跳转到支付宝对应的页面
- 查询对应的订单信息,跳转支付宝支付页面
- 用户支付
- Adapay回调
- 回调给客户网站
至此,支付流程可以跑的通了!