周三凌晨两点,你的支付系统正在处理一笔订单。代码里写的是1000,客户卡上扣了10美元——本该是1000美元。这不是科幻场景,是支付集成里最经典的金额单位错误。
Prism是一个支付库,它的核心任务是解决一个看似简单的问题:钱到底怎么表示?这个问题之所以复杂,是因为每家支付处理商对"金额"都有自己的定义。有的要整数分,有的小数点后两位,有的干脆用字符串。这些格式都写在官方API文档里,但多样性本身就是陷阱。
![]()
手工写集成迟早会踩坑。可能不是今天,可能测试环境一切正常,但生产环境凌晨两点,真实客户的真实交易,一个零的差错就能让公司血亏。Prism把这类bug归为三类:
第一类是单位错配。处理商要的是1000(代表10.00美元),你发了10。客户被收0.1美元,一千笔交易下来损失9990美元。更糟的是反向错误:发100000意味着试图收1000美元,客户直接放弃支付,转化率崩盘,客服队列爆炸。
第二类是浮点精度。10.99加20.99在计算机里等于31.980000000000004,不是31.98。单笔误差微不足道,但成千上万笔交易累积下来,日终对账对不上,监管报表头疼,结算金额不匹配。
第三类是货币脱钩。"amount": 1000——这是10美元、1000日元,还是3.3万美元的科威特第纳尔?货币不跟金额绑死,一次API调用就能酿成大错。
Prism的解法是强制内聚:Money结构体把MinorUnit和Currency焊在一起,代码层面不允许拆开。MinorUnit本身是个64位有符号整数,但包装成命名类型,编译器会阻止你把它跟裸数字、浮点或字符串混淆。"最小单位"因货币而异:美元是分,欧元是欧分,日元没有子单位所以就是日元本身。同样一个1000,配上不同货币,实际价值天差地别——因为货币永远是上下文的一部分。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.