美元付款验证失败:ERP 系统认的是 IBAN,不是收款账号
一笔付款在通过银行接口验证时报错**“无效账号”**,但付款系统这边核对下来,用的收款账号信息完全正确。奇怪的地方在于:这笔付款的收款方是美元账户,理应和”账号是否正确”这件事没什么好出错的空间。
两套系统,认的是两个不同的字段
排查后发现问题出在两套系统对”该用哪个字段做匹配”的理解不一致:
- 付款系统(Payment Engine) 这边,一直是用标准的**收款账号(Receiving Account)**字段去匹配银行记录;
- ERP 系统(SAP Business One) 这边,如果对应的业务伙伴主数据里同时填了 IBAN,会优先拿 IBAN 去匹配,而不是收款账号。
这笔美元付款出问题的账户,业务伙伴主数据里恰好被顺手填上了一个 IBAN 号码——而 IBAN(国际银行账号)这套编码体系,本来就只适用于使用 IBAN 的银行体系(比如欧元区),美元账户根本不该有这个字段。ERP 系统按自己的优先级规则去匹配这个不该存在的 IBAN,自然匹配不上,验证随之失败。
字段填错不会立刻报错,只会在恰好用到它的那一刻才暴露
修复
从 ERP 系统的业务伙伴主数据里,移除这个不该存在的 IBAN 字段——只保留标准的收款账号信息。移除后,ERP 系统没有了可以优先匹配的 IBAN,自然会回退到用收款账号匹配,验证问题随之解决。同时确认了适用范围:只有使用欧元、且银行本身要求 IBAN 的业务伙伴,才需要填写这个字段,其他币种的账户不应该被顺手带上这个信息。
教训
- 一个字段”能填”,不代表”应该填”——主数据维护时,图省事把看起来相关的字段都填上,看起来是在让数据更完整,但如果下游系统对某个字段的存在与否有隐含的优先级逻辑,多填的这个字段反而会在未来的某个时间点引发意料之外的错误;
- 两套系统对接时,“该用哪个字段做匹配”这件事需要显式确认,而不是假设默认一致——本例中付款系统和 ERP 系统对同一份业务伙伴数据,实际采用了不同的匹配优先级,这种差异如果没有被文档记录下来,出问题时几乎无法从表面报错直接看出根因;
- 排查”数据本身看起来是对的,但验证依然失败”这类问题时,值得检查一下是否存在其他字段,会在特定条件下抢占本该生效的那个字段的匹配优先权——本例的收款账号从头到尾都是对的,错的是另一个字段的存在本身。