一、银联支付提交原理:
1、封装支付请求参数
2、将参数验证签名,以html表单形式提交给银联支付接口
以html表单提交有什么好处?
将方便提交参数
二、同步回调和异步回调通知
1、同步回调(前台通知):
第三方支付系统以浏览器重定向形式将支付结果给商户端
作用:提示给用户在银联支付系统中,已经支付成功。
2、异步回调(后台通知):
第三方支付系统使用类似于HttpClient技术调用商户接口进行通知。
作用:将银联支付安全的形式发送给商户端,进行修改对应的订单状态。
注意:异步通知是修改订单状态
思考问题:
1、在第三方支付平台(银联、支付宝、微信支付)支付结果是如何通知给商户端
第三方支付平台通过httpclient技术将支付结果异步通知给商户端
2、支付系统分布式式事物问题存在原因:
用户在银联系统中,支付完成之后,如何把结果通知给商户端:第三方支付平台通过httpclient技术将支付结果异步通知给商户端
3、 跨系统中如何解决分布式事物问题呢?
采用最终一致性问题 双方可以短暂不一致,但是最终一定实现一致性问题。采用通知补偿性
验证签名原理:MD5 加密加盐 不可逆
验证签名防止数据被篡改
加密是防止抓包获取明文的数据 可逆。
支付流程:
1、订单服务调用支付服务 生成支付令牌(userId、订单号码、支付金额)
2、订单服务获取支付令牌,在使用订单web传递Token形式跳转到支付web。
预提交待支付记录保证参数的安全问题。
将不同的接口执行地址存放到数据中,统一使用java反射机制执行方法。
整体实现流程:
- 支付服务需要提供创建支付接口 ,传递参数 userid、orderid、金额。
- 使用支付令牌查询支付交易信息
注意:订单id 支付id
整体实现流程:
- 支付服务需要提供创建支付接口 ,传递参数 userid、orderid、金额。
- 使用支付令牌查询支付交易信息
注意:订单id 支付id
四、分布式事务解决方案
LCN MQ 适合于内部系统实现服务指间分布式事务解决方案
如果产生跨平台之间分布式事务如何解决呢? 最终一致性概念
第三方系统中如何商户端没有及时响应状态码给第三方支付系统,这时候第三方系统采用补偿和重试机制。
支付回调中需要考虑的问题:
- 在网络延迟情况下,回调接口出现重试时,如何保证接口幂等性问题。
(全局id) 重试机制是间隔性。
- 在网络延迟情况下,第三方系统没有及时的将支付结果通知给商户端,存在支付状态不一致时,如何解决?
解决方案:调用第三方系统主动查询支付状态
- 商户系统回调接口中,如果存在代码问题,或者是商户系统宕机,导致第三方支付系统一直在重试? 最后放弃重试 如何解决呢?
- 手动补偿机制+日志记录 主动调用第三方接口查询
- 写一个定时Job,每天定时检查数据,主动调用第三方接口查询,修改状态码
4.支付金额与商品金额如果不一致时,如何处理
在异步回调中,使用预支付金额与回调真实支付金额进行比对,如果不一致的话,说明该交易信息存在异常。
使用日志+对账核查。
- 支付服务如何与其他系统保证分布式事务问题
采用第三方支付流程 实现补偿和重试机制遵循最终一致性 Base理论和CAP理论。
- 与内部系统中出现分布式事务问题
LCN、 MQ 、TCCC
相同点: 最终一致性问题。