发布于 

聚合支付下单流程

最近在写一个聚合支付的系统,支付宝比较好掌控,可是微信支付却有着一大堆的问题亟需解决。

微信支付

微信支付除了需要传订单信息,还需要传递当前支付用户的openid,这就导致了我们不能直接通过接口在服务器直接下单,只能自己构建“预下单”接口先在系统中进行预下单,然后在确定当前的支付对象,然后构建H5/小程序链接,在H5/小程序中获取用户openid,返回给后端进行绑定,然后进行下单支付。

对于小程序而言,获取用户的openid还是比较方便的,但是难题是怎么将订单信息与用户的openid相关联起来,同时在查询到openid之后要怎么进行下单里调用什么接口,我想这是我现在面临的难题吧!

于是,我决定把微信支付接口的调用分为以下的几个流程。

  • 用户下单
  • 服务器接收订单,返回订单对应的小程序链接
  • 首先验证订单的合法性(API调用凭据、用户金额、支付方式等)
  • 生成系统订单号
  • 将系统订单号(由服务端生成)、商户订单号、商品名称等相关信息存入数据库中
  • 返回带有订单号的小程序链接。
  • 用户扫描小程序码
  • 小程序app.js中首先获取用户的openid,ip等信息,并且存储到小程序的data中
  • 在orderPay的onload中获取订单号的信息,同时验证该订单是否已经被扫描或者支付过,此时服务端应做好查重处理
  • 用户点击支付,携带openid,订单号向服务器发起请求,获取支付信息,完成当前支付。
  • 用户支付
  • Adapay回调
  • 回调给客户网站

支付宝支付

支付宝支付就相对简单了,我们只需要直接生成支付宝链接传回给前端即可完成支付。

一码聚合支付

如果想做一码聚合支付的话,就要考虑到支付宝和微信等浏览器的鉴别问题。

可行的方法有以下几种:

  • 借助js完成识别,统统使用H5支付,需要做默认报错页面
  • 借助小程序绑定域名完成,域名不需要做默认页面
  • 两者结合

最终选择的是微信使用小程序域名跳转,支付宝采用H5跳转进行下单,这种方法需要制作非支付宝的默认的支付页面,这里就不再赘述了。

微信支付的改造

貌似微信支付不需要进行改造

支付宝的改造

这里采取和微信支付相同的策略,在链接中传递orderID,在浏览器识别到支付宝浏览器环境之后,模仿微信支付那样进行下单和其他操作。

  • 用户下单
  • 服务器接收订单,返回订单对应的链接
  • 首先验证订单的合法性(API调用凭据、用户金额、支付方式等)
  • 生成系统订单号
  • 将系统订单号(由服务端生成)、商户订单号、商品名称等相关信息存入数据库中
  • 返回带有订单号的链接
  • 用户扫描该链接对应的二维码
  • 浏览器UA判断
  • 跳转到支付宝对应的页面
  • 查询对应的订单信息,跳转支付宝支付页面
  • 用户支付
  • Adapay回调
  • 回调给客户网站

至此,支付流程可以跑的通了!