1. 预提交流程
图一
略画小图有些简陋...
预提交目的是防止抓包篡改数据
web就是页面;
订单web对支付web传递支付参数不安全;
所以采用后台token方式进行传递;
2. 支付流程
图二
问题
- 支付回调接口中,产生延迟通知?如何解决支付状态不一致问题
- 重试支付回调接口时,如何保证回调接口通知幂等性问题
- 支付金额与商品金额如果不一致时,如何处理
- 第三方支付平台如何与对接系统保证分布式事务问题
支付分布式事物问题(跨语言事物):图二的方式解决
采用CAP理论中的最终一致性 双方可以短暂一致性,但是最终一定实现一致性问题,柔性事务,采用通知补偿性。
同步回调(前台通知):第三方支付系统以浏览器重定向形式将支付结果给商户端
作用:提示给用户在银联支付系统中,已经支付成功。
异步回调(后台通知):第三方支付系统使用类似于HttpClient技术调用商户接口进行通知。
作用:将银联支付安全的形式发送给商户端,进行修改对应的订单状态。
注意:异步通知修改订单状态
支付回调中需要考虑的问题:
在网络延迟情况下,回调接口出现重试时,如何保证接口幂等性问题?
(全局id) 重试机制是间隔性。(采用雪花算法,通过静态代码块封装成单例模式)
在网络延迟情况下,第三方系统没有及时的将支付结果通知给商户端,存在支付状态不一致时,如何解决?
调用第三方系统主动查询支付状态
商户系统回调接口中,如果存在代码问题,或者是商户系统宕机,导致第三方支付系统一直在重试? 最后放弃重试 如何解决呢?
- 手动补偿机制+日志记录 主动调用第三方接口查询
- 写一个定时Job,每天定时检查数据
支付金额与商品金额如果不一致时,如何处理
在异步回调中,使用预支付金额与回调真实支付金额进行比对,如果不一致的话,说明该交易信息存在异常。
使用日志+对账核查。