.NET中Stripe的UnitAmountDecimal处理AED货币转换异常问题
问题原因与解决方法
根本原因
Stripe API的金额字段要求传入对应货币最小单位的整数,而非主货币单位的小数:
- 阿联酋迪拉姆(AED)的最小单位是费尔(Fil),1 AED = 1000 Fil。
- 你直接传入了主货币单位的
22.3(即22.3 AED),但Stripe将其解析为最小单位的数值。如果代码中存在错误的倍数转换(比如误乘10而非1000),就会导致传入223 Fil,最终显示为223 / 1000 = 0.223 AED,这正好匹配你看到的结果。
正确实现方式
在.NET中,必须将主货币单位的decimal金额转换为最小单位的整数(long类型)后传入Stripe:
// 原始金额:22.3 AED decimal amountInAed = 22.3m; // 转换为费尔(Fil)的整数:22.3 * 1000 = 22300 long amountInFil = (long)(amountInAed * 1000); // 创建PaymentIntent时传入转换后的金额 var paymentIntentOptions = new PaymentIntentCreateOptions { Amount = amountInFil, Currency = "aed", // 其他必要参数(如付款方式类型等) }; var paymentIntentService = new PaymentIntentService(); PaymentIntent intent = paymentIntentService.Create(paymentIntentOptions);
关键注意事项
- 不同货币的最小单位进制不同:USD/EUR等是100进制(1单位=100分),AED/KWD等是1000进制(1单位=1000费尔/菲尔),务必根据目标货币调整转换倍数。
- 禁止直接将decimal类型的主货币金额传入Stripe的
Amount字段,因为SDK会自动截断小数部分,导致金额偏差。 - 若需验证转换正确性,可反向计算:Stripe返回的
Amount值除以对应进制,应等于原始主货币金额。
内容的提问来源于stack exchange,提问作者Ahmad Nour Al-Sabaggh
相关产品推荐
相关产品推荐

