# Afterpay または Clearpay の支払いを受け付ける

アメリカ、カナダ、イギリス、オーストラリア、ニュージーランドで、Afterpay (イギリスでは Clearpay とも呼ばれている) による支払い方法を受け付ける方法をご紹介します。

> このセクションには*レガシー* (Technology that's no longer recommended)プロダクトについてのコンテンツが含まれています。最新の導入パスについては、代わりに[決済を受け付ける](https://docs.stripe.com/payments/accept-a-payment.md)のガイドを使用する必要があります。Stripe はこのプロダクトを引き続きサポートしていますが、プロダクトが非推奨になった場合にはサポートが終了する可能性があります。

Stripe ユーザは、[Payment Intents API](https://docs.stripe.com/payments/payment-intents.md) (サポートされている方法を使用して支払いを作成するための単一の導入パス) を使用して、以下の国の顧客から [Afterpay](https://www.afterpay.com/) による支払いを受け付けることができます。

- オーストラリア
- カナダ
- ニュージーランド
- イギリス
- アメリカ

Afterpay は、[使用が 1 回限り](https://docs.stripe.com/payments/payment-methods.md#usage)の[即時通知型](https://docs.stripe.com/payments/payment-methods.md#payment-notification)の決済手段であり、顧客は支払いの[認証](https://docs.stripe.com/payments/payment-methods.md#customer-actions)を求められます。顧客は Afterpay のサイトにリダイレクトされ、そこで分割払いプランの規約に同意します。顧客が規約に同意すると、売上が保証され、お客様の Stripe アカウントに送金されます。顧客は一定の期間で直接 Afterpay に返済します。

> 連携を始める前に、[決済手段の設定](https://dashboard.stripe.com/settings/payment_methods)に移動して、アカウントが Afterpay の対象であることを確認してください。

## Stripe を設定する [サーバ側]

まず、Stripe アカウントが必要です。[今すぐ登録](https://dashboard.stripe.com/register)してください。

アプリケーションから Stripe API にアクセスするには、Stripe の公式ライブラリを使用します。

#### Ruby

```bash
# Available as a gem
sudo gem install stripe
```

```ruby
# If you use bundler, you can add this line to your Gemfile
gem 'stripe'
```

## PaymentIntent を作成する [サーバ側]

[PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) は、顧客から支払いを回収する意図を表し、支払いプロセスのライフサイクルを各ステージで追跡するオブジェクトです。まず、サーバーで `PaymentIntent` を作成し、回収する金額と通貨を指定します。

[ダッシュボード](https://dashboard.stripe.com/settings/payment_methods)から決済手段を管理できます。取引の金額、通貨、決済フローなどの要素に基づいて、対象となる決済手段が Stripe により返されます。最新バージョンの API では、この機能が Stripe によりデフォルトで有効になっているため、`automatic_payment_methods` パラメーターの指定は任意です。[ダッシュボード](https://dashboard.stripe.com/settings/payment_methods)で Afterpay / Clearpay を有効にしてください。

```curl
curl https://api.stripe.com/v1/payment_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount=1099 \
  -d currency=usd \
  -d "automatic_payment_methods[enabled]=true" \
  -d "shipping[name]=Jenny Rosen" \
  -d "shipping[address][line1]=1234 Main Street" \
  -d "shipping[address][city]=San Francisco" \
  -d "shipping[address][state]=CA" \
  -d "shipping[address][country]=US" \
  -d "shipping[address][postal_code]=94111"
```

### client secret を取得する

PaymentIntent には、*client secret* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) が含まれています。これは、支払いプロセスを安全に完了するためにクライアント側で使用されます。client secret をクライアント側に渡す際は、いくつかの方法を使用できます。

#### 1 ページのアプリケーション

ブラウザーの `fetch` 関数を使用して、サーバーのエンドポイントから client secret を取得します。この方法は、クライアント側が 1 ページのアプリケーションで、特に React などの最新のフロントエンドフレームワークで構築されている場合に最適です。client secret を処理するサーバーのエンドポイントを作成します。

#### Ruby

```ruby
get '/secret' do
  intent = # ... Create or retrieve the PaymentIntent
  {client_secret: intent.client_secret}.to_json
end
```

その後、クライアント側で JavaScript を使用して client secret を取得します。

```javascript
(async () => {
  const response = await fetch('/secret');
  const {client_secret: clientSecret} = await response.json();
  // Render the form using the clientSecret
})();
```

#### サーバ側のレンダリング

サーバーからクライアントに client secret を渡します。この方法は、アプリケーションがブラウザーへの送信前に静的なコンテンツをサーバーで生成する場合に最適です。

決済フォームに [client_secret](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) を追加します。サーバー側のコードで、PaymentIntent から client secret を取得します。

#### Ruby

```erb
<form id="payment-form" data-secret="<%= @intent.client_secret %>">
  <div id="payment-element">
    <!-- placeholder for Elements -->
  </div>
  <button id="submit">Submit</button>
</form>
```

```ruby
get '/checkout' do
  @intent = # ... Fetch or create the PaymentIntent
  erb :checkout
end
```

### その他の詳細情報による決済成功率の向上

オプションで、[配送](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-shipping)先の詳細を渡して購入完了率を向上させます。この導入では、顧客が決済方法を選択した後にクライアントから配送先の詳細を渡します。

配送先住所を送信する場合は、`line1`、`city`、`state`、`postal_code`、`country`の有効な値を含める必要があります。

### その他の支払い方法オプション

`PaymentIntent`の[決済手段オプション](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-payment_method_options-afterpay_clearpay-reference)で、決済の内部注文IDを設定するオプションの`reference`パラメーターを指定できます。これは通常、企業や消費者のいずれにも表示されませんが、Afterpayの内部サポートチームは、手動サポートリクエスト中にこのパラメーターにアクセスできます。IDは128文字以内で、文字、数字、アンダースコア、バックスラッシュ、ダッシュのみを使用できます。

#### curl

```bash
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -d "amount"=1099 \
  -d "currency"="usd" \
  -d "automatic_payment_methods[enabled]"=true \
  // Shipping address is optional but recommended to pass in.
  -d "shipping[name]"="Jenny Rosen" \
  -d "shipping[address][line1]"="1234 Main Street" \
  -d "shipping[address][city]"="San Francisco" \
  -d "shipping[address][state]"="CA" \
  -d "shipping[address][country]"="US" \
  -d "shipping[address][postal_code]"=94111 \
  -d "payment_method_options[afterpay_clearpay][reference]"="order_123"
```

## Stripe に支払いを送金する [クライアント側]

このステップでは、[Stripe.js](https://docs.stripe.com/payments/elements.md) を使用してクライアントで Afterpay の支払いを完了します。

### Stripe.js を設定する

顧客が Afterpay での支払いをクリックしたときは、Stripe.js を使用してその支払いを Stripe に送信することをお勧めします。Stripe.js は、支払いフローを構築するための Stripe の基本的な JavaScript ライブラリです。これにより、以下で説明するリダイレクトなどの複雑な処理が自動的に行われ、今後、組み込みを他の支払い方法に簡単に拡張できます。Stripe.js スクリプトを HTML ファイルの先頭に追加することで、決済ページにこのスクリプトを含めます。

```html
<head>
  <title>Checkout</title>
  <script src="https://js.stripe.com/endive/stripe.js"></script>
</head>
```

決済ページで以下の JavaScript を使用して、Stripe.js のインスタンスを作成します。

```javascript
// Set your publishable key: remember to change this to your live publishable key in production
// See your keys here: https://dashboard.stripe.com/apikeys
var stripe = Stripe(
  '<<YOUR_PUBLISHABLE_KEY>>',
);
```

PaymentIntent オブジェクト全体をクライアントに送信するのではなく、[ステップ 2](https://docs.stripe.com/payments/afterpay-clearpay/accept-a-payment.md#web-create-payment-intent) で得た [client secret](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret) を使用します。これは、Stripe API リクエストを認証する API キーとは異なります。

client secret は支払いを確定できるため、慎重に取り扱う必要があります。記録したり、URL に埋め込んだり、当該の顧客以外に漏洩することがないようにしてください。

[stripe.confirmAfterpayClearpayPayment](https://docs.stripe.com/js/payment_intents/confirm_afterpay_clearpay_payment) を使用して、お客様のページからのリダイレクトを処理して支払いを完了します。この機能に [return_url](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-return_url) を追加し、ユーザが Afterpay のウェブサイトまたはモバイルアプリで支払いを完了した後に Stripe がユーザをリダイレクトする場所を指示します。

```javascript
// Redirects away from the client
const {error} = await stripe.confirmAfterpayClearpayPayment(
  '{{PAYMENT_INTENT_CLIENT_SECRET}}',
  {
    payment_method: {
      billing_details: {
        email: 'jenny@rosen.com',
        name: 'Jenny Rosen',
        address: {
          line1: '1234 Main Street',
          city: 'San Francisco',
          state: 'CA',
          country: 'US',
          postal_code: '94111',
        },
      },
    },
    return_url: 'https://example.com/checkout/complete',
  }
);
if (error) {
  // Inform the customer that there was an error.
}
```

顧客が支払いを送信すると、Stripe は顧客を `return_url` にリダイレクトし、以下の URL クエリーパラメーターを含めます。返品ページでは、これらを使用して PaymentIntent のステータスを取得し、顧客に支払いステータスを表示できます。

`return_url` を指定する際に、返品ページで使用する独自のクエリパラメーターを追加することもできます。

| パラメーター | 説明 |
| --- | --- |
| `payment_intent` | `PaymentIntent` の一意の識別子。 |
| `payment_intent_client_secret` | `PaymentIntent` オブジェクトの [client secret](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-client_secret)。サブスクリプションの実装では、この client_secret は [confirmation_secret](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret) を通じて `Invoice` オブジェクトにも公開されます。 |

顧客が自社のサイトにリダイレクトされたら、`payment_intent_client_secret` を使用して PaymentIntent をクエリし、顧客に取引ステータスを表示できます。

## Optional: PaymentIntent にラインアイテムを追加する

オプションで項目データを受け入れて、Afterpay により多くのリスクシグナルを提供できます。この機能は現在プライベートベータです。アクセスをリクエストする場合は、[Stripe サポート](https://support.stripe.com)のフォームからお問い合わせください。

## Optional: オーソリとキャプチャの分離

[カード支払いでのオーソリとキャプチャーの分離](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)とは異なり、Afterpay ではオーソリ時点で分割払いの初回の金額を顧客に請求します。その後、オーソリから最長 13 日間以内であれば、残りの支払いをキャプチャーすることができます。この期間に支払いがキャプチャーされない場合、初回分の分割払いが顧客に返金され、それ以降の分割払いは請求されません。この場合、Stripe は PaymentIntent もキャンセルし、[payment_intent.canceled](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.canceled) イベントを送信します。

支払いをキャプチャーできないと分かっている場合は、13 日間が経過するのを待つのではなく [PaymentIntent をキャンセル](https://docs.stripe.com/refunds.md#cancel-payment)することをお勧めします。先を見越して PaymentIntent をキャンセルすると、すぐに最初の分割払いが顧客に返金され、顧客の明細書上の支払いに関して混乱が生じるのを避けられます。

### オーソリのみ行うように Stripe に指示する

オーソリとキャプチャーを分離することを指定するには、PaymentIntent の作成時に、[capture_method](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-capture_method) を `manual` に設定します。このパラメーターは、顧客の Afterpay アカウントの金額のみをオーソリするよう Stripe に指示します。

#### curl

```bash
curl https://api.stripe.com/v1/payment_intents \
  -u <<YOUR_SECRET_KEY>>: \
  -d "amount"=1099 \
  -d "currency"="usd" \
  -d "automatic_payment_methods[enabled]"="true" \
  -d "capture_method"="manual" \
  -d "shipping[name]"="Jenny Rosen" \
  -d "shipping[address][line1]"="1234 Main Street" \
  -d "shipping[address][city]"="San Francisco" \
  -d "shipping[address][state]"="CA" \
  -d "shipping[address][country]"="US" \
  -d "shipping[address][postal_code]"=94111
```

オーソリが成功すると、Stripe は [payment_intent.amount_capturable_updated](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.amount_capturable_updated) イベントを送信します。この機能については、[イベントガイド](https://docs.stripe.com/api/events.md)でご確認ください。

### 売上をキャプチャする

オーソリが成功すると、PaymentIntent の [status](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) が `requires_capture` に移行します。オーソリされた売上をキャプチャーするために、PaymentIntent [capture](https://docs.stripe.com/api/payment_intents/capture.md) リクエストを実行します。デフォルトでは、オーソリされた合計金額がキャプチャーされます。これを超える金額のキャプチャーはできませが、これ未満でしたらキャプチャーできます。

```curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENTINTENT_ID}}/capture \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d amount_to_capture=750
```

### (任意)オーソリをキャンセルする

オーソリを取り消す必要がある場合は、[PaymentIntent をキャンセル](https://docs.stripe.com/refunds.md#cancel-payment)できます。

## Optional: Afterpay のリダイレクトを手動で処理する

クライアント側で `confirmAfterpayClearpayPayment` を使用して Afterpay のリダイレクトおよび支払いを処理するには、Stripe.js を使用することをお勧めします。Stripe.js を使用すると、他の決済手段にも対応するように実装を拡張できます。ただし、以下の手順に従って、お客様のサーバーに顧客を手動でリダイレクトすることもできます。

- タイプが `afterpay_clearpay` の [PaymentIntent (支払いインテント)](https://docs.stripe.com/api/payment_intents/object.md) を作成し、確定します。Afterpay で必要な `payment_method_data.billing_details` プロパティを指定する必要があります。`payment_intent.shipping` はオプションですが、認証率を上げるために推奨されます。`payment_method_data` を指定すると、Stripe によって *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) が作成され、この PaymentIntent ですぐに使用されます。

  また、顧客が支払いを完了した後にリダイレクトされる先の URL を `return_url` フィールドに指定する必要があります。独自のクエリパラメータをこの URL に指定することもできます。これらのパラメータは、リダイレクトフロー完了時の最終的な URL に含められます。

  #### curl

  ```bash
  curl https://api.stripe.com/v1/payment_intents \
    -u <<YOUR_SECRET_KEY>>: \
    -d "amount"=1099 \
    -d "currency"="usd" \
    -d "confirm"="true" \
    -d "shipping[name]"="Jenny Rosen" \
    -d "shipping[address][line1]"="1234 Main Street" \
    -d "shipping[address][city]"="San Francisco" \
    -d "shipping[address][state]"="CA" \
    -d "shipping[address][country]"="US" \
    -d "shipping[address][postal_code]"=94111 \
    -d "payment_method_data[billing_details][name]"="Jenny Rosen" \
    -d "payment_method_data[billing_details][email]"="jenny@example.com" \
    -d "payment_method_data[billing_details][address][line1]"="1234 Main Street" \
    -d "payment_method_data[billing_details][address][city]"="San Francisco" \
    -d "payment_method_data[billing_details][address][state]"="CA" \
    -d "payment_method_data[billing_details][address][country]"="US" \
    -d "payment_method_data[billing_details][address][postal_code]"=94111 \
    -d "payment_method_data[type]"="afterpay_clearpay" \
    -d "return_url"="https://example.com/checkout/complete"
  ```

  作成される `PaymentIntent` のステータスは `requires_action` であり、`next_action` のタイプは `redirect_to_url` です。

  #### Json

  ```json
  {
    "status": "requires_action",
    "next_action": {
      "type": "redirect_to_url",
      "redirect_to_url": {
        "url": "https://hooks.stripe.com/...",
        "return_url": "https://example.com/checkout/complete"
      }
    },
    "id": "pi_1G1sgdKi6xqXeNtkldRRE6HT",
    "object": "payment_intent",
    "amount": 1099,
    "client_secret": "pi_1G1sgdKi6xqXeNtkldRRE6HT_secret_h9B56ObhTN72fQiBAuzcVPb2E",
    "confirmation_method": "automatic",
    "created": 1579259303,
    "currency": "usd",
    "livemode": true,
    "charges": {
      "data": [],
      "object": "list",
      "has_more": false,
      "url": "/v1/charges?payment_intent=pi_1G1sgdKi6xqXeNtkldRRE6HT"
    },
    "payment_method_options": {
      "afterpay_clearpay": {}
    },
    "payment_method_types": [
      "afterpay_clearpay"
    ]
  }
  ```

- `next_action.redirect_to_url.url` プロパティで指定した URL に顧客をリダイレクトします。ここに示すコード例はおおまかなものであり、リダイレクト方法は、ご使用のウェブフレームワークによって異なる場合があります。

  #### Ruby

  ```ruby
  if payment_intent.status == 'requires_action' && payment_intent.next_action.type == 'redirect_to_url'
    url = payment_intent.next_action.redirect_to_url.url
    redirect(url)
  end
  ```

決済プロセスを完了した顧客は、ステップ 1 で設定した `return_url` に送られます。`payment_intent` と `payment_intent_client_secret` の URL クエリパラメーターが含まれています。上記のように独自のクエリパラメーターを渡すこともできます。

支払いのステータスを確認するには、[Webhook を利用](https://docs.stripe.com/payments/payment-intents/verifying-status.md#webhooks)することをお勧めします。

## Optional: 支払い後のイベントを処理する

支払いが完了すると、Stripe は [payment_intent.succeeded](https://docs.stripe.com/api/events/types.md#event_types-payment_intent.succeeded) イベントを送信します。ダッシュボード、カスタム *Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests)、またはパートナーソリューションを使用してこれらのイベントを受信し、また、顧客への注文確認メールの送信、データベースでの売上の記録、配送ワークフローの開始などのアクションを実行します。

クライアントからのコールバックを待つのではなく、これらのイベントをリッスンします。クライアント側では、コールバックが実行される前に顧客がブラウザーのウィンドウを閉じたり、アプリを終了したりする可能性があります。また、悪意を持つクライアントがレスポンスを不正操作する恐れもあります。非同期型のイベントをリッスンするよう構築済みのシステムを設定することで、これ以降はより多くの決済手段を簡単に受け付けられるようになります。[サポートされているすべての決済手段の違い](https://stripe.com/payments/payment-methods-guide)をご確認ください。

- **ダッシュボードでイベントを手動で処理する**

  ダッシュボードでは、[支払いの表示](https://dashboard.stripe.com/payments)、メールの領収書の送信、入金の処理、失敗した支払いの再試行を行えます。

- **Custom Webhook を構築する**

  [カスタム webhook](https://docs.stripe.com/webhooks/handling-payment-events.md#build-your-own-webhook) ハンドラを構築して、イベントをリッスンし、カスタムの非同期決済フローを構築できます。Stripe CLI を使用すると、ローカルで webhook 連携をテストしてデバッグできます。

- **構築済みアプリを導入する**

  パートナーアプリケーションを統合することで、[自動化](https://stripe.partners/?f_category=automation)や[マーケティング/セールス](https://stripe.partners/?f_category=marketing-and-sales)などの一般的なビジネスイベントを処理します。

## Optional: Afterpay の組み込みをテストする

リダイレクトページを表示し、テスト API キーを使用して Afterpay の実装をテストします。リダイレクトページで決済を認証すると、決済の成功をテストできます。PaymentIntent は `requires_action` から `succeeded` に移行します。

認証の失敗をテストするには、テスト API キーを使用してリダイレクトページを表示します。リダイレクトページで、 **Fail test payment** をクリックします。PaymentIntent は `requires_action` から `requires_payment_method` に移行します。

テスト環境における[手動確定](https://docs.stripe.com/payments/afterpay-clearpay/accept-a-payment.md#manual-capture)の PaymentIntent の場合、確定されていない PaymentIntent はオーソリの成功から 10 分後に自動的に期限切れになります。

## Optional: ウェブサイトに支払い方法のメッセージを表示する

[Payment Method Messaging Element](https://docs.stripe.com/js/elements_object/create_element?type=paymentMethodMessaging) は、顧客が購入時に商品、カート、支払いの各ページから、利用できる後払いの決済オプションを直接確認できるようにする、埋め込み可能な UI コンポーネントです。

ウェブサイトに Payment Method Messaging Element を追加するには、[決済手段のメッセージを表示する](https://docs.stripe.com/elements/payment-method-messaging.md)をご覧ください。

## 失敗した支払い

Afterpay は、取引を受け付けるか拒否するかを決定する際に複数の要因を考慮します (顧客の Afterpay の利用期間、顧客が返済する必要のある未払い額、今回の注文の金額など)。

Afterpay による支払いは多くの決済手段よりも支払い拒否の確立が高いため、チェックアウトフローには常に `card` などの他の支払いオプションを提示する必要があります。このような場合、[PaymentMethod](https://docs.stripe.com/api/payment_methods/object.md) は解除され、[PaymentInten](https://docs.stripe.com/api/payment_intents/object.md)オブジェクトのステータスは自動的に `requires_payment_method` に変わります。

Afterpay の [PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) のステータスが `requires_action` の場合、顧客は Afterpay のサイトにリダイレクトされてから 3 時間以内に支払いを完了する必要があります (拒否された支払いには適用されません)。3 時間以内にアクションが実行されなければ、[PaymentMethod](https://docs.stripe.com/api/payment_methods/object.md) の関連付けが解除され、[PaymentIntent](https://docs.stripe.com/api/payment_intents/object.md) のステータスは自動的に `requires_payment_method` に移行します。

このような場合、決済フローに表示される別の支払いオプションで再試行するように顧客に通知します。

## エラーコード

一般的なエラーコードと対応する推奨アクションは以下のとおりです。

| エラーコード | 推奨される対応 |
| --- | --- |
| `payment_intent_payment_attempt_failed` | Afterpay Checkout が失敗したことを示す一般的な失敗。決済の失敗エラーコードとして表示されない決済の失敗も考えられます。 |
| `payment_method_provider_decline` | Afterpay が顧客の支払いを拒否しました。次のステップとして、顧客から Afterpay に詳細を問い合わせる必要があります。 |
| `payment_intent_payment_attempt_expired` | 顧客が Afterpay の決済ページで支払いを完了しなかったため、支払いセッションの有効期限が切れました。Stripe では、決済が正常に行われなかった PaymentIntent は、最初のチェックアウト作成から 3 時間後に自動的に有効期限切れとなります。 |
| `payment_method_not_available` | Afterpay でサービス関連のエラーが発生したため、リクエストを完了できません。後で再試行してください。 |
| `amount_too_small` | その国の Afterpay の[デフォルトの取引限度額](https://docs.stripe.com/payments/afterpay-clearpay.md#payment-options)の範囲内で金額を入力します。 |
| `amount_too_large` | その国の Afterpay の[デフォルトの取引限度額](https://docs.stripe.com/payments/afterpay-clearpay.md#payment-options)の範囲内で金額を入力します。 |
