条纹结账价格错误 - 无效整数

24

我有一个 Stripe 账户,并正在使用测试 API 密钥。

我创建了一个计划,包含以下信息 -

{
  "amount": 995, 
  "created": 1418800758, 
  "currency": "usd", 
  "id": "c06e1791-1c6a-45fe-9c26-8f0c07dda967", 
  "interval": "month", 
  "interval_count": 1, 
  "livemode": false, 
  "metadata": {}, 
  "name": "Pro2", 
  "object": "plan", 
  "statement_description": null, 
  "statement_descriptor": null, 
  "trial_period_days": null
}

我在我的项目中使用checkout.js。在所有数据填写完毕并点击支付以上计划时,它会引发一个错误:“Invalid Integer 994.999999999”。

我试过$9.94、$9.96、$29.95和其他数值,都没有出现这个错误。

这是一个 checkout 的 bug 还是与我的设置有关?

错误的屏幕截图 -

Stripe error message

可以重现此错误的 jsfiddle - http://jsfiddle.net/f30z9uc6/2/


错误具体发生在哪里? 是在创建令牌时的Stripe结账还是在服务器上创建付款或订阅时? 能否分享您的代码? 您是否尝试计算金额,然后可能出现了四舍五入误差问题? - koopajah
错误发生在创建令牌之前的结账过程中。价格是静态的,从Stripe计划中获取。 - torment32
1
金额 995 的工作方式如此显示:http://jsfiddle.net/4ykh2dh7/,肯定还有其他问题。你能否提供一个出现此问题的URL?你一定有某些解析价格并将 data-amount 设置为错误值的东西。 - koopajah
@koopajah 我能够在 jsfiddle 上重现这个错误 - http://jsfiddle.net/f30z9uc6/2/ - torment32
4个回答

42

问题在于JavaScript中的浮点错误。如果您查看此jsfiddle的更新版本,您将看到正在发生的事情以及我如何修复它。您需要对计算结果进行四舍五入以确保最终得到整数:

var amount = Math.round(9.95*100); // gives 995

要了解有关 JavaScript 和浮点算术的更多信息,您应该查阅The Floating-Point Guide


7
如果有人需要,在Stripe金额方面,这对我很有用。 如果需要,可以像这样使用: Math.round(TotalPrice.toFixed(2)*100) - Matthew Bennett
3
"四舍五入会使价格金额中的正负号改变吗,@MatthewBennett?" - codemilan
是的和不是的。我的意思是,你可能会损失十分之一美分,但这似乎并不重要。如果有必要,你总可以四舍五入。 - koopajah
到目前为止,@codemilan,似乎一切正常,至少我检查过的所有价格都是如此。Stripe最近出现了几个小数错误,但我认为这与其他事情有关,而不是这段代码。 - Matthew Bennett
@MatthewBennett 这是一个完美的解决方案,谢谢您。 - Mars2024

4

在将变量发送到strip之前,您需要将其舍入到最多2位小数。这样它才能起作用。

为什么? 因为Stripe会将您的值乘以100,结果必须是整数,否则您将收到错误消息。


3
如果货币是美元,那么价值以分为单位而非美元计算。例如:2代表2分,50代表50分。显然如此。

0

在将值传递到后端之前,我在Stripe帐户中遇到了相同的问题,只需将您的值从对象转换为简单整数即可解决此问题,如下所示:

enter code here

 const TotalItems = data
 .map(function(item) {
  return item.total;
})
.reduce(function(curval, newval) {
  return curval + newval;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接