Stripeの各種API（ChargesとPayment Intents）について

Stripeでは、以下 3種類の支払い方法が提供されています。

- Stripe Checkout（[まとめはこちら](https://qiita.com/luigiii/items/c70630b5194406ca0e88)）
- Charges API
- Payment Intents API

ここでは、`Charges API`と`Payment Intents API`の違いと、それぞれいつ使うべきかをまとめています。
これらのAPIは自社サイトやiOS/Androidアプリに決済処理を組み込みたい場合に使います。
Stripeのページにリダイレクトさせて、もっと簡単に決済を実装したい場合は、[Stripe Checkout](https://qiita.com/luigiii/items/c70630b5194406ca0e88) の利用を検討してください。
 
# まとめ

[Charges vs. Payment Intents APIs](https://stripe.com/docs/payments/payment-intents/migration/charges) には
 
- `Payment Intents API`は、すべてのStripe製品と支払い方法を統合するAPIとして設計されました。
- `Chareges API`の廃止予定はありませんが、製品開発を`Payment Intents API`に集中して、これを中心的なAPIにする予定です。

と書かれており、「これから開発するなら`Payment Intents API`を使うんや〜」と思うかもしれませんが、[Transitioning to the Payment Methods API](https://stripe.com/docs/payments/payment-methods#transitioning) では

- `Payment Intents API`で使われる`Payment Methods API`は、`Charges API`で使われる`Tokens`や`Sources`を現時点で全て置き換えられるわけではない。
- 例えば、`Alipay`や`WeChat Pay`は`Charges API`を使わないと実装出来ない。

となっていることを踏まえると、目的を考えてAPIを選ぶ（場合によっては、両方のAPIを併用する）必要がありそうです。

[The Payment Intents API](https://stripe.com/docs/payments/payment-intents#overview) でも、双方の違いについて触れられていますが、上記に加えて以下のような（※一部抜粋）内容になっています。

- `Charges API`は、追加で認証が不要な基本的な支払いに使える（※アメリカとカナダのケースが書かれていますが、ヨーロッパと比較して、認証面がゆるい、ということだと思います）
- `Payment Intents API`は、`Strong Customer Authentication (SCA)`などの要件があるときには必須となります。  

よって、日本の現状を鑑みると、以下のような判断になるかと思います。

- `Charges API`しか対応していない支払い方法（`Alipay`や`WeChat Pay`など）を実装する場合は、`Charges API`。
- `Payment Intents API`しか対応していない支払い方法（`Apple Pay`、`Google Pay`など）を実装する場合は、`Payment Intents API`。
  - 尚、これらは`Charges API`を使っても実装可能かもしれませんが、Stripeのドキュメントでは`Payment Intents API`を使ったものしかありませんでした。
- どちらも対応しているものは、`Payment Intents API`。

# Charges API と Payment Intents API の違い

[参照先: Charges vs. Payment Intents APIs](https://stripe.com/docs/payments/payment-intents/migration/charges#understanding-the-stripe-payment-apis)

| CHARGES API        | PAYMENT INTENTS API |
|:-------------------|:--------------------|
| カード決済の簡単な導入を希望する主に米国/カナダの顧客を持つ企業に推奨 | 複数の支払い方法と認証を必要とする企業に必要 （例：ヨーロッパでの強力な顧客認証のため） |
| Web, iOS, Androidで利用可能 | 左記に加えて、ターミナルを使った店頭支払いでも利用可能 |
| [ここ](https://stripe.com/docs/sources)に記載されたカードと支払い方法をサポート | カード、及び3DS, iDEAL, SEPAが必要なカードをサポート|
| SCA対応されていない | SCA対応されている | 

[SCA（Strong Customer Authentication）とは？](https://stripe.com/docs/strong-customer-authentication)

# Charges API の詳細

[Card payments on the Charges API](https://stripe.com/docs/payments/charges-api)
[Charges API reference](https://stripe.com/docs/api/charges)

# Payment Intents の詳細

[Accept a payment（Payment Intents API）](https://stripe.com/docs/payments/accept-a-payment)
[The Payment Intents API](https://stripe.com/docs/payments/payment-intents)
[Payment Intents API reference](https://stripe.com/docs/api/payment_intents)

# Charges API から Payment Intents API へのマイグレーション方法

※詳細は追記予定。

## 参照先
[Migrating code that reads from charges](https://stripe.com/docs/payments/payment-intents/migration/charges#read)
[Migrating to Payment Intents](https://stripe.com/docs/payments/payment-intents/migration)

## 方法

以下の 2つのプロパティを使って段階的に移行（コードの書き換え）を行っていきます。

- [payment_method_details](https://stripe.com/docs/api/charges/object#charge_object-payment_method_details)
- [billing_details](https://stripe.com/docs/api/charges/object#charge_object-billing_details)

# その他

## JCBカードの利用サポート

- JCBカードの利用を可能にするためには、Stripeに依頼する必要があります。
- `Charges API`、`Payment Intents API`いずれでも、JCBカードの利用は可能です。

## 各種サンプルコード

https://github.com/stripe-samples