您的位置  > 互联网

支付成功异步通知支付中心更新自身支付订单状态的方法

来源://p/.html

图为简化的订购流程。 首先,提交订单,然后付款。 支付时一般会经过支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)进行交互。 支付成功后,异步通知支付中心,支付中心更新自身支付订单状态,然后通知商家。 申请后,每个企业都会更新其订单状态。

这个过程中可能遇到的一个常见问题就是掉单,无论是因为超时没能收到回调通知,还是程序本身报错。 总之,由于种种原因,没有如期收到通知,后续也没有得到正确处理。 逻辑等会导致用户支付成功,但是服务器端的订单状态没有更新。 这时可能会出现投诉或者用户重复付费的情况。 推荐:

由③⑤引起的订单下降称为外部订单下降,由④⑥引起的订单下降称为内部订单下降。

为了防止订单被掉,可以这样做:

1. 付款订单中添加中间状态“付款中”。 同一个订单支付时,首先检查是否有状态为“正在支付”的支付流程。 当然,支付时必须加锁()。 支付完成后,支付流程状态更新时,将更改为“支付成功”状态。

2、支付中心需要定义一个超时时间(例如:30秒)。 如果在此时间范围内没有收到支付成功回调,则应调用该接口主动查询支付结果,例如每隔10秒、20秒、30秒查询一次。 如果在最大查询次数内没有找到结果,则应进行异常处理

3、支付中心收到支付结果后,将结果同步至业务系统。 可以发送MQ,也可以直接调用。 如果直接调用,必须重试(例如:Retry)

4、无论是支付中心还是业务应用,在接收支付结果通知时都必须考虑接口幂等性。 该消息仅被处理一次,其余的将被忽略。

5. 业务应用程序还应该随时间主动查询支付结果。

对于上面提到的超时主动查询,可以在发起支付时将这些支付订单放到一个表中,使用定时任务进行扫描

为了防止重复提交订单,可以这样处理:

创建订单时,利用订单信息计算哈希值来判断redis中是否存在key。 如果有key,则不允许重复提交。 如果没有,则生成一个新的key,放入redis中设置过期时间,然后创建订单。实际上,一段时间内不能重复相同的操作

附微信支付最佳实践:

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!

能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!