グローバルにサービスを提供している場合、商品・サービスを日本円以外の通貨で購入・契約してもらうケースが発生します。
Stripeでは、顧客に応じた通貨で決済したのち、アカウントオーナーの設定した通貨に両替してから入金を行います。
為替レートに影響されない価格をグローバルに設定する方法
上記の方法では、顧客への請求金額または売上高が為替レートに影響されます。
このリスクを避けるため、「日本円では1,000円、アメリカドルでは7USD」のように複数の価格を設定することがあります。
Stripeでは、このような通貨ごとの値段設定もノーコード・API両方で可能です。
複数の通貨で価格を設定する
サブスクリプションや請求書では、事前に商品と価格をStripeに登録します。
料金を登録する際、[価格]フィールドの下部に[通貨を選択してください]が表示されます。
ここで価格を設定したい通貨を選びましょう。
現時点での為替レートを参考に価格を設定する
通貨を選択すると、すでに数字が入力された状態でフィールドが追加されます。
これは現在の為替レートに応じてStripeが自動で価格を提案する機能です。
ただし提案のために為替レートを利用しているだけのため、為替レートに応じて価格が変わることはない点にご注意ください。
設定する金額が決まれば、通貨ごとのフィールドを更新しましょう。
Taxの設定(外税・内税)もお忘れなく
Taxを有効化している場合、登録する料金が外税・内税どちらかを指定します。
これは[価格に税金を含める]チェックボックスのオンオフだけで設定できます。
APIで価格を登録する方法
APIから登録する場合、Prices APIを利用します。
日本円で700円かつ7USD, 7EURで月額のサブスクリプションを提供したい場合、以下のようなコードを使います。
const price = await stripe.prices.create({
product: 'prod_xxxx',
currency: 'jpy',
unit_amount: 7,
currency_options: {
usd: {
unit_amount: 700,
},
eur: {
unit_amount: 700,
}
},
recurring: {
interval: 'month'
}
})
currency_options
パラメータに、[通貨単位(英字3文字)]: Price
形式でデータを登録します。
段階的な料金(tiers
)や顧客が金額を変更できる料金custom_unit_amount
もサポートしています。
通貨によって単位が異なることに注意!
日本円では設定した数値がそのまま円になります。が、ドルなどの一部通貨では、100倍した数値を設定する必要があります。
ドルの場合、最小単位がドルではなくセントで設定されています。
そのため、日本円と同じ数値を入力すると、セントで換算されてしまい、金額が1/100になります。
設定した料金は、料金詳細ページから確認可能
商品ページなどでは、デフォルトの通貨で設定した価格のみ表示されます。
その他の通貨については、ダッシュボードの価格詳細ページにある[通貨]セクションを確認しましょう。
Checkoutで通貨別料金を確認する
設定した通貨別価格を、実際に決済画面で使用してみましょう。
Stripe Checkoutを利用する場合、セッション作成時のパラメータにcurrency
オプションを追加します。
const session = await stripe.checkout.sessions.create({
line_items: [{
price: 'price_1xxxxx',
quantity: 1
}, {
price: 'price_1xxxx',
quantity: 1
}],
+ currency: 'usd',
mode: 'subscription',
success_url: 'https://example.com',
cancel_url: 'https://example.com',
})
通貨を指定すると、line_items
で指定した料金に設定された通貨別価格が決済ページに表示されます。
注意1: 設定していない通貨は指定できません
料金に登録されていない通貨を指定すると、以下のようなエラーが発生します。
The price specified supports currencies of `eur`, `usd`, `jpy` which doesn't include the expected currency of `cad`.
注意2: 2022/09時点では、1顧客に複数通貨のサブスクリプションは設定できません
すでに日本円でサブスクリプションを開始している顧客では、USDやEURのサブスクリプションを開始することは現状できません。
そのため、異なる通貨のサブスクリプションを開始するためのCheckoutセッションを作ろうとすると、以下のエラーが発生します。
You cannot combine currencies on a single customer. This customer has had a subscription, coupon, or invoice item with currency jpy
設定した通貨別料金をAPIから取得する
Checkoutを利用せず、独自のUIを構築したい場合には、Price APIからデータを取得します。
ただし、デフォルトのレスポンスにはcurrency_options
は含まれていません。
currency_options
を取得するには、expand
を指定します。
const price = await stripe.prices.retrieve('price_xxx', {
expand: ['currency_options']
})
Lookup Key / Search APIを利用している場合
Lookup keyやSearch APIで料金データを取得している場合、expand
の値が少し変わります。
const prices = await stripe.prices.list({
lookup_keys: ['multi_currency'],
expand: ['data.currency_options']
})
[PR] Stripe開発者向け情報をQiitaにて配信中!
- [Stripe Updates]:開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)
など、Stripeを利用してオンラインビジネスを始める方法について週に2〜3本ペースで更新中です。