互联网支付金融

小探网页支付网关的架构设计与体验优化——以某企业支付平台为例

2017-08-31  本文已影响0人  phy25

开题

现在网络支付方式越来越发达,已经不可避免地开始与各类 IT 系统集成。在财务制度比较规范的地方,这类入账自然需要统一管理,资金不能随意流动。如果由各个业务系统自己去申请对接网络支付接口,自然是很难实现统一管理的,而且也麻烦。

因此,就需要一个统一的企业级支付平台作为中间层,来负责各业务系统与网络支付的对接。这样,不仅方便了财务数据的统一提取、账户对账,也使企业支付平台可以代表所有的业务系统与网络支付接口进行交互,业务系统不会接触到企业的网络支付总密钥,较为安全可控。

这样的例子其实我们天天见。例如 12306 的车票支付教育部考试中心的考试费支付,都采用了中间层,来接入多个网络支付平台。

此时,企业级支付平台的角色可以认为是一个代理,协助业务系统完成支付流,并保存相关数据。目前这类“代理”的架构并没有标准,所以实现起来会各有小差别。如何去定义企业级支付平台(下称企业层)和业务系统各自的角色,就会决定架构的实现方式,相应就会影响到支付业务的实现情况。

WePay 的实现思路

下面介绍一款已经在运行中的企业支付平台 WePay,其目前向上对接了微信企业号的微信支付接口,远期规划可加入其他网络支付的支持。

WePay 会给每个业务系统分配一个“子商户”,对应会有 ID 和密钥,也就意味着业务系统通过 WePay 实现的子商户进行支付请求,WePay 自己处理网络支付接口的密钥,应用系统只能借助 WePay 获取网络支付的结果信息。

WePay 当前的架构和支付流程

上图的流程目前其实工作得非常好。应用系统需要完成的工作很简单,生成应用端的订单信息并保存订单号,然后把订单信息一股脑前台 POST 给 WePay,WePay 的网页会帮应用系统实现支付过程,应用系统只管收支付结果就可以了。

在这里,WePay 的角色并不只是“代理”那么简单了,因为要帮应用系统实现支付流程,所以中间还得控制支付过程。我就暂且叫它做“富代理”吧。

为了更好地说明纯粹的“代理”是个什么情况,我假设了新的流程。这里业务系统会把 WePay 当作是网络支付的服务器,所以业务系统传给 WePay 的 ID 可以是自编号的子商户,WePay 把请求递交给网络支付的时候再用上网络支付统一的密钥。

WePay 如果变成一个纯粹的代理,会变成这个流程

代理与否,利弊明显。实际上现在基本上都是“富代理”的解决方案。

“富代理”角色可以多做这点判断

企业层需要做的事情多了,这样的角色定位下,每单支付业务系统该给企业层传多少参数呢?

根据内部公开资料得知,目前业务系统在创建支付订单时,需要传以下这些参数给这款 WePay 系统。我做了下分类:

实际上这一整套接口的参数内容,多是直接借鉴微信支付的参数来着的,反正就是转发参数,用现成的参数名也没啥问题。

但注意到 tradeType 这个参数了吗?实际上这个参数是微信支付用的。微信那边目前支持的值有 JSAPI(微信内浏览器)、NATIVE(用户扫码付款)、APP(手机应用)、MWEB(微信外手机浏览器)、MICROPAY*(商户条码付款),而 WePay 实现了 JSAPINATIVE,根据业务系统发的参数来返回给浏览器不同的界面。

那么,这个参数真的要靠业务系统来给定吗?

结论就是,这个 tradeType 应当做一下整合。鉴于JSAPINATIVEMWEB 这三种模式本质上都是网页支付,可以在 WePay 端整合为一个名字(如 HTML),再由 WePay 进行选择,而不应该让业务系统来选。如果业务系统还发了这三个串进来,就统一定向到新的 HTML 模式就好。至于 APPMICROPAY,现在这个系统似乎没有用到,这些方式就预留着空位就好。

支付中间层如何判断支付模式?

既然提出了这个解决方案,自然也得考虑,没有业务系统的任何数据,支付层能不能高效率地自行判断支付模式呢?当然是可以的。

支付中间层最麻烦的事情,莫过于在开始让用户支付前,就得先跟网络支付开好订单。而开订单的时候,就必须决定具体的支付模式。

有种稳妥的方法,就是通过前端来检查微信的 JSAPI 能不能用、有没有手机(微信),再来按需异步开订单。不过这样当然太麻烦了,所以靠粗暴的后端 User Agent 检查,就可以实现绝大多数情况下的正确及时判断了。

所以是:

EOF

说明:本文资料均来自公网公开资料,图是自己用这个画的,并没有透露什么机密。终于可以安心学习了 = =

本文采用知识共享“署名-非商业性使用 4.0”许可协议授权,如需额外授权请与本人联系。

上一篇下一篇

猜你喜欢

热点阅读