如何做好在线支付功能?(1)

326 阅读4分钟

通常如我们一个电商网站系统,涉及到支付交易时,是非常核心的功能,一切业务最终结果都是为了支付交易获取利润,当这一块出现问题,那就白干了,那开发支付交易功能,需要注意哪些呢?我先讲解通常对接第三方交易是如何对接的。

图片  一、支付流程

如下屎黄色图,通常就是商户调用第三方支付接口,用户支付完成后同步返回一个成功,这个成功只是代表调用第三方的接口连通成功,但并不代表支付业务成功,支付真正是否成功,需要等待异步回调结果。

图片

但是,当异步回调失败时,怎么办呢。

图片  二、回调失败解决办法

微信支付官网有解决方案说明\

pay.weixin.qq.com/wiki/doc/ap…

图片

1)当回调接口异常,需要我们主动查询第三方的支付情况,就是一种补偿方案了。

2)但哪些订单的支付状态是需要我们主动去查询呢,用户创建了订单,也许他从来没有发起过支付请求,也有可能发起过支付请求但未支付,所以,这里需要增加一个中间状态,当只是生成订单时,订单的状态(非支付状态) 是如“待支付”,当发起订单支付请求时,支付状态状态是 “新建”, 且第三方同步结果是成功时,我们把订单的支付状态改成 “支付中”(因为第三方的同步状态并不代表支付的真正成功,需要等待异步回到结果) ,等异步结果或者主动查询支付记录返回支付结果为成功时再把我们平台的支付状态改成支付成功。

3)但可能用户会对同一个订单重复发起支付请求(当然如果你的业务禁止对同一订单发起多次支付时,那就简单很多了),我这里根据我们的业务情况多次发起支付请求时,当我们的支付状态“支付中” 状态的支付请求时(这里只是说明设计方案,如何处理防止重复数据的生成,后面有讲解),是否允许发起支付这里其实也最好去第三方查询下(通常通过生成的支付交易唯一号可以查询支付记录)支付结果是否成功,因为可能支付结果已是成功的但第三方支付成功回调通知告诉我们支付结果异常了。当主动去查询的支付结果是成功的,则肯定要禁止再次发起支付且提示支付成功,纠正商户支付状态。

4)当发起支付时如果查询的第三方支付结果是有支付记录但提示支付状态失败,这里就根据自己的业务情况,看是否需要创建新的发起支付,这里要注意的是,第三方支付每次发起支付通常需要我们传入一个交易号唯一值来锁定是否是同一个支付(这里比假设一个订单只允许一次全额支付),所以这里同一个订单的交易号我们需要重新生成,或者每个订单的交易号相同只是在交易号后面再加上一个版本号作为新的交易号来区分是哪次发起的支付。

5)如果发起请求时我们主动从第三方查询的结果是无交易记录,且我们的交易状态是“新建”,则发起支付请求,之后如果回调异常,我们在一定的时间之后,把这些我们这边支付中的支付状态结果去第三方主动去查询,到底查询多少次就看第三方是不是终态了,或者根据自己的业务需求来具体设计。

这里总结下:

图片

这里建议支付信息单独一张表,每次生成新的交易号,就生成一行数据包括交易号、订单号、交易状态等,而不要覆盖之前的支付信息

更多分享请关注我的公众号

更多内容,请关注公众号回复“如何做好在线支付功能2”