カテゴリー:
documentation
閲覧数:535 配信日:2019-04-23 09:38
docs
Payments > PREPARING FOR SCA > Payment Intents > Usage > Verifying Payment Status
・Verifying Payment Status
・支払い状況の確認
・PaymentIntentのステータスを確認し、それをWebフックで監視する方法を学ぶ
・PaymentIntentsは、顧客または支払方法によって実行されたアクションに応じて更新される
・システムによってPaymentIntentを検査して、支払いプロセスの「status」を判別し、さらに介入が必要な「status」に対応することが出来る
クライアントでPaymentIntentのステータスを確認する
自動確認でhandleCardPayment関数を使用してクライアントで支払いを完了すると
・返されたPaymentIntentを調べて現在のステータスを確認できる
await stripe.handleCardPayment(clientSecret);
・PaymentIntentsデモ4-2に下記コードも含まれる
(async () => {
let {paymentIntent, error} = await stripe.handleCardPayment(clientSecret);
if (error) {
// Handle error here
} else if (paymentIntent && paymentIntent.status === 'succeeded') {
// Handle successful payment here
}
})();
handleCardPaymentによって返された "promise"は、支払いプロセスが完了したとき、またはエラーで失敗したときに解決される
・正常に完了し、PaymentIntentを返した場合、ステータスは常に「成功」または「require_capture」の何れかだ
・支払いに認証などの追加の手順が必要な場合、その手順が完了するかタイムアウトするまで「promise」は解決されない
handleCardPayment関数を使用せずにPaymentIntentのステータスを確認したい場合
・retrievePaymentIntent関数を使用してクライアントシークレットを渡すことで、それを個別に取得できる
(async () => {
let {paymentIntent, error} = await stripe.retrievePaymentIntent(clientSecret);
if (error) {
// Handle error here
} else if (paymentIntent && paymentIntent.status === 'succeeded') {
// Handle successful payment here
}
})();
・Stripe Q36。What is the difference between “stripe.handleCardPayment (clientSecret)” and “stripe.retrievePaymentIntent (clientSecret)”?
サーバーでPaymentIntentのステータスを確認する
手動確認を使用してサーバーで支払いを完了するとき
・PaymentIntentのstatusプロパティを調べて支払いが正常に完了したかどうかを判断できる
支払いが3Dセキュア認証などの追加のアクションを必要とする場合
・PaymentIntentのステータスはrequire_actionに設定される
・支払いが成功すると、ステータスは「成功」に設定され、支払いは完了する
・支払いが失敗した場合、ステータスはneeds_payment_methodに設定される
Webhookを使ってPaymentIntentを監視する
Webhookイベントをサーバーへ送信
・Stripeは、 PaymentIntentのstatusが変化したときに通知するために、 Webhookイベントをサーバーに送信できる
・これは、 自動確認を使用するときに顧客が購入した商品およびサービスをいつ履行するかを決定するなどの目的に役立つ
非同期で完了を処理
・顧客は支払いが完了した後、フルフィルメントプロセスが開始される前にページを離れる可能性があるため、システムではクライアント側で注文のフルフィルメントを処理しないでくれ
・代わりに、Webフックを使用してpayment_intent.succeededイベントを監視し、クライアント側で履行を開始するのではなく非同期でその完了を処理することを強くお勧めする
ポーリング使用は注意が必要
・非同期操作による変更を監視するためにwebhookの代わりにポーリングを使用してPaymentIntentを繰り返し取得し、そのステータスを確認することは技術的には可能だが、これは信頼性が著しく低く、大規模で使用すると問題が生じる可能性がある
・StripeはAPIリクエストにレート制限を強制するため、ポーリングを使用することにした場合は注意が必要だ
Webフックイベントを処理するには
・サーバー上にルートを作成し、ダッシュボードで対応するWebフックエンドポイントを設定する
・支払いが成功した場合、Stripeはpayment_intent.succeededイベントを送信し、支払いが成功しなかった場合はpayment_intent.succeededイベントを送信する
Webhookペイロードには
・PaymentIntentオブジェクトが含まれている
次の例は、両方のイベントを処理する方法を示している
・PaymentIntentsデモ9-1
// You can find your endpoint's secret in your webhook settings
$endpoint_secret = 'whsec_...';
$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, $endpoint_secret
);
} catch(\UnexpectedValueException $e) {
// Invalid payload
http_response_code(400); // PHP 5.4 or greater
exit();
} catch(\Stripe\Error\SignatureVerification $e) {
// Invalid signature
http_response_code(400); // PHP 5.4 or greater
exit();
}
if ($event->type == "payment_intent.succeeded") {
$intent = $event->data->object;
printf("Succeeded: %s", $intent->id);
http_response_code(200);
exit();
} elseif ($event->type == "payment_intent.payment_failed") {
$intent = $event->data->object;
$error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
printf("Failed: %s, %s", $intent->id, $error_message);
http_response_code(200);
exit();
}
・Stripe Q37。PaymentIntentで支払いを行った後、成功画面を表示させるためにはどうすれば良いですか?
・Stripe Q38。Difference between “paymentIntent.status === 'succeeded'” and “payment_intent.succeeded event of Webhook”
支払いが失敗した場合
・PaymentIntentのlast_payment_errorプロパティを調べることで詳細を確認できる
・支払いが完了していないことを顧客に通知し、別の支払い方法でやり直すように促すことができる
・同じPaymentIntentを再利用して、顧客の購入の追跡を続ける
特定のWebhookイベントを処理する
次のリストは、Webhookイベントを処理する方法を説明している
イベント | 何が起こった | 期待される統合 |
---|---|---|
succeeded | 顧客の支払いは成功した | 顧客が購入した商品またはサービスを履行する |
amount_capturable_updated | 顧客の支払いは承認され、回収の準備ができている | 支払いに利用できる資金を集める |
payment_failed | 顧客の支払いがカードネットワークによって拒否されたか、その他の方法で期限が切れた | Eメールまたはプッシュ通知で顧客に連絡を取り、別の支払い方法を提供するように促す |
PaymentIntentでchargeを特定する
PaymentIntentが顧客から支払いを回収しようとすると、chargeオブジェクトが作成される
・PaymentIntentのchargeプロパティを調べて、試みられたchargeの完全なリストを取得できる
PaymentIntentデモ5
// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
\Stripe\Stripe::setApiKey("sk_test_xxxx");
$intent = \Stripe\PaymentIntent::retrieve("pi_xxxx");
$charges = $intent->charges->data;
chargeは時系列の逆順にリストされているため、最新のchargeが配列の先頭になる
・この配列には、最後の成功したcharge金額に加えて、支払い処理中に発生した失敗したcharge額も含まれている
次のアクションを処理する
・省略
リダイレクトによる3D Secure認証の手動処理
・省略