コンビニ決済
Payment Intents API と Payment Methods API を使用して、日本でよく使用されるコンビニエンスストアでの支払いを受け付けます。
日本の Stripe のユーザは、Payment Intents API および Payment Methods API を使用して、日本の顧客からコンビニ決済を受け付けることができます。顧客は日本のコンビニエンスストアで、支払いコードと確認番号を指定し、現金で支払います。支払いが完了すると、Stripe からお客様に通知が送られます。
PaymentIntent を作成するサーバ側
Stripe は PaymentIntent (支払いインテント) オブジェクトを使用して、顧客から支払いを回収するお客様の意図を示し、コンビニ決済の PaymentIntent の作成から完了までの状態の変化を追跡します。
金額と jpy
通貨 (コンビニ決済は他の通貨には対応していません) を指定して、サーバーで PaymentIntent を作成します。すでに Payment Intents API を使用したシステムがある場合は、konbini
を PaymentIntent の支払い方法タイプのリストに追加します。
client secret を取得する
PaymentIntent には、client secret が含まれています。これは、支払いプロセスを安全に完了するためにクライアント側で使用されます。client secret をクライアント側に渡す際は、いくつかの方法を使用できます。
その他の支払い方法オプション
支払い方法オプションは、支払い方法オプションの konbini
キーで指定できます。
フィールド | 値 | 必須 | デフォルト値 |
---|---|---|---|
expires_ | 保留中のコンビニ決済の期限が切れるまでの日数。有効な値は 1 ~ 60 日です。有効期限をご覧ください。 | いいえ | 3 |
expires_ | 保留中のコンビニ決済が期限切れとなる Unix タイムスタンプ。この有効期限は、現在時刻から 30 分後以降で、PaymentIntent に設定を適用してから 60 日以内にする必要があります。有効期限をご覧ください。 | いいえ | 「設定解除」 |
product_ | コンビニエンスストアで顧客に表示される、最大 22 文字の商品の表記。シフト JIS (JIS X 0208:1997) 以外の文字が含まれていると、エラーが返されます。このオプションは必須ではありませんが、設定することをお勧めします。設定しない場合は、Stripe の判断で選択された一般的なプレースホルダー (例: お買い上げ商品・サービス) が使用されます。 | いいえ | 「プレースホルダー」 |
有効期限
保留中のコンビニ決済は、指定した日付の真夜中 (23:59:59 JST) に期限切れになります。たとえば、expires_
に 2 が設定され、月曜日に PaymentIntent が確定された場合、保留中のコンビニ決済は水曜日の日本時間 (UTC+9) 23:59:59 に期限切れになります。
expires_
設定は、秒単位の Unix タイムスタンプです。値が現在時刻から 30 分未満である場合、または有効期限の 30 分前以降に PaymentIntent の確定が発生した場合は、エラーが返されます。
expires_
と expires_
は相互排他的です。両方を設定するとエラーが返されます。また、どちらも省略可能であり、どちらも設定しなかった場合、有効期限は PaymentIntent の作成から 3 日後の日本時間 (UTC+9) 23:59 にデフォルト設定されます。
エラー処理
PaymentIntent の作成、更新、確定などのリクエストは失敗することがあります。API レスポンスの error
値を調査して原因を特定し、たいていの場合はリクエストを再送信するか、エラーを修正します。特に、支払い方法のオプションである confirmation_
の値を指定している場合は、返される各エラーコードに対応することをお勧めします。詳細については、確認番号をご覧ください。
支払い方法は、障害、定期メンテナンス、使用形態によって、一時的に利用できなくなることがあります。詳細は、一時的な可用性の問題に対処するをご覧ください。
支払い方法の詳細を収集するクライアント側
クライアントで支払いフォームを作成し、必要な請求先情報を顧客から収集します。
フィールド | 値 |
---|---|
name | 顧客の氏名。コンビニエンスストアの UI と領収書では最大 20 文字に切り詰められます。シフト JIS (JIS X 0208:1997) 以外の文字は、削除または置換されます。 |
email | 顧客の完全なメールアドレス。 |
このフォームの例では電話番号も収集しています。顧客が提供する確認番号として使用します。
<form id="payment-form"> <div class="form-row"> <label for="name"> Name </label> <input id="name" name="name" required> </div> <div class="form-row"> <label for="email"> Email </label> <input id="email" name="email" required> </div> <div class="form-row"> <label for="phone"> Phone Number </label> <input id="phone" name="phone" required> </div> <!-- Used to display form errors. --> <div id="error-message" role="alert"></div> <button id="submit-button">Pay with Konbini</button> </form>
Stripe に支払いを送信するクライアント側
顧客がコンビニ決済をクリックしたら、Stripe.js を使用してその支払いを Stripe に送信します。Stripe.js は、決済フローの構築に使用できる Stripe の基本的な JavaScript ライブラリです。
Stripe.js スクリプトを決済ページに含めるには、このスクリプトを HTML ファイルの head
に追加します。
<head> <title>Checkout</title> <script src="https://js.stripe.com/basil/stripe.js"></script> </head>
決済ページで以下の JavaScript を使用して、Stripe.js のインスタンスを作成します。
// Set your publishable key. Remember to switch to your live publishable key in production! // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe(
);'pk_test_TYooMQauvdEDq54NiTphI7jx'
顧客の請求先情報を送信するには、stripe.confirmKonbiniPayment と、ステップ 2 で作成した PaymentIntent オブジェクトの client secret を使用します。
確定されると、Stripe はモーダルを自動的に開き、顧客にコンビニ決済の手順を表示します。
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const result = await stripe.confirmKonbiniPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { billing_details: { name: document.getElementById('name').value, email: document.getElementById('email').value, }, }, payment_method_options: { konbini: { confirmation_number: document.getElementById('phone').value.replace(/\D/g,''), }, }, } ); // Stripe.js will open a modal to display the Konbini payment instructions to your customer // This async function finishes when the customer closes the modal if (result.error) { // Display error to your customer const errorMsg = document.getElementById('error-message'); errorMsg.innerText = result.error.message; } });
注
stripe.
の完了には数秒かかる場合があります。この間、フォームが再送信されないように無効化し、スピナーのような待機中のインジケータを表示します。エラーが発生した場合は、それを顧客に表示し、フォームを再度有効化し、待機中のインジケータを非表示にします。
その他の支払い方法オプション
Konbini PaymentIntent を確定する際に、支払い方法オプションの konbini
キーで、その他の支払い方法オプションを指定できます。
フィールド | 値 | 必須 | デフォルト値 |
---|---|---|---|
confirmation_ | 10 ~ 11 桁の数値文字列です。この文字列は支払い手順にも表示され、0 のみで構成することはできません。confirmation_ の値を指定しない場合、Stripe は番号をランダムに生成します。詳細は、確認番号をご覧ください。 | いいえ | 「設定解除」 |
確認番号
顧客は支払いの実行時に confirmation_
を参照する必要があります。この値を設定するか、顧客に設定を許可する場合に一般的に推奨される値は、顧客の電話番号です。confirmation_
は、サーバー側での PaymentIntent の作成時に設定することもできますが、一般的には、クライアント側で顧客が PaymentIntent を確定する際に設定することです。PaymentIntent の作成時に設定された番号は、確定までのすべての段階で更新される可能性があります。
指定した confirmation_
が進行中のすべてのコンビニエンスストア取引において使用される可能性が高い番号である場合は、PaymentIntent の確定時点で拒否される可能性があります。この場合、PaymentIntent の確定時にのみ想定されるエラーコード payment_
が返されます。
Stripe は、PaymentIntent の作成時、および更新と確定の際に、ゼロのみで構成される確認番号を予防的にブロックします。この値を設定したり、顧客に設定を許可しないようにしてください。
エラー処理
クライアント側での PaymentIntent の確定も失敗することがあります。error
戻り値を調べて原因を特定する必要があり、場合によっては顧客にエラーを表示したり、エラーを修正して再試行したりします。
オプション顧客に独自のコンビニ決済の手順を表示するクライアント側
confirmKonbiniPayment
でコンビニ決済の手順の表示を処理するには、Stripe.js を利用することをお勧めします。ただし、次の方法で顧客に手動で支払い手順を表示することもできます。
顧客へのコンビニ決済の詳細表示に続くアクションに手動で対応するには、ステップ 4 で stripe.
を呼び出す際に、handleActions: false
を使用します。
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const result = await stripe.confirmKonbiniPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { billing_details: { name: document.getElementById('name').value, email: document.getElementById('email').value, }, }, payment_method_options: { konbini: { confirmation_number: document.getElementById('phone').value.replace(/\D/g,''), }, }, }, {handleActions: false}, ); // This async function finishes when the PaymentIntent is confirmed if (result.error) { // Display error to your customer var errorMsg = document.getElementById('error-message'); errorMsg.innerText = result.error.message; } else { // A Konbini PaymentIntent was successfully created var amount = result.paymentIntent.amount; var currency = result.paymentIntent.currency; var details = result.paymentIntent.next_action.konbini_display_details; for (var store in details.stores) { // Do something with each store's details } var expires_at = details.expires_at; // Display Konbini details to end customer } });
表示
顧客に支払い手順をどのように表示するかを指定します。手順には少なくとも次を含める必要があります。
- 商品の説明、金額、支払いの有効期限など、購入に関連する一般的な情報。
- PaymentIntent の確定により取得された、各コンビニエンスストアチェーンの支払いコードおよび確認番号。
- コンビニ決済を実行する方法を示した顧客向けの手順。支払い手順の例を以下に示します。
コンビニ決済の手順
- 支払いに利用するコンビニエンスストアチェーンの支払いコードと確認番号を確認します。
- コンビニエンスストアで、支払い端末か、レジで支払いコードと確認番号を指定します。
- 支払いが完了したら、記録のために領収書を保管しておきます。
- ご不明な点がございましたら、お問い合わせください。
オプションサーバーから Stripe に支払いを送信するサーバー側
クライアント側で stripe.confirmKonbiniPayment を使用してコンビニ決済を処理するには、Stripe.js を使用することをお勧めします。Stripe.js を使用すると、他の決済手段にも簡単に対応できるようになります。ただし、以下のステップに従って、お客様のサーバーに顧客を手動でリダイレクトすることも可能です。
タイプが
konbini
の PaymentIntent (支払いインテント) を作成する際に、confirm
をtrue
に設定するか、既存の PaymentIntent を確定します。payment_
プロパティとmethod_ data. billing_ details. name payment_
プロパティを指定する必要があります。オプションで、method_ data. billing_ details. email payment_
またはその他の payment_method_options を設定することもできます。method_ options. konbini. confirmation_ number payment_
を指定すると、PaymentMethod が作成され、この PaymentIntent ですぐに使用されます。method_ data 作成される
PaymentIntent
のステータスはrequires_
であり、action next_
のタイプはaction konbini_
です。display_ details { "status": "requires_action", "next_action": { "type": "konbini_display_details", "konbini_display_details": { "expires_at": 1642431599, "hosted_voucher_url": "https://payments.stripe.com/konbini/voucher/...", "stores": { "familymart": { "confirmation_number": "12345678901", "payment_code": "123456" }, ... } } }, "id": "pi_1G1sgdKi6xqXeNtkldRRE6HT", "object": "payment_intent", "amount": 1099,
next_
プロパティーで指定した URL に顧客をリダイレクトします。例で示すコード例はおおまかなものであり、リダイレクト方法は、ご使用の Web フレームワークによって異なる場合があります。action. konbini_ display_ details. hosted_ voucher_ url
支払いのステータスを確認するには、Webhook を利用することをお勧めします。
オプション支払い手順をカスタマイズする
ブランディング設定ページを使用して、顧客に表示される内容をカスタマイズできます。Customer (顧客) が PaymentIntent にリンクされている場合、オンラインで提供される支払い手順では顧客の利用言語が使用されます。それ以外の場合は顧客のブラウザーの言語が使用されます。
オンラインで提供される支払い手順には、以下のブランド設定を適用できます。
- アイコン: ブランド画像と公開ビジネス名
- ロゴ: ブランド画像
- アクセント: 印刷ボタンのカラー
- ブランドカラー: 背景色
オプション支払い手順メールを送信する
ダッシュボードのメール設定ページで、コンビニ決済の手順メールとリマインドメールを有効にできます。手順メールを有効にすると、Stripe は、PaymentIntent の確定時に支払い手順のメールを送信します。メールには、コンビニエンスストアでの支払いに必要な支払いコード、確認番号、その他の詳細が含まれます。オンラインで提供される支払い手順ページへのリンクも含まれます。
オプションリマインドメールを送信する
ダッシュボードのメール設定ページで、支払いのリマインドメールを有効にして、PaymentIntent ごとのリマインドメールの最大件数を設定できます。Stripe は、支払いが成功、期限切れ、またはキャンセルになるまで、最大で 1 日に 1 回リマインドメールを送信します。
注
テスト環境では、手順メールとリマインドメールは Stripe アカウントに関連付けられたメールアドレスにのみ送信されます。
支払い後のイベントを処理するサーバー側
コンビニ決済は遅延通知型の支払い方法であるため、売上はすぐには利用可能になりません。顧客が購入操作直後にはコンビニエンスストアで保留中のコンビニ決済に対する支払いを実行しない場合があります。
保留中のコンビニ決済が完了すると、Stripe はその payment_intent.succeeded イベントを送信します。ダッシュボードを使用するか、Webhook ハンドラーを構築して、これらのイベントを受信し、アクション (顧客への注文確認メールの送信、データベースへの売上の記録、配送ワークフローの開始など) を実行します。
Stripe は、保留中のコンビニ決済が完了していないことが確実と見込まれるようになった場合 (通常は有効期限の約 1 時間後)、payment_intent.payment_failed イベントを送信します。
イベント | 説明 | 次のステップ |
---|---|---|
payment_ | 保留中のコンビニ決済が作成されています。 | オプションとして、顧客に支払い手順のページを送信します。顧客がコンビニ決済に対する支払いを行うまで待機します。 |
payment_ | 顧客は有効期限が切れる前に保留中のコンビニ決済に対する支払いを行っています。 | 顧客が購入した商品またはサービスのフルフィルメントを行います。 |
payment_ | 顧客は有効期限が切れる前に保留中のコンビニ決済に対する支払いを行いませんでした。 | 顧客にメールまたはプッシュ通知で連絡し、別の支払い方法をリクエストします。 |
注
テスト中、email
など、送信されたパラメーターに基づいて Konbini PaymentIntent のステータスが自動的に変わる場合があります。更新内容はダッシュボードで確認できます。詳細については、実装内容をテストするをご覧ください。
イベントを受信し、ビジネスアクションを実行する
手動
Stripe ダッシュボードを使用して、Stripe のすべての支払いの確認、メール領収書の送信、入金処理、失敗した支払いの再試行を実行します。
カスタムコード
Webhook ハンドラーを構築してイベントをリッスンし、非同期型のカスタムの決済フローを作成します。Stripe CLI を使用して、ローカルで Webhook の組み込みのテストとデバッグを行います。
組み込みをテストする
テスト時、stripe.confirmKonbiniPayment をコールするときに payment_
に以下の値を設定して、さまざまなシナリオをテストします。特殊な確認番号とメールパターンのいずれかを使用してテストできます。両方を指定した場合は、特殊な確認番号の動作が適用されます。
メールアドレス | 確認番号 | 説明 |
---|---|---|
|
| 3 分後に成功し、その後 例: hanako@test.com |
|
| 即座に成功し、その後 例: succeed_immediately@test.com |
|
| 即座に有効期限が切れ、その後 支払い方法オプションで 例: expire_immediately@test.com |
|
| 成功することなく、3 分後に有効期限が切れ、その後 支払い方法オプションで 例: expire_with_delay@test.com |
|
| コンビニ決済を成功させずにシミュレーションを実行します。支払い方法オプションで指定されたパラメーターに基づき、 例: fill_never@test.com |
確認番号のエラー処理をテストするには、payment_
に以下の値を使用できます。
01234567890
はpayment_
エラーコードを発生します。intent_ konbini_ rejected_ confirmation_ number 00000000000
は汎用的な検証エラーコードになります。組み込みで事前検証を使用して、このエラーを回避する必要があります。
有効期限とキャンセル
next_action.konbini_display_details の expires_
値によって指定された期限を過ぎると、顧客はコンビニエンスストアのキオスク端末で、保留中のコンビニ決済の支払いプロセスを「開始」することができなくなります。ただし、期限が切れる前に有効な払込取扱票を発行した場合には、expires_
の後でもレジで支払いを「完了」できます。
このような場合に備え、早期に支払いが失敗しないように、バッファーの時間が設けられています。PaymentIntent のステータスは requires_
に変わります。この時点では、別の支払い方法を指定して PaymentIntent を確定するか、キャンセルできます。
保留中のコンビニ決済は、確定後 next_
で指定された時間までの間に、キャンセルすることもできます。PaymentIntent を更新するか、またはそれを別の支払い方法で確定することでも、暗黙的に既存のコンビニ決済がキャンセルされます。
顧客が現在コンビニエンスストアでコンビニ決済による支払いを行っている場合、キャンセルのリクエストは失敗します。顧客が支払いの試行を放棄した場合や、払込取扱票の期限が切れた後にキャンセルを再度試すことができます。
支払い方法が一時的に利用できなくなる問題は、(明示的および暗黙的な) キャンセルリクエストにも影響することにご注意ください。
注意
保留中の支払いをキャンセルすると、元の決済手順は無効になります。ほぼすべてのユースケースで、顧客にキャンセルについて連絡することをお勧めします。
ステータスが requires_
の PaymentIntent を正常に再確定すると、新しい指示と新しい hosted_
が作成されます。顧客がこれについて通知されていることを確認する必要があります。
提供状況の一時的な問題を処理する
次のエラーコードは、支払い方法の可用性における一時的な問題を示しています。
コード | 説明 | 処理 |
---|---|---|
payment_ | この支払い方法には、Stripe の API 全体のレート制限よりも厳しい制限が適用されていますが、大量のリクエストが立て続けに実行されました。 | 通常、バックオフで再試行すればこの状況は解消されます。ただし、対象の支払い方法で使用量が高い状態が長時間続く場合 (Web サイトでセールが実施されているなど)、これらのエラーは一定のリクエストで継続することがあります。その場合は、顧客に別の支払い方法の選択を検討してもらうことで、対応できる可能性があります。 |
payment_ | 支払い方法で原因不明の一時的な問題が発生しており、これがしばらく続く可能性があります (システム障害の間または定期メンテナンス期間など)。 | 別の支払い方法で購入を完了するようにユーザーを招待するか、しばらくしてからもう一度試してもらうことをお勧めします。 |
注意
全般的に、または今後のイベントで使用量が高くなることが想定される場合は、時間的な余裕を持って事前に Stripe にお知らせください。
返金
Konbini 支払いは、ダッシュボードまたは API で返金できます。
顧客の銀行口座に直接返金するには、顧客が返金先の口座情報を指定する必要があります。Stripe は支払い方法の請求詳細に登録されているメールアドレスを使用して顧客に連絡し、顧客に詳細情報をリクエストします。銀行口座情報を受け取ると、その後返金は自動的に処理されます。
返金のステータスは次のように移行します。
イベント | 返金のステータス |
---|---|
返金が作成されました | requires_ |
顧客が銀行口座の詳細を送信し、Stripe が返金の処理を開始します | pending |
返金が顧客の銀行に入金される予定です | succeeded |
顧客の銀行が資金を Stripe に戻します | requires_ |
返金は、作成後 45 日間、requires_ です | failed |
返金が requires_ ステータスからキャンセルされました | canceled |
顧客の銀行口座で送金に失敗した場合、資金は Stripe に戻り、返金のステータスは requires_
に変わります。これは、口座保有者の名前が受取人の銀行に登録されている名前と異なるか、指定した銀行口座番号に入力ミスがある場合に発生する可能性があります。この場合、Stripe から顧客に対し、メールで失敗の通知と銀行口座の詳細の再送依頼が行われます。
顧客から 45 日以内に銀行口座情報が提供されなかった場合、返金のステータスは failed
に移行し、refund.failed イベントが送信されます。この場合、Stripe は返金を処理できないため、Stripe の外部で顧客に返金する必要があります。
返金の instructions_email フィールドは、返金の送信先のメールアドレスです。返金が顧客からの応答を待機している間、顧客に送信されたメールの詳細も返金の next_action.display_details.email_sent フィールドに示されます。
個々の返金 (一部返金を含む) には手数料が発生する場合があります。詳細については、 Stripe の担当者にお問い合わせください。
返金をテストする
顧客に送信されたメールにリンクが記載された銀行口座情報の収集ページで、以下のテスト用の銀行口座を使用して、テスト環境で返金の動作をテストできます。このテスト用の銀行口座以外の銀行口座情報は受け入れられません。
金融番号 | 口座 | 種別 |
---|---|---|
1100000 | 0001234 | 返金は成功します。 |
|
| 返金は失敗します。 |
返金の有効期限をテストする
API コールを実行して、テスト環境の返金の有効期限をシミュレーションできます。
curl https://api.stripe.com/v1/test_helpers/refunds/{{REFUND_ID}}/expire \ -X POST \ -u
:sk_test_BQokikJOvBiI2HlWgH4olfQ2