在我们设计银行动账交易的时候,经常会遇到这样的场景:一个支付交易发送到对应的支付平台系统进行扣款处理以后,返回成功到当前的系统,然后当前系统会做一些调用其他外部系统以及操作本地数据库的操作,比如调用其他外部系统的发送Email,并且发送Email之前还有调用一个Email合法性检查的外部接口,以及支付成功后将日志/交易记录写入到本地数据库等。
动帐交易:指的是开通网银的帐户在网上发生业务,包括支付转帐、内部转帐、转存、网上缴费、买卖基金和股票等等的交易行为。所有涉及到资金变动的交易,如转账汇款、买基金、买理财、网上支付、信用卡还款都是动账交易。
如果支付成功以后,执行调用其他外部系统或者写本地数据库报错了呢?这个时候如果返回报错信息给前端,提示用户发生错误,那用户会以为这一笔交易支付失败,很可能会再一次尝试支付造成重复支付/扣款,然后用户会受到短信提示或者自己查账时,会发现支付了两次,这个时候肯定会进行投诉,非常影响用户的体验。
通常我们在设计这类设计用户账务操作尤其是转账、支付这类动账交易时,都需要非常小心,因为一旦出现问题,往往都会造成大面积用户的账户交易异常,严重的甚至会被定性为“金融事故”,会被相关监管部门约谈甚至重罚。
那么遇到这类问题时应该怎么解决呢?
对于这类动账交易,我们在设计的时候需要特别关注扣款成功之后的操作,应该尽量简化这些操作,或者尽可能把这些操作放在扣款操作之前。实在无法提前的,则需要对一些具体情况做具体分析,以下我根据自身经验以及以往遇到过的一些问题,列出几种常见的情况和相应的处理方法仅供大家参考:
1.如果扣款之后可以做冲正,那扣款之后的所有报错,如果影响交易结果的,都需要增加冲正,冲正成功以后才能返回给前端提示交易失败,这样对用户是没有任何影响的。
2.如果没有冲正呢?那就尽可能把调用外部接口的操作设计成异步调用,或者对返回结果做判断,如果报错,则记录报错日志,但交易依然往下执行,最后还是要返回相应的扣款成功的提示给前端用户,以提示用户当前这笔交易扣款已经成功,以免发生重复扣款和客户投诉事件。
3.后台在记录完这类报错日志时,应该要有相应的告警提示给相关的运维人员,如果数据有异常时应该介入进行人工修复。
版权声明:除特殊说明,文章均为博主 去吐槽 原创文章,转载请注明原文出处。