カテゴリー:
documentation
閲覧数:399 配信日:2019-04-10 12:00
docs
Payments > PREPARING FOR SCA > Checkout (new) > Checkout Purchase Fulfillment
・Checkout Purchase Fulfillment
・チェックアウト購入フルフィルメント
・Checkoutで商品を購入する方法を学ぼう
Checkoutで商品を購入する方法
顧客がCheckoutを使用して支払いを正常に完了すると?
・StripeはsuccessUrlパラメーターで指定した宛先に顧客をリダイレクトする
・通常、支払いが成功したことを顧客に通知するページ
あなたは購入完了確認をsuccessUrlページへのリダイレクトに頼るべきではない
次のように、購入を達成するためにsuccess_urlへのリダイレクトだけに頼らないでくれ
・悪意のあるユーザーは、支払いをせずにsuccessUrlに直接アクセスして、商品やサービスにアクセスする可能性がある
・顧客は、支払いが成功した後に必ずしもsuccessUrlに到達するとは限らない。 リダイレクトが発生する前にブラウザのタブを閉じる可能性がある
ダッシュボードで購入を実現
ユーザーが支払いを正常に完了すると?
・ダッシュボードの支払いリストに新しいエントリとして記録される
リストのエントリをクリックすると?
・支払い詳細ページへ移動する
[ Checkout サマリ ]セクション
・顧客の請求先情報と購入した商品のリストを確認できる
・この情報を使用して、顧客の購入を手動で履行することができる
注意事項
・ダッシュボードの履行(手動によるフルフィルメント)は通常、電子メールで顧客に送信できるデジタル商品に対してのみ実用的だ
・実際の商品を含む購入品を処理する予定の場合は、あなたのアプリケーションで出荷詳細を収集する必要がある
!Stripeは、顧客が支払いを正常に完了したときにEメール通知を送信することで、入金についていくのに役立つ。 ダッシュボードを使用して電子メール通知を設定する
Webhookで商品を購入する
Webhookイベント
・StripeはWebhookイベントをあなたのサーバーへ送信して、顧客が支払いを完了したときに通知することができる
・イベント用のハンドラを作成し、それを使用して顧客の購入を履行するために必要なコードをすべて実行できる
・Webフックイベントを処理するには、あなたのサーバー上にHTTPエンドポイントを作成し、ダッシュボードで Webフックエンドポイントを設定する
Checkoutの支払いが成功すると?
・Stripeはcheckout_beta.session_succeededイベントを送信する
・Stripeはcheckout.session.completedイベントを送信する
・Webhookペイロードには、顧客が購入したSKUまたはプランの配列、Checkoutによって作成されたPaymentIntentオブジェクトのID 、およびredirectToCheckout呼び出しで指定されている場合はオプションのclientReferenceIdが含まれている
・clientReferenceIdは、成功した支払いを購入に関連付けるために使用される
・Webhookペイロードには、Customer、PaymentIntent、またはSubscriptionに関する情報を含むCheckout Sessionオブジェクト、およびクライアントでredirectToCheckoutを呼び出すときに指定した場合はオプションでclient_reference_idが含まれる
▼Checkout (new) betaバージョンではなくなった-server デモ1-2
・handle_checkout_session()はユーザ定義関数なので、関数を作成しないと「Uncaught Error: Call to undefined function handle_checkout_session()」エラーが発生する
// 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");
// 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();
}
// Handle the checkout.session.completed event
if ($event->type == 'checkout.session.completed') {
$session = $event->data->object;
// Fulfill the purchase...
//handle_checkout_session($session);
var_dump($session);
}
http_response_code(200); // PHP 5.4 or greater
Webhook のテストのエラー: Timed out
・しばらく時間を置いて、再度試す
受取例
stdClass::__set_state(array(
'id' => 'evt_1E6I74JiXAQvfxv3iGbGoRcu',
'object' => 'event',
'api_version' => '2019-02-19',
'created' => 1550757682,
'data' =>
stdClass::__set_state(array(
'object' =>
stdClass::__set_state(array(
'object' => 'checkout_beta',
'client_reference_id' => NULL,
'display_items' =>
array (
0 =>
stdClass::__set_state(array(
'currency' => 'jpy',
'amount' => 10000,
'type' => 'sku',
'quantity' => 1,
'sku' => 'sku_EYUuveVPe61SrH',
)),
),
'line_items' => NULL,
'livemode' => false,
'payment_intent' => 'pi_1E6I6eJiXAQvfxv3IMxgerR9',
)),
)),
'livemode' => false,
'pending_webhooks' => 1,
'request' =>
stdClass::__set_state(array(
'id' => NULL,
'idempotency_key' => NULL,
)),
'type' => 'checkout_beta.session_succeeded',
))
・Webhookペイロードのpayment_intentプロパティを取得し、PaymentIntentのsource.ownerプロパティを調べることで、顧客の電子メールアドレスと請求先情報を取得できる
・Webhookペイロードのcustomer 、 payment_intent 、およびsubscriptionプロパティで参照されるCustomer、PaymentIntent、またはSubscriptionの各オブジェクトを取得することで、顧客、支払い、または購読に関する情報を取得できる
イベントのポーリングによる購入の実現
/v1/eventsエンドポイントをポーリング
・新しいcheckout.session.completedイベントについて/v1/eventsエンドポイントをポーリングすることで、Checkoutを介して行われた新しい支払いを定期的に確認できる
・その後、新しいcheckout.session.completedイベントを検出したときに顧客の購入を満たすために必要なコードを実行できる
Checkoutの支払いが成功すると
・Stripeはcheckout.session.completedイベントを生成する
・Webhookペイロードには、Customer、PaymentIntent、またはSubscriptionに関する情報を含むCheckout Sessionオブジェクト、およびクライアントでredirectToCheckoutを呼び出すときに指定した場合はオプションでclient_reference_idが含まれる
次の例
・過去24時間のcheckout.session.completedイベントをすべて取得する方法を示している
※2019/4/18時点でコピペするとエラー発生するため、以下修正
・名前空間区切り文字を追加
・"created"パラメータの値は、オブジェクトではなく配列に格納
・$sessionオブジェクトに対するアクセス書式を修正
$events = \Stripe\Event::all([
"type" => "checkout.session.completed",
"created" => [
"gte" => time() - 24 * 60 * 60
]
]);
foreach ($events->autoPagingIterator() as $event) {
$session = $event->data->object;
// Fulfill the purchase...
//handle_checkout_session($session);
var_dump($session);
}
次の表は、 checkout_beta.session_succeeded Webフックに存在するキーと値をまとめたもの
キー | 内容 | 備考 |
---|---|---|
subscription | プランが使用された場合は、作成されたサブスクリプションのID | - |
payment_intent | 顧客の支払いに使用された確認済みPaymentIntentのID | - |
client_reference_id | チェックアウトセッションを参照するための一意の文字列。 これは、顧客ID、カートIDなど。 これは購入を履行するために使用することができる | オプション。redirectToCheckout呼び出しで指定されている場合のみ、含まれている |
display_items | 顧客が購入した商品を表すオブジェクトの配列。下表参照 | - |