多通貨決済の設定時に使えるパラメータ

##多通貨決済って何？

今日は Stripe でよくあるお問い合わせの中から、簡単だけど意外と使えるパラメータを幾つか書いてみたいと思います。

あまり最初は理解されない 130 以上の通貨で決済ができるって、ん？どういうこと？という方もいます。

例えば、日本で展開しているサービスやプロダクトを、他の国のお客さんが使いたい・買いたい、ということがよく起こります。そうすると、そのお客さんとしては、その国に適した通貨で表示されていた方がありがたいわけです。

##相手通貨に合わせて決済ができる
日本人である私が何か買いたいなー、とウェブサイトを徘徊し、欲しいものが見つかり、「よし買おう」と思ってクレカ決済画面へ行った際に、500 kr と書いてあったら、？？？　となる方が多いのではないでしょうか。kr はちなみに、Danish Krone (NOK)、Norwegian Krona (NOK)、Swedish Krona (SEK) のことを表せます。ちなみに、500 SEK が円でいうとどれくらいか調べると、だいたい 5,900 円くらいらしいです。なので、逆もまたしかりで、仮に英語で作った Website に日本国外からアクセスされ、買いたいという人がいた時に、円で表示されていても同じ気持ちになるはずです。

ですので、できれば相手に適した、もしくは少しでも馴染みのある通貨にしたい、というのが本音です。そんな時に、どうやって設定したら良いのだろうか。そんな問い合わせが最近増えています。

なお、少々補足をしますと、こちらの記事でも書いていただいておりますが、「25か国対応」と、「多通貨決済」は異なります。

>25 ヶ国に展開という意味につきましては、Stripeのアカウントを作成し、オンライン決済をしてビジネスをできる国数が25か国、という意味となります 
>http://akiyoko.hatenablog.jp/entry/2016/12/25/085750

akiyoko　さん素敵な記事をありがとうございます。

運用をする上で重要なことは、**日本の Stripe アカウントをお持ちの場合、どのような通貨で決済しても、Stripe が自動で外貨を両替し（両替手数料として、ミッドレートに 2% 上乗せする形で Stripe が両替し）、各ユーザさまの Stripe アカウントに登録されている日本の銀行に日本円で毎週お振込する**、ということです。

Stripe の仕組みのところでデベロッパーの皆様やビジネスサイドの方に負荷をかけなくてもいいように、できるだけシンプルになっています。

##Currency パラメータの使い方
Stripeでは、支払い（Charge）のリクエスト時に、`currency` というパラメータを用います。
決済フォームの情報でTokenを作成した後、Charge の Request を Post する際、`Currency` を 3 文字の [ISO code](https://support.stripe.com/questions/jp-which-currencies-does-stripe-support) の記載にのっとって指定します。

例えば、ある商品を **500 Swedish Krona (SEK)** での決済をしたいという場合は、以下のようになります。

```ruby:rb
# Chargeの作成
  charge = Stripe::Charge.create(
    :amount => 50000, # SEK は Cents 単位なので 100 倍表示の Integer
    :currency => "sek",
    :source => token,
    :description => "Product Name Test", # 領収書情報 (receipt) に表記
    :stament_descriptor => "Toku Shop Tokyo" # クレジットカードの明細表記
  )
rescue Stripe::CardError => e
  # カードが拒否された時
end
```

上記 2 行目のように `currency` を設定することで、エンドユーザが決済する通貨を設定することができます。

最後に、2つ以上の通貨で設定をしたいという場合には、円と外貨の対応テーブルを用意しておき、ユーザが選べるように通貨をスクロールできるようにしておくというのがオススメです。また、**IP アドレスなどで国を判別し、国によってデフォルト通貨を設定すること**もできます。

##通貨設定時によくある単位のトラブル

ここでよくいただくトラブルとしては、 _米国ドル（usd）で $10 のテスト決済をしたら、失敗してしまった_ という問い合わせです。以下のような例です。

```ruby:間違い
#... 省略
    :currency => "usd",
    :amount => 10,
#... 省略
```

これは小数点で通貨を表す通貨とそうではない非小数通貨の違いです。米国ドルやユーロなどの多くは、小数点を使いセント (cents) を表しますので、$10 としたい場合は `amount` を `1000` とする必要があります。さらに、失敗になった理由は、米国ドルでの決済最小金額は $0.5 ですが、それに達していないためにエラーとなります。（1度の決済最大額は8桁です。）

<img width="737" alt="Screen Shot charge error.png" src="https://qiita-image-store.s3.amazonaws.com/0/100362/018f2598-df4c-66f8-5305-d660521a709f.png">

ご参考までに、ダッシュボードの Log のページに上記のようにログに残ります。
https://dashboard.stripe.com/test/logs
（テスト環境なので、/test が入っております）

```ruby:正しい
#... 省略
    :currency => "usd",
    :amount => 1000,
#... 省略
```

日本円 (jpy) は非少数通貨ですので ¥1,000 とする場合は、`amount` は `1000`で OK です。 _1,000円の決済をしたはずなのに、100,000円となってしまって焦る_ という問い合わせもいただきますが、原因はここにあります。 

以上、参考になると幸いです。

##参考リンク

- Stripe で決済可能な通貨: https://support.stripe.com/questions/jp-which-currencies-does-stripe-support
- 通貨の単位の違いによる amount の設定: https://support.stripe.com/questions/jp-which-zero-decimal-currencies-does-stripe-support
- 決済の最小金額 (英語): https://support.stripe.com/questions/what-is-the-minimum-amount-i-can-charge-with-stripe
- API Reference: https://stripe.com/docs/api#create_charge-amount