报文里的 DE49 放的是数字码不是字母码,而小数位决定了金额怎么读。下面还有个换算器。
| 字母码 | 数字码 DE49 | 小数位 | 名称 |
|---|
第一,DE49 放的是数字码。报文里写的是 392 不是 JPY,是 840 不是 USD。做内部系统映射时把两者搞混,会导致币种识别错误,而这种错误往往要到对账才暴露。
第二,金额是最小货币单位的整数。报文里的 DE4 没有小数点,000000012345 是多少取决于币种:美元是 123.45,日元是 12345,科威特第纳尔是 12.345。
金额 × 100 写死。一笔 5,000 日元这么发出去,字段里是 500000,而日元零小数位——那就是 50 万日元,多了整整 100 倍,而且它会正常授权通过。反方向同样糟:科威特第纳尔除以 100,会少收 10 倍。两种错都是静默的,不报错、不触发校验,只有对账时才发现。维护一张「币种 → 小数位」的表,所有换算都走这张表,不要让字面量 100 出现在任何金额附近。上面的换算器可以用来核对你的实现算得对不对。
DE5(结算金额)、DE6(持卡人入账金额)以及 EMV 的 9F02 标签都遵循同一规则。而且跨境交易里,这三个金额的币种可能各不相同——分别看 DE49、DE50、DE51,别默认它们一致。