引言
随着平台业务的发展,资金安全是我们要坚守的底线。一旦出现资金损失,很有可能造成无法挽回的局面,甚至分分钟给干到公司倒闭、老板破产,砸锅卖铁也难平息客户的怒气,所以资损防控是结算行业的重中之重,必须重视。
那么什么是资损呢?
资损,也就是由于各种直接、间接原因导致的公司、客户产生了资金损失,比如应收的资金收不回、应付的资金超额付。
例如以下因为金额单位错误导致的资损案例。
小王在电商平台 FMall 开了一家店铺,小李用 5 块的券下单,再付 95 块买了一双定价 100 块的皮鞋,确认收货后平台开始结算。
交易系统推送订单,成交金额 100 元,其中平台优惠券 500 分。
清分系统开始分账
平台佣金10%,平台收入 100 * 10% = 10 元佣金收入
营销平台券 500 分,商户收入 500
商户最终收入 = 100 - 10 - 500 = -410 元
最终小王卖了一双鞋,赔了鞋子还要倒欠平台 410 块,果断骂娘跑路,这什么狗屁平台。
资损情况如下:
- 平台账面应收 410 元没收到
- 小王应收 100 元没收到
- 小王实际应付 10 元,系统应付 410 元,如果没跑路,这 400 也是资损
如何防控呢?
从事情发生的过程来分析,分为个阶段,分别是资损发生前,资损发生时,和资损发生后。其中资损发生前的过程是我们关注的重点,需要通过措施尽可能的避免资损的发生,而且此时介入的成本最低、影响最小。
切入点
事前重防
防,也就是提前预知、规避风险。
既然要预知和规避,那我们首先就要搞清楚资损发生的原因,我们先简单的归为系统原因、产品原因和安全原因三类。
原因
系统原因
主要是由于系统设计错误,代码bug,系统故障等技术相关的原因导致资损。
常见场景如下:
- 接口交互时搞错金额单位,传的是分,当成元用了,结果导致金额放大/缩小100倍。
- 系统间数据传输导致精度丢失,传的是小数点后10位,用的时候只用了2位。
- 代码bug,金额计算时加减乘除后没有记录结果或者没有设置精度,或者没按要求舍入。
- 系统并发没控制好,导致金额被覆盖。
- 接口没有幂等,导致付了两回。
- 接口没沟通好,把Result最外层的调用结果当成了业务执行结果。
产品原因
主要是产品设计本身有问题或者运营故障产生的资损。
常见场景如下:
- 支付宝补贴的故障,运营把转账也配成了支持国补,导致转账使用了补贴。
- 产品设计上不要求锁汇,汇率变动后导致资损。
安全原因
主要就是安全问题,比如被攻击、盗号导致的资损。
措施
常见的手段,就是按照资损原因,采取对应的措施。
技术措施
建立技术规约,在技术团队内推广和检查落地情况。
- 金额操作使用同一的Money类,禁止使用BigDecimal、int、long等数字类型进行金额运算
- 接口出入参在文档明确记录单位、精度,避免不同应用间因为歧义产生资损
- 接口做幂等和防重
- 针对不能重试的接口,禁止重试
- 上线前做CR确保规约执行到位
- 针对接入的系统,要求提供对账口径,确保数据有一致性的兜底方案
- 建立上线清单机制,上线前进行逐一检查核对,防止因为漏配、错配导致资损。
- 隔离环境,防止测试、验证数据污染生产系统。
- 对外部系统做review,防止因为流水号重用等原因造成资损。
- 接口考虑版本兼容。
- 针对重点case做自动化测试,确保覆盖到位。
产品措施
开发和测试同学往往因为行业知识不够,不能很好的识别资损bad case,这时候最好有专业的顾问来支持。
- 提供行业知识培训,帮助业务和技术同学提高业务技能
- 罗列资损点清单,针对清单逐一给出解决方案
- 建立资损bad case案例库,根据案例对系统做重点审查
- 建立预案,针对线上已经出现的资损,确保有快速可以操作的方案
有条件的还可以做资损演练,帮助团队提高资损防控能力。
安全措施
- 采用 https 替换 http
- 禁止明文存储密码、手机、卡号等敏感信息
- 接口加密通讯,通过签名和密文保障数据安全
- 关键系统管控,禁止外网登录
- 权限管控,敏感操作增加授权和审计日志,权限设置有效期
事中重控
事中主要是建设及时发现的能力。
- 建立对账能力,确保上下游数据一致
- 建立业务监控,确保数据同比环比波动在预期范围内
- 建立告警能力,通过微信、电话告警,责任到人
事后重补
也就是一旦发生,如何应急处理、补救。主要是对已经发生的资损,按照预案推进处理。
常见处理手段如下:
- 发现金额计算错误的,如果支持重算,就立马点重算
- 接口调用失败的,支持自动重试的,进行重试
- 不能重试的,记录异常,走功能接口修数据或者回滚、冲正
- 针对商户发生资损的,安排运营和客服进行安抚,赔偿。