You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:45:58