一套能出租的支付系统,至少把三件事分开做。混在一个“支付成功”状态里,退款和隔日对账一定会乱。
收银台负责把方式摆对
收银台只展示这家商户已经开通、并且当前金额支持的方式。印度项目里,机构没开通的方式不要出现。用户看到的金额、币种和订单号,必须和下单请求里的一致。
异步通知负责把状态改对
用户浏览器跳回来,只能当提示,不能当唯一依据。订单状态以验过签的异步通知和随后的查单为准。机构会重试,所以同一条通知要能重复接收,而不能重复入账。验签失败的请求直接丢掉,并留下日志。
对账负责把钱和单对上
通知成功只说明机构承认这笔支付发生过。结算是否完成、手续费是多少,以对账文件和结算单为准。系统里这两列分开。对账要能列出长款和短款:文件里有、系统里没有,或者系统里有、文件里没有。
为什么要在一个系统里做
收银台、通知和对账如果分属三个程序,退款最容易对不齐:收银台生成了一个退款单号,通知程序不认识,对账文件又用了机构自己的退款号。租用或搭建时,我们会把这三个号在一笔订单上串起来,并写进验收用例。