第三方支付接入(stripe为例)

  1. 开启交易会话
    1. 使用平台提供的私钥,向平台的创建交易会话的接口发起请求,生成一个交易链接,需要提供价格ID、商品数量、成功支付重定向链接、取消支付重定向链接等自定义参数
    2. 价格ID:价格在stripe中是一个概念实体,比如你有一个VIP服务商品,可以一次性开通一个月,也可以连续包月,那这个商品就有两个价格了,每个价格的单价与结算方式是不一样的,同时每个价格都有唯一的ID,即价格ID
  2. 事件监听
    【背景】用户的支付是在第三方平台完成的,对于我们服务端来说是无感知的,即你无法直接得知用户是否付完钱、哪个用户付了哪一笔钱。所以你需要向第三方平台订阅这个消息,这个订阅也叫做事件监听
    1. 创建服务端事件回调接口:当第三方平台想要向服务端发送消息时,就会把消息发送到事件回调接口,事件回调接口接收消息并正确处理消息(包括:将订单状态转为成功支付)
    2. 注册第三方事件监听:在第三方注册自己的回调接口以及需要触发回调的事件类型
    3. 事件成功监听:第三方与服务端会约定一个规则来确认是否服务端成功接收并处理事件,例如服务端成功接收并处理事件就返回200状态码
    4. 事件重发行为:由于网络环境复杂,不能确保发一次消息就能成功,所以一般第三方会有不断重发的行为逻辑,知道得到服务端的确认(例如:200状态码)
    5. 事件监听的不可信:不论是网络问题还是第三方平台服务崩溃问题,都有可能导致消息发送失败,并且支付可能有延迟完成的情况(比如银行走流程确认转帐什么的),所以第三方支付一般不保证事件实时发送给服务端
    6. 事件鉴权:与第三方约定好一个鉴权机制,确保请求事件监听回调接口的是第三方
  3. 最终方案
    1. 发起交易会话的同时,生成一个订单ID,与会话ID结合加密生成一个新ID
    2. 支付成功重定向的网址拿会话ID请求事件回调接口,事件回调接口发现无法通过strip的鉴权,认为是重定向的请求,此时向strip发起请求确认交易会话状态
    3. 为了防止支付成功并重定向那一刻服务端崩溃,以事件监听作为兜底机制
    4. strip请求事件回调接口,通过strip的鉴权,可以信任strip发来的事件状态,也可以不信任,重新向strip发起请求确认交易会话状态
    5. 总体采用状态机模式
    6. 确认订单状态,完成订单