Reputation: 253
I have a stripe account and am using the test API keys.
I have created a Plan with following info -
{
"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
}
I'm using checkout.js in my project. Once all the data is filled and we click on pay for the above plan, it raises an error 'Invalid Integer 994.999999999'.
This error is not raised for the $9.94, $9.96, $29.95 and other values tried by me.
Is this a checkout bug or something to do with my settings ??
Screenshot of the error -
jsfiddle reproducing the error - http://jsfiddle.net/f30z9uc6/2/
Upvotes: 25
Views: 26727
Reputation: 100070
If currency is USD, the value is in cents not dollars, so 2, is 2 cents, 50, is 50 cents. Evidently.
Upvotes: 4
Reputation: 1
i was getting the same issue in stripe account before passing the value to the backend just convert your value from object to the simple integer like this
enter code here
const TotalItems = data
.map(function(item) {
return item.total;
})
.reduce(function(curval, newval) {
return curval + newval;
});
Upvotes: 0
Reputation: 354
Before you send the variable to strip you have to round to max. 2 decimals. So it will work.
Why? Because Stripe multiplies your value with 100 and the result has to be an integer - otherwise you get the error message.
Upvotes: 4
Reputation: 25572
The problem here is a floating point error in Javascript. If you look at this updated version of your jsfiddle you'll see what's happening and how I fixed it. You need to round the result of your calculation to ensure you end up with an integer:
var amount = Math.round(9.95*100); // gives 995
To read more about Javascript and floating point arithmetic you should look into The Floating-Point Guide
Upvotes: 43