【资金安全铁律】
🍀出金第一铁律---------明确失败才失败 。 出金最怕失败,极易出现重复出款
反例:if(xx != SUCCESS) setPayStatus(FAIL);
正例:if(xx==FAIL) setPayStatus(FAIL);
🍀改支付状态必须基于明确的付款状态字段,而不是其他code甚至msg
擦亮眼睛,注意payStatus 与 code 的区别,别再傻傻分不清了。
反例:if(pingAnResponse.code == '404' && pingAnResponse.msg == '订单不存在') setPayStatus(FAIL);
正例:if(pingAnResponse.status == 'FAIL') setPayStatus(FAIL);
🍀下发同步请求,不能返回支付状态
下发同步请求接口,我们不能返回payStatus(正确姿势是响应体里不包含payStatus字段 / 实体对象里不能定义payStatus字段)
🍀终态时,状态不可再发生变更。日常维护中,如有,必须人为介入
反例1:将失败的订单置为成功
反例2:将成功的订单置为失败(杀头)
🍀支付状态在修改时,使用状态机控制
反例:update order set status='FAIL' where orderId='001'
正例:update order set status='FAIL' where orderId='001' and status='PAYING'
🍀异常非失败。
反例:try{ .. } catch (Exception e) { setPayStatus('FAIL'); }
正例:try{ .. } catch (Exception e) { log.error(e); }
🍀业务幂等
反例:下游通道重复回调,我们重复修改状态,重复记账。
正例:使用状态锁保证幂等,先判断订单是否为终态。