StripeでJPY以外の決済通貨を指定する際の注意点


前置き

普段JPYしか使っていないと「…ん?」となる部分があったため書き残します。

やりたかったこと

$50(USD)で決済させたい。

起きた問題

こうしたら

<form action="" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="key"
    data-name="hoge"
    data-amount=50
    data-currency="USD">
  </script>
</form>

こうなった


$0.50 になっとる。。。。。

data-currencyでUSDを指定したところ、金額がamountで指定した数値の1/100になってしまいました。

原因

amountで指定した数値は、currencyで指定した通貨の最小単位(USDの場合はセント)の金額として適用されるようです。
これまでJPYしか使ってこなかったため、この仕様に気が付きませんでした。

API リクエストはすべて、金額が通貨の最小単位で指定されると想定しています。たとえば、10 USD を請求するには、amount の値を 1000 (1000 セント) で指定します。
小数点以下のない通貨の場合は、100 を掛けずに整数として金額を指定します。たとえば、500 円を請求するには、amount の値を 500 で指定します。
小数点以下のない通貨:
BIF, CLP, DJF, GNF, JPY, KMF, KRW, MGA, PYG, RWF, UGX, VND, VUV, XAF, XOF, XPF

対処法

amountを通貨の最小単位に揃えましょう。

<form action="" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="key"
    data-name="hoge"
    data-amount=5000
    data-currency="USD">
  </script>
</form>
$stripe->charges->create([
    'amount' => 5000,
    'currency' => 'USD',
    'source' => $token,
    'description' => 'description',
]);

結果


決済金額が $50.00 になりました🎉🎉