PHP之重要业务的多接口调用
应用场景:
PHP实现转账功能, 扣款和充值是两个独立的接口, 用PHP先从A账户扣款, 然后往B账户充值.
实现方案:
1. 设计表.
两张表, 接口表(tb_interface): 记录接口调用的日志; 转帐表(tb_exchange): 记录转账过程.
2. 思路.
1) 生成扣款流水号. 调用扣款接口, 记录接口调用情况到接口表中.
a. 如果接口返回成功,进入第2)步;
b.如果接口返回失败, 用流水号查询扣款记录的状态, 如果有扣款成功的记录, 认为扣款成功进入第2)步;
c. 如果没有记录或者扣款记录的状态不是成功, 认为扣款失败, 重新生成扣款流水号, 重复扣款--接口返回判断的流程,
失败重试3次, 如果结果还是失败, 认为转账失败, 进入第4)步.
2) 生成充值流水号. 调用充值接口, 记录接口调用情况到接口表中.
a. 接口返回成功, 进入第3)步;
b. 如果接口返回失败, 用流水号查询充值记录的状态, 如果有充值成功的记录, 认为充值成功进入第3)步;
c. 如果没有成功的记录, 本次充值失败. 重新生成充值流水号, 重复充值--接口返回判断的流程,
失败重试3次, 如果结果还是失败, 认为转账失败, 进入第5)步.
3) 转账成功, 记录相关信息到转账表中, 退出操作;
4) 转账失败, 退出操作. 后续操作: 只需要检查失败原因即可.
5) 转账失败, 退出操作. 后续操作: 需要给B账户充值(业务失败); 检查失败原因.
3. 总结.
过程: 1)和2)
结果: 3) 4) 5)
结果3)是最理想的,
结果4)是可以接受的, 虽然没有成功, 但是不需要额外的操作;
结果5)是应该极力避免的, 每次都需要额外的操作来解决产生的问题.
如何避免结果5)呢, 可以把步骤2)中的一些逻辑判断放在步骤1)来做; 最关键的还是检查步骤2)失败的主要原因.
4. 备注.
这样的场景, 在某种情况下是一个事务处理的场景: 要么都成功, 要么都失败.