Stripeで海外展開する際に気をつけるべき2つのポイント!

Stripe

はじめに

はじめまして。エンジニアの Ryo です。本記事では、オンライン決済サービス Stripe を用いて海外展開をご検討中のサービス提供者向けに、気をつけておくべき点を紹介します。

※こちらの記事は、すでに Stripe をサービスに導入しているという前提で作成されております。もし、Stripe を検討中でまだ導入されてない場合は、以下の記事で Stripe 導入のメリットや扱うデータの種類、実際にサービスでどのように利用されているかなどを紹介していますのでご参照ください。

Stripeを使った簡単なサブスク型課金サービスの作り方

Stripe を使った海外展開について

Stripe では、135 を超える通貨での支払い処理に対応しています。

弊社開発のサービス GROWI.cloud も、元々は日本円のみでしたが、海外展開としてフィリピンに向けたサービス展開の際に Stripe の力を借り、現地の通貨で商品を提供しています。

そのため、GROWI.cloud のフィリピンユーザーは現地通貨を日本円に換算する及び換算にかかる手数料を払わずしてサービスを利用できます。

気をつけるべきこと

上記のように Stripe を利用すれば幅広い通貨でサービスの商品を提供できます。

しかし、Stripe を利用し異なる通貨を取り入れる際に気をつけておくべきこともあります。

ここからは、実際に GROWI.cloud で第2の通貨を取り入れる際に陥ってしまった課題をもとに気をつけておくべき点を紹介します。

1. 現在契約中の商品の通貨と異なる商品には変更できない

Stripe ではトライアルも含め商品の契約が行われるとその契約主体に対しデフォルト通貨が設定されます。

上記のように、一度設定されたデフォルト通貨は変更ができないため現在契約中の通貨と異なる通貨の商品を購入する場合は、新しく契約主体(アカウント)を用意する必要があります。

2. 通貨の小数点以下の有無が設定する金額に影響する

Stripe で利用できる通貨では、小数点以下の有無によって設定する金額に際が生じます。

「通貨の小数点の有無」は、日本円で普段決済をしていると馴染みのないワードだと思いますので、
2,000円 で提供している商品をアメリカに 20 USD で展開する場合を例に説明します。

Stripe における USD は「小数点以下の有る通貨」となります。
厳密には、小数点以下2桁目を1の位として扱う通貨となります。

これは USD という通貨の最小単位であるセントに基づくものであり1 USD=100 セントとなるからです。

そのため、20 USD のつもりで amount に 20 を設定してしまうとその商品に設定される金額は 0.2 USD つまり 20 セントとなってしまいます。
なので、20 USD を設定するためには amount を 2000 に設定する必要があります。

小数点以下が存在する代表的な通貨

  • USD (米ドル)
  • EUR (ユーロ)
  • PHP (フィリピン・ペソ)

反対に日本円は「小数点以下の無い通貨」に振り分けられます。
小数点以下のない通貨の場合は、100 を掛けずに整数として金額を指定することができるため 2000 という数値をそのまま日本円の金額として商品に設定できます。

小数点以下が存在しない代表的な通貨

  • JPY (日本円)
  • KRW (大韓民国ウォン)

GROWI.cloud で行っているワークアラウンド

GROWI.cloud では日本円とフィリピン・ペソという「小数点以下の無い通貨」「小数点以下の有る通貨」が併存しています。

そのため、金額を表示する画面などでは以下のようなワークアラウンドを採用しています。

const CURRENCY_LIST = {
  JPY: 'jpy',
  PHP: 'php',
};

// 小数点以下のない通貨のリスト
const CURRENCY_WITHOUT_SUBUNIT_LIST = [
  CURRENCY_LIST.JPY, // 日本円
];
/**
 * 受け取った金額値を通貨の種類ごとに成形して返す
 *  例:2000 × JPY => ¥2,000
 *  例:2000 × PHP => ₱20.00
 * @param {number} amount
 * @param {string} currency
 * @returns {string}
 */
const getFormattedPrice = (amount, currency) => {
  if (amount == null || Number.isNaN(amount)) {
    return '-';
  }
  // 小数点以下がある通貨の場合
  if (!CURRENCY_WITHOUT_SUBUNIT_LIST.includes(currency)) {
    // 例:2000 × PHP => ₱20.00
    return priceFormat(currency).format(amount / 100);
  }

  // 例:2000 × JPY => ¥2,000
  return priceFormat(currency).format(amount);
};

このように、表示金額を小数点以下の有無によって 100 で割る割らないの切り分けを行っています。

おわりに

Stripe を利用して海外展開する際に気をつけておくべきことを紹介しました。

「通貨の小数点以下の有無」に関しては、GROWI.cloud で日本円でのみ商品を提供していた私たちも苦しめられました。

逆に今回紹介した点さえ注意しておけば、多くの通貨でサービスを提供することができるようになりますのでぜひ利用してみてください。

参考資料