# [Deprecated] Charges API でのカード支払い

Stripe のレガシーの API を使用してカードに請求する方法や、カード情報を保存および認証する方法をご紹介します。

The content on this page is deprecated and is superseded by:

- [Accept a payment](https://docs.stripe.com/payments/accept-a-payment.md)
- [Build a payments page](https://docs.stripe.com/payments/checkout.md)
- [The Payment Intents API](https://docs.stripe.com/payments/payment-intents.md)

> #### Deprecated
> 
> Stripe では、カード決済を作成するための Charges API の使用が非推奨になり、サポートの終了が予定されています。代わりに [Checkout](https://docs.stripe.com/payments/checkout.md) または [Payment Intents API](https://docs.stripe.com/payments/payment-intents.md) を使用してください。新しい実装では、Charges API を使用した決済の作成には対応していません。
> 
> Charges API は、以下の機能をサポートしていません。これらの多くはクレジットカードのコンプライアンスのために必要となります。
> 
> - インドに拠点を置く事業者
- [カード認証に関する銀行のリクエスト](https://docs.stripe.com/payments/cards/overview.md)
- [強力な顧客認証 (SCA)](https://docs.stripe.com/strong-customer-authentication.md)

If you use the Charges API, your access to newer Stripe features is limited. To get the latest features, [migrate to the Payment Intents API](https://docs.stripe.com/payments/payment-intents/migration.md).

## 決済フロー

ほとんどの場合、PaymentIntents API はより優れた柔軟性と多くの組み込みオプションを提供します。

| Charges API | Payment Intents API |
| --- | --- |
| 1. Elements を使用して、ブラウザで顧客の支払い情報を収集します。
2. Stripe.js で支払い情報をトークン化します。
3. サーバにトークンを送信するリクエストを実行します。
4. トークンを使用し、希望の金額と通貨で、サーバで支払いを作成します。
5. 支払いが成功したら、顧客の注文のフルフィルメントを実行します。 | 1. 希望の金額と通貨で、サーバで PaymentIntent を作成します。
2. クライアント側に PaymentIntent の client secret を送信します。
3. Elements を使用して、ブラウザで顧客の支払い情報を収集します。
4. Stripe.js またはモバイル SDK を使用して、[3D セキュア](https://docs.stripe.com/payments/3d-secure/authentication-flow.md#three-ds-radar)を処理し、クライアントで支払いを完了します。
5. 支払いが成功したら、Webhook を使用して顧客の注文のフルフィルメントを実行します。 |

## 返金

API を使用して支払いを返金するには、[Refund (返金)](https://docs.stripe.com/api.md#create_refund) を作成し、返金対象の支払い ID を指定します。

```curl
curl https://api.stripe.com/v1/refunds \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d charge={{CHARGE_ID}}
```

支払いの一部のみを返金するには、セント単位の整数で (または最も小さな支払い通貨単位で)、`amount` パラメータを指定します。

```curl
curl https://api.stripe.com/v1/refunds \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d charge={{CHARGE_ID}} \
  -d amount=1000
```

## Apple Pay

顧客が支払いを承認すると、お客様のアプリは、[PKPaymentAuthorizationViewControllerDelegate](https://developer.apple.com/documentation/passkit/pkpaymentauthorizationviewcontrollerdelegate) メソッドを実装することにより、顧客の暗号化されたカード詳細が含まれた [PKPayment](https://developer.apple.com/documentation/passkit/pkpayment) インスタンスを受け取ります。

1. [createTokenWithPayment](https://stripe.dev/stripe-ios/stripe-payments/Classes/STPAPIClient.html#/c:@CM@StripePayments@StripeCore@objc\(cs\)STPAPIClient\(im\)createTokenWithPayment:completion:) SDK メソッドを使用して、`PKPayment` を Stripe `Token` にします。
2. この `Token` を使用して、支払いを作成します。

#### Swift

```swift
extension CheckoutViewController: PKPaymentAuthorizationViewControllerDelegate {

    func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler: @escaping (PKPaymentAuthorizationResult) -> Void) {
        // Convert the PKPayment into a Token
        STPAPIClient.shared.createToken(withPayment: payment) { token, error in
              guard let token = token else {
                  // Handle the error
                  return
              }
            let tokenID = token.tokenId
            // Send the token identifier to your server to create a Charge...
            // If the server responds successfully, set self.paymentSucceeded to YES
        }
    }

    func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
        // Dismiss payment authorization view controller
        dismiss(animated: true, completion: {
            if (self.paymentSucceeded) {
                // Show a receipt page...
            } else {
                // Present error to customer...
            }
        })
    }
}
```

## 動的な明細書表記

デフォルトでは、Stripe アカウントの[明細書表記](https://docs.stripe.com/get-started/account/set-up.md#public-business-information)は、カードに請求するたびに顧客の明細書に表示されます。また、Charge オブジェクトの `statement_descriptor` 引数を使用すると、各請求リクエストで明細書表記を動的に設定することもできます。

#### curl

```bash
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "amount"=999 \
  -d "currency"="usd" \
  -d "description"="Example charge" \
  -d "source"="tok_visa" \
  -d "statement_descriptor"="Custom descriptor"
```

明細書表記は最大 22 文字で、特殊文字 `<`、`>`、`'`、`"` または `*` は使用できません。また、数字だけにすることもできません。

クレジットカードおよびデビットカードの支払いに明細書表記を動的に設定すると、動的な部分が売上処理加盟店の明細書表記に追加されます (`*` と空白で区切られます)。たとえば、購入されたクッキーの種類が含まれる、FreeCookies という名前のビジネスの明細書表記は、`FREECOOKIES* SUGAR` のようになります。

`*` および空白も 22 文字の制限に含まれ、Stripe は自動的に動的明細書表記に 10 文字を割り当てます。よって、売上処理加盟店の明細書表記が 10 文字よりも長い場合には短縮される可能性があります (動的な明細書表記も 10 文字を超えると仮定した場合)。動的な明細書表記も 10 文字を超える場合には、両方の表記が 10 文字で切り詰められます。

文字制限で問題が生じている場合には、Stripe ダッシュボードで[短い表記](https://dashboard.stripe.com/settings/public)を設定して売上処理加盟店の表記を短くできます。これにより動的な明細書表記の文字数に余裕がでます。短い表記は以下の役割を持ちます。

- 動的な明細書表記を使用する場合に、売上処理加盟店の明細書表記を置き換えます。
- 2 ～ 10 文字の間にできます。

> アカウントの明細書表記が 10 文字を超える場合には、ダッシュボードで[短い表記](https://dashboard.stripe.com/settings/public)を設定するか、`statement_descriptor_prefix` を使用します。これにより、予想外の形式で明細書表記が切り詰められることがなくなります。

明細書表記が全体としてどのように表示されるかは、[Stripe ダッシュボード](https://dashboard.stripe.com/settings/public)で確認できます。

## メタデータに情報を保存する

If using the [Payment Intents API](https://docs.stripe.com/payments/payment-intents.md), only retrieve and update the `metadata` and `description` fields on the Payment Intent object. If using both the Payment Intent and Charge objects, you’re not guaranteed to see consistent values for these fields.

Stripe では、支払いの処理など、一般的なリクエストに[メタデータ](https://docs.stripe.com/api.md#metadata)を追加することをサポートしています。メタデータは顧客に対して表示されたり、不正利用防止システムによる支払いの拒否やブロックの要因として考慮されたりすることはありません。

メタデータを使用して、その他の情報 (お客様にとって意味のある情報) を Stripe アクティビティーに関連付けることができます。追加したメタデータはすべてダッシュボードで確認でき (個々の支払いのページを表示するときなど)、一般的なレポートやエクスポートで使用することもできます。一例として、お客様のストアの注文 ID を、その注文の支払いに使用された請求に関連付けることができます。このようにすると、お客様、お客様の会計士、または財務チームが、Stripe での請求をお客様のシステム内の注文と簡単に照合できるようになります。

*Radar* (Stripe Radar helps detect and block fraud for any type of business using machine learning that trains on data across millions of global companies. It’s built into Stripe and requires no additional setup to get started) を使用している場合、メタデータとして追加の顧客情報や注文情報を渡すことを検討してください。このようにすると、メタデータ属性を使用して [Radar ルールを記述](https://docs.stripe.com/radar/rules/reference.md#metadata-attributes)でき、ダッシュボードで決済に関するより多くの情報を確認できるため、審査プロセスの効率化につながります。

#### curl

```bash
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "amount"=999 \
  -d "currency"="usd" \
  -d "description"="Example charge" \
  -d "source"="tok_visa" \
  -d "metadata[order_id]"=6735
```

> 機密情報 (個人が特定される情報、カード詳細など) は、メタデータや支払いの `description` パラメーターに保存しないでください。

## 支払い拒否

組み込みが支払いの失敗に対して自動的に対応するようにしたい場合は、2 つの方法で支払いの `outcome` にアクセスできます。

- 支払いが失敗したときに返される [API エラーを処理します](https://docs.stripe.com/api.md#error_handling)。ブロックされ、カード発行会社に拒否された支払いの場合、エラーには支払い ID が含まれ、これを使用して支払いを[取得](https://docs.stripe.com/api.md#retrieve_charge)できます。
- [Webhook](https://docs.stripe.com/webhooks.md) を使用して、ステータスの更新を監視します。たとえば、`charge.failed` イベントは、支払いが失敗したときにトリガーされます。
