目次一覧
状態:-
閲覧数:2,155
投稿日:2019-02-18
更新日:2019-05-07
2019/4/16
・「新しいStripe Checkoutがベータ版ではなくなったこと」を通知するメールを受信
2019/5/2
・ページ内容が更新される。具体的には、「Using Checkout with Connect」「Migration from legacy to new Checkout」ページで Ruby以外のコードも掲載されるようになる
・「Checkout (new)」表記が 「Checkout」表記へ変更される
・それに伴い、「Payments > PREPARING FOR SCA > Checkout (new)」だった目次階層が「Payments > COLLECTING PAYMENT DETAILS > Checkout」へ変更になる
・それに伴い、これまでの 「Checkout」は「legacy version」になり、ドキュメントの目次から外れる
Checkout Overview Beta / チェックアウトの概要 ベータ
Checkout Client Quickstart Beta / チェックアウトクライアントのクイックスタート ベータ
Checkout Server Quickstart Beta / チェックアウトサーバーのクイックスタート ベータ
Checkout Purchase Fulfillment Beta / チェックアウト購入フルフィルメント ベータ
Using Checkout with Connect / Connectでチェックアウトを使用する
Checkout Beta Migration Guide / チェックアウトベータ移行ガイド
・「新しいStripe Checkoutがベータ版ではなくなったこと」を通知するメールを受信
2019/5/2
・ページ内容が更新される。具体的には、「Using Checkout with Connect」「Migration from legacy to new Checkout」ページで Ruby以外のコードも掲載されるようになる
・「Checkout (new)」表記が 「Checkout」表記へ変更される
・それに伴い、「Payments > PREPARING FOR SCA > Checkout (new)」だった目次階層が「Payments > COLLECTING PAYMENT DETAILS > Checkout」へ変更になる
・それに伴い、これまでの 「Checkout」は「legacy version」になり、ドキュメントの目次から外れる
Checkout Overview Beta / チェックアウトの概要 ベータ
Checkout Client Quickstart Beta / チェックアウトクライアントのクイックスタート ベータ
Checkout Server Quickstart Beta / チェックアウトサーバーのクイックスタート ベータ
Checkout Purchase Fulfillment Beta / チェックアウト購入フルフィルメント ベータ
Using Checkout with Connect / Connectでチェックアウトを使用する
Checkout Beta Migration Guide / チェックアウトベータ移行ガイド
Checkout Overview / チェックアウトの概要
docs
Payments > PREPARING FOR SCA > Checkout (new)
・Checkout Overview
・チェックアウトの概要
チェックアウトを使用すると?
Webサイトで「1回限りの購入」と「subscription」の支払いを簡単に受け取ることができる
・チェックアウトは、顧客が安全に支払いの詳細を入力できる、Stripeでホストされているページ
・購入が完了すると、顧客はWebサイトに返送される
Checkoutを使用するには?
WebサイトまたはアプリケーションがHTTPS対応でなければならない
Checkoutの方法は2種類
A.クライアントのみ
・簡単に立ち上がるEコマースやsubscription事業
・静的商品、SKU、およびプランを作成することにより、サーバーサイドのAPIが不要になる
・これは、固定の製品リストまたは登録モデルを使用していて、できるだけ早く立ち上がって実行したい場合に最適
・ダッシュボードで商品やプランを追加してから、クライアントサイドのスニペットと統合する
・支払いを既存の顧客に関連付けることはできない
・Connect未サポート
B.サーバーシステム
・自己管理型製品カタログ、Connectサポート、最大限の柔軟性
・APIを使用
・顧客が購入する動的な金額と明細項目を設定し、購入のセマンティクスを細かく制御できる
・サーバーからセッションを作成するには、単位品目またはsubscriptionデータを渡す
・単位品目の支払いを既存の顧客に関連付けることができる
・Connectと連携する
Checkout Client Quickstart / チェックアウトクライアントのクイックスタート
docs
Payments > PREPARING FOR SCA > Checkout (new) > Checkout Client
・Checkout Client Quickstart
・チェックアウトクライアントのクイックスタート
・ダッシュボードで定義された商品やsubscriptionを販売するには、チェックアウトを使用する
・Dashboardを使用してSKUとプランを作成することで、CheckoutのClient-only を迅速に開始する
CheckoutのClient-only 開始
次の手順を使用して、顧客が商品やプランを購入するためのチェックアウトページを作成する
1.ダッシュボードでチェックアウトを有効にする
2.製品、SKU、計画を設定する
3.あなたのウェブサイトにチェックアウトを組み込む
※Checkoutを使用するには、WebサイトまたはアプリケーションがHTTPS対応でなければならない
ステップ1:ダッシュボードでチェックアウトを有効にする
Checkoutの使用を開始するには?
・Stripe Dashboardにログインし、 Checkout設定に移動して、[ Checkout を有効にする ]ボタンをクリックする
ステップ2:製品、SKU、および計画を設定する
販売予定の商品とサービスを定義
・ダッシュボードの[ 商品 ]セクションで、販売予定の商品とサービスを定義する
・新しい商品を作成するには、[ 商品 ]セクションに移動して[ 新規 ]ボタンをクリックし、販売する商品の種類を選択する
・指定した固有の名前と画像は、チェックアウト時に顧客に表示される
注意事項1.
・製品はテストモードとライブモードで別々に設定されている
・一方のモードで追加した製品は他方のモードでは使用できない
・ライブモードキーに切り替える前に、必ず製品をライブモードに設定してくれ
注意事項2.
アップロードする画像は 512 kb 未満にしてください
1回限りの購入商品を作成
・ダッシュボードで1回限りの購入商品を作成すると、Stripeはその商品と同じ名前でデフォルトのSKUを作成し、そのSKUのIDを生成する(生成されたIDを割り当てる)
・このSKU IDは、Checkoutで支払い処理を開始するときに、顧客が購入している商品をどのように参照するか、だ
subscriptionを作成
・ダッシュボードでProductを作成すると、 料金プランを定義するように求められる
・定期商品ごとに異なるパラメータを使用して、複数の料金プランを定義できる
・各プランには生成されたIDがあり、これを使用してチェックアウトプロセス中にプランを参照できる
・ここから無料試用版を定義することもできる
※Productはテストモードとライブモードで別々に設定されている。 一方のモードで追加したProductは他方のモードでは使用できない。 ライブモードキーに切り替える前に、必ずライブモードでProductを設定してくれ
ステップ3:あなたのウェブサイトにチェックアウトを組み込む
WebサイトにCheckoutを追加するには?
・目的のSKUまたはプランIDを含むコードを追加する必要がある
・ダッシュボードを使って必要なコードを生成することも、自分で書くこともできる
コードスニペットの役割
・ボタンをページに追加し、クリックすると顧客をCheckoutにリダイレクトする
・「クリックされると顧客をCheckoutにリダイレクトするボタン」をページに追加する
・顧客が支払いを正常に完了すると、コードスニペットの設定時に指定した成功URLにリダイレクトされる
・通常、これは、支払いが成功したことを顧客に知らせるためのWebサイト上のページだ
・キャンセルURLは、支払い処理をキャンセルしたときにCheckoutが顧客にリダイレクトするページだ
!要点
・「A.ダッシュボードで生成する」も「B.自分で書く」も結果は同じ。コードも同じ
・要は、コードを全て手入力するか、最低限必要事項のみをフォームへ入力してコード生成するか、の違い
A.ダッシュボードで生成する
・ダッシュボードの[ 商品 ]セクションで、販売する商品を選択する
・商品詳細ビューで、SKUの横にある[ Checkoutで使用 ]ボタンをクリックすると、Webサイトに追加できるコードスニペットが生成される
・スニペットをWebページの本文にコピーして貼り付けると、顧客をCheckoutにリダイレクトする支払いボタンが追加される
B.自分で書く
・チェックアウトはStripe.jsに依存している
・開始するには、Webサイトに次のスクリプトタグを含める
・これは常にhttps://js.stripe.comから直接ロードする必要がある
<script src="https://js.stripe.com/v3/"></script>
・次に、publishable APIキーを最初のパラメータとして指定して、Stripeオブジェクトのインスタンスを作成する
var stripe = Stripe('pk_test_xxxx');
・下記はbetaバージョンの頃(2019/04/15以前)の書き方
var stripe = Stripe(
'pk_test_xxxx',
{
betas: ['checkout_beta_4']
}
);
・顧客が支払いの準備ができたら、redirectToCheckoutを呼び出してチェックアウトプロセスを開始する
・SKUまたはプランIDと、顧客が購入したい各品目の数量を指定するオブジェクトの配列を渡す
stripe.redirectToCheckout({
items: [
// Replace with the ID of your SKU
{sku: 'sku_123', quantity: 1}
],
successUrl: 'https://your-website.com/success',
cancelUrl: 'https://your-website.com/canceled',
}).then(function (result) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
});
支払いが成功したら
あなたは顧客の購入処理を行うべきだ
・checkout_beta.session_succeededイベントがトリガーされたときに、購入を完了するためにwebhookを使用することができる
・checkout.session.completedイベントがトリガーされたときに、Webhookを使用して購入を完了できる
・Checkoutを使用した購入処理の処理の詳細については、 資料を参照してくれ
購入完了判定
・顧客が支払いを成功させたときにsuccessページにアクセスするとは限らないため、購入完了確認をsuccessページへのリダイレクトに頼るべきではない
「Checkoutによる購入の実現」で説明されている戦略のいずれかを使用してくれ
・以下のように、購入を遂行するためにsuccessUrlへのリダイレクトだけに頼らないでくれ
・悪意のあるユーザーは、支払いをせずにsuccessUrlに直接アクセスして、商品やサービスにアクセスする可能性がある
・顧客は、支払いが成功した後に必ずしもsuccessUrlに到達するとは限らない。 リダイレクトが発生する前にブラウザのタブを閉じる可能性がある
オプション:顧客データの事前入力
顧客のメールアドレスを既に知っている場合
・顧客が自分の支払い情報を二度入力する必要性を避けるために、あなたは、チェックアウトページに事前に記入したい顧客についての情報をすでに集めているかもしれない
・redirectToCheckout呼び出しでcustomerEmailを指定することで、チェックアウトページで顧客の電子メールを事前に入力できる
▼Checkout (new) betaバージョンではなくなった-client デモ1
stripe.redirectToCheckout({
items: [
// Replace with the ID of your SKU
{sku: 'sku_123', quantity: 1}
],
successUrl: 'https://your-website.com/success',
cancelUrl: 'https://your-website.com/canceled',
customerEmail: 'customer@example.com'
}).then(function (result) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
});
Checkout Server Quickstart / チェックアウトサーバーのクイックスタート
docs
Payments > PREPARING FOR SCA > Checkout (new) > Checkout Server
・Checkout Server Quickstart
・チェックアウトサーバーのクイックスタート
・Checkout Sessions APIを使用して、新しいCheckoutをすばやく開始する方法を学ぶ
Checkout Sessions APIを使用すると
SKUやプランに関連付けられていない「動的な金額」や「この目的のための単位品目」を提供できる
・既存のプランを使用してSubscriptionを作成することもできる
・Checkoutサーバーシステムで、クライアント上でCheckoutを開始するためのセッションをサーバー上に作成する
1.サーバーにチェックアウトセッションを作成する
2.あなたのウェブサイトにチェックアウトを追加する
※Checkoutを使用するには、WebサイトまたはアプリケーションがHTTPS対応でなければならない
ステップ1:サーバーにチェックアウトセッションを作成する
セッションを作成するときに
・Checkoutに1回限りの支払いまたは subscriptions を作成するように指示できる
- | 1回限りの支払い | Subscription |
---|---|---|
渡すパラメータ | line_items | subscription_data |
・機能にアクセスするためにベータフラグ( checkout_sessions_beta=v1 )を追加する必要がある
Stripe-Versionヘッダを設定したら
・新しいCheckoutで使用するCheckoutセッションを作成する準備が整った
・line_itemsまたはsubscription_data 、 cancel_url 、 success_url 、payment_method_typesを提供する必要がある
・セッション作成に使用できるパラメータの完全なリストについてはAPIリファレンスを参照してくれ
1回限りの支払い
・セッションを作成するときにline_itemsパラメータを使用する
・サーバーにチェックアウトセッションを作成する
・「クライアント上でCheckoutを開始するためのセッション」をサーバー上に作成しただけ。「支払いが作成されました」
※支払いはまだ実行されていないから、当然画面遷移もしない
・POST /v1/checkout/sessions
※stripe-phpのバージョンが古いとエラーが発生するので要注意。「v6.28.0」では「Fatal error」発生
・betaバージョンではなくなった(2019/04/16以降)書き方
// 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");
\Stripe\Checkout\Session::create([
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'line_items' => [[
'amount' => 500,
'currency' => 'jpy',
'name' => 'T-shirt',
'description' => 'Comfortable cotton t-shirt',
'images' => ['https://www.example.com/t-shirt.png'],
'quantity' => 1,
]]
]);
・betaバージョンの頃(2019/04/15以前)の書き方
▼Checkout (new) beta-server デモ1
// 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");
\Stripe\Checkout\Session::create([
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'line_items' => [[
'amount' => 2000,
'quantity' => 2,
'name' => 'Blue banana',
'currency' => 'usd',
'images' => ['https://www.example.com/banana.png']
]]
], [
'stripe_version' => '2018-11-08; checkout_sessions_beta=v1'
]);
subscriptions
・作成するには、セッションを作成するときにsubscription_dataパラメータを使用する
・サブスクリプションの詳細は、基本となるプランによって最初に決定される
・プランは、単価、請求期間、および通貨を決定する
・プランはプランAPIまたはダッシュボードから作成できる
// 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");
\Stripe\Checkout\Session::create([
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'subscription_data' => [
'items' => [
[
'plan' => 'plan_xyz',
],
],
],
]);
サーバーシステムによって作成されたセッション
・クライアントシステムによって作成されたセッションとは異なり、planレベルでtrial_period_daysが設定されたサブスクリプションの作成をサポートしない
・ 試用期間を設定するには、subscription_data.trial_period_days引数の値として希望の試用期間を渡してくれ
Stripe.jsシステムには
・session creation API レスポンスからのidフィールドが必要なので、 redirectToCheckoutを呼び出すJavaScriptまたはHTMLファイルでそれを利用できるようにしてくれ
ステップ2:あなたのウェブサイトにチェックアウトを追加する
WebサイトでCheckoutを使用するには
・前の手順で作成したセッションからのidフィールドを含むコードの断片を追加する必要がある
チェックアウトはStripe.jsに依存している
・始めるには、あなたのウェブサイトに次のscriptタグを含めてくれ
・これは常にhttps://js.stripe.comから直接ロードする必要がある
<script src="https://js.stripe.com/v3/"></script>
・次に、publishableなAPIキーを最初のパラメータとして指定して、Stripeオブジェクトのインスタンスを作成する
・betaバージョンではなくなった(2019/04/16以降)書き方
var stripe = Stripe('pk_test_xxxx');
・betaバージョンの頃(2019/04/15以前)の書き方
var stripe = Stripe(
'pk_test_xxxx',
{
betas: ['checkout_beta_4']
}
);
顧客が支払いの準備ができたら
・redirectToCheckoutを呼び出してチェックアウトプロセスを開始する
・これは、セッション作成からのIDをCheckoutのパラメータとして指定する場所だ
stripe.redirectToCheckout({
sessionId: '{{CHECKOUT_SESSION_ID}}'
}).then(function (result) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
});
このコードは
・通常、支払いボタンのクリックなど、顧客が行った操作に応答してトリガーされるイベントハンドラーから呼び出される
支払いが成功したら
・あなたは顧客の購入を果たすべきだ
・checkout.session.completedイベントがトリガーされたときに、Webhookを使用して購入を完了できる
・Checkoutを使用した購入履行の処理に関する詳細については、 資料を参照してくれ
「Checkoutによる購入の実現」で説明されている戦略のいずれかを使用してくれ
・次のように、購入を達成するためにsuccess_urlへのリダイレクトだけに頼らないでくれ
・悪意のあるユーザーは、支払いをせずにsuccessUrlに直接アクセスして、商品やサービスにアクセスする可能性がある
・顧客は、支払いが成功した後に必ずしもsuccessUrlに到達するとは限らない。 リダイレクトが発生する前にブラウザのタブを閉じる可能性がある
オプション:顧客データの事前入力
顧客のメールアドレスを既に知っている場合
・顧客が自分の支払い情報を二度入力する必要性を避けるために、あなたは、チェックアウトページに事前に記入したい顧客についての情報をすでに集めているかもしれない
・チェックアウトセッションを作成するときにcustomer_emailを指定することで、チェックアウトページで顧客の電子メールを事前に入力できる
▼Checkout (new) betaバージョンではなくなった-server デモ1
・顧客データ(メールアドレス)を事前入力
\Stripe\Checkout\Session::create([
'customer_email' => 'customer@example.com',
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'line_items' => [
[
'amount' => 500,
'currency' => 'jpy',
'name' => 'T-shirt',
'description' => 'Comfortable cotton t-shirt',
'quantity' => 1,
],
],
]);
※2019/4/17、名前空間おかしいので修正。'currency' => 'jpy'の後の,も追加
既存の顧客を使用する
1回払いをするときに使用するCheckoutの既存のCustomerオブジェクトを指定できる(これはまだプランや subscriptionsでは機能しない)
・そうすると、Checkoutが作成したStripeオブジェクトはその顧客に関連付けられる
・顧客を指定すると、Stripeは顧客に保存されている電子メールもチェックアウトページの電子メールフィールドに入力するために使用する
・顧客が「チェックアウト」ページで自分のEメールを変更すると、支払いが成功した後にその顧客オブジェクトで更新される
・POST /v1/checkout/sessions
・betaバージョンではなくなった(2019/04/16以降)書き方
▼Checkout (new) betaバージョンではなくなった-server デモ2
・顧客データ(メールアドレスのみ)が事前入力される(カード情報は顧客が入力する必要あり)
・入力したカード情報は、顧客に紐づけられるが、デフォルトカード情報が書き換えられるわけではない
・また、何回も支払いを行った場合(しかも同じカード情報を入力して)、同じ顧客に同じカード番号情報による支払い履歴が追加されていく(但しIDは異なる。支払い明細みたいなもの)
\Stripe\Checkout\Session::create([
'customer' => 'cus_xxxx',
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'line_items' => [
[
'amount' => 500,
'currency' => 'jpy',
'name' => 'T-shirt',
'description' => 'Comfortable cotton t-shirt',
'images' => ['https://www.example.com/t-shirt.png'],
'quantity' => 1,
],
],
]);
※2019/4/17、名前空間おかしいので修正。'currency' => 'jpy'の後の,も追加
・betaバージョンの頃(2019/04/15以前)の書き方
▼Checkout (new) beta-server デモ2
\Stripe\\Checkout\\Session::create([
'customer' => 'cus_123123',
'success_url' => 'https://www.example.com/success',
'cancel_url' => 'https://www.example.com/cancel',
'payment_method_types' => ['card'],
'line_items' => [
[
'amount' => 2000,
'currency' => 'usd',
'name' => 'Blue banana',
'quantity' => 2,
],
],
], [
'stripe_version' => '2018-11-08; checkout_sessions_beta=v1'
]);
・存在しないcustomerを指定するとエラー発生。( ! ) Fatal error: Uncaught Stripe\Error\InvalidRequest: No such customer: cus_123123
※2019/4/11、名前空間おかしいので修正。'currency' => 'usd'の後の,も追加
オプション:許可とキャプチャーを別々にする
・省略
Checkout Purchase Fulfillment / チェックアウト購入フルフィルメント
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 | 顧客が購入した商品を表すオブジェクトの配列。下表参照 | - |
Using Checkout with Connect / Connectでチェックアウトを使用する
docs
Payments > PREPARING FOR SCA > Checkout (new) > Using Checkout with Connect
・Using Checkout with Connect
・Connectでチェックアウトを使用する
・2019年4月11日時点で、PHPコードが掲載されていないため省略。恐らく作成中なのだと思われ。後で要チェック!
・2019/5/2。Ruby以外のコードも掲載された
Checkoutを使用してConnect DirectとDestinationの料金を作成する方法を学ぶ
・チェックアウトは、接続されたStripeアカウントを含むConnect directまたはdestinationの料金の作成をサポートする
・APIを介して自分で請求を作成するのではなく、Checkoutをサーバーシステムに組み込み 、Checkoutに請求を作成させる
直接請求
Checkoutを使用して接続アカウントに直接請求を作成するには
・サーバーシステムを使用して統合し、接続StripeアカウントのIDを指定する
・必要に応じて、支払いの一部をプラットフォームに転送するための申請料を指定できる
・結果として得られる「チェックアウト」ページは、接続先アカウントの会社名、アイコン、ロゴ、および色を使用してブランドが付けられる
Server側コード
▼Checkout (new) connect デモ1
・2019/5/3時点で、区切り文字がおかしいため修正
$checkoutSession = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],
'line_items' => [[
'name' => "Cucumber from Roger's Farm",
'amount' => 200,
'currency' => 'usd',
'quantity' => 10,
]],
'payment_intent_data' => [
'application_fee_amount' => 200,
],
'success_url' => 'https://xxxx/thanks.php',
'cancel_url' => 'https://xxxx/cancel.php',
], [
'stripe_account' => 'acct_xxxx',
]);
Client側コード
・子アカウントは再び手動で指定する必要がある
※$checkoutSessionからは取得できないたため
▼Checkout (new) connect デモ2
<script src="https://js.stripe.com/v3"></script>
<script>
// Initialize Stripe.js with the same connected account ID used when creating
// the Checkout Session.
const stripe = Stripe('pk_test_xxxx', {
stripeAccount: 'acct_xxxx',
});
stripe.redirectToCheckout({
// Pass the ID of the Checkout Session you created on your server.
sessionId: '<?php echo $checkoutSession->id; ?>',
}).then((result) => {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
});
</script>
Destination charges
・省略
ブランディング
プラットフォームアカウントとStandard Connectアカウントは
・ダッシュボードのブランド設定を介して独自のブランドを制御する
プラットフォーム
・Accounts APIを介してExpressアカウントとCustomアカウントのブランド設定を構成できる。
account update API
・ブランド設定のために以下のパラメーターを受け入れる
・icon。「チェックアウト」ページのヘッダーには、会社名の横にiconが表示される
・logo。指定した場合、[チェックアウト]ページのヘッダーにアイコンおよび会社名の代わりにlogoが表示される
・primary_color。チェックアウトページのさまざまなUI要素のアクセントカラーとして使用される
・このメソッドはテストモードでは使用不可。試すと下記エラーが発生する
( ! ) Fatal error: Uncaught Stripe\Error\InvalidRequest: Only live keys can access this method
▼Checkout (new) branding デモ1
・2019/5/4時点で、区切り文字がおかしいため修正
・第2引数の後に,があるとエラーが発生するため削除
\Stripe\Stripe::setApiKey("sk_test_xxxx");
$account = \Stripe\Account::update(
'acct_xxxx',
[
'settings' => [
'branding' => [
'icon' => 'file_123',
'logo' => 'file_456',
'primary_color' => '#663399',
],
],
]
);
Migration from legacy to new Checkout / レガシーから新しいチェックアウトへの移行
docs
Payments > PREPARING FOR SCA > Checkout (new) > Checkout Migration Guide
・Checkout Migration Guide
・レガシーから新しいチェックアウトへの移行
・2019年4月11日時点で、PHPコードが掲載されていないため省略。恐らく作成中なのだと思われ。後で要チェック!
・2019/5/2。Ruby以外のコードも掲載された
従来バージョンのCheckoutから新しいバージョンへの移行方法について説明する
Checkoutのレガシーバージョン
・カード情報を収集し、トークンまたはソースをあなたのウェブサイトに返すモーダルダイアログを顧客に提示した
新バージョンのCheckout
・Stripeがホストするスマートペイメントページで、支払いまたはsubscriptionsを作成する
・Apple Payとダイナミック3Dセキュアをサポートしている
・これから来る多くの機能に備えている
固定価格の簡易製品カタログ / client × 1回限りの支払
固定価格で少数の製品(少数のTシャツや電子書籍など)を販売している場合
・クイックスタートの指示に従って、ダッシュボードに商品を作成し、Webサイトに追加するコードスニペットを生成する
・新バージョンのCheckoutでは自動的に支払いが行われるため、サーバーのシステムは不要だ
▼Checkout (new) client デモ2
<script src="https://js.stripe.com/v3"></script>
<button id="checkout-button">Pay</button>
<div id="error-message"></div>
<script>
const stripe = Stripe('pk_test_xxxx');
const checkoutButton = document.querySelector('#checkout-button');
checkoutButton.addEventListener('click', () => {
stripe.redirectToCheckout({
items: [{
// Define the product and SKU in the Dashboard first, and use the SKU
// ID in your client-side code.
sku: 'sku_EYUuveVPe61SrH',
quantity: 1
}],
successUrl: 'https://xxxx/thanks.php',
cancelUrl: 'https://xxxx/cancel.php',
customerEmail: 'xxxx@yahoo.co.jp',
clientReferenceId: 'order_123',
})
.then(function (result) {
if (result.error) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
var displayError = document.getElementById('error-message');
displayError.textContent = result.error.message;
}
});
});
</script>
簡単なsubscriptions / client × subscription
単純なサブスクリプションサービス(ソフトウェアへの毎月のアクセスなど)を提供している場合
・クイックスタートの指示に従ってダッシュボードにプランを作成し、Webサイトに追加するコードスニペットを生成する
・新バージョンのCheckoutでは、顧客とsubscriptionsの両方が自動的に作成されるため、サーバーのシステムは不要だ
Checkoutの新バージョンでは
・サポートは予定されているが、サブスクリプションで既存のCustomersを再利用することはまだサポートされていない
▼Checkout (new) client-subscription デモ1
・上記「client デモ2」で、「skuパラメータ」を「planパラメータ」へ変更するだけ
<script src="https://js.stripe.com/v3"></script>
<button id="checkout-button">Pay</button>
<div id="error-message"></div>
<script>
const stripe = Stripe('pk_test_xxxx');
const checkoutButton = document.querySelector('#checkout-button');
checkoutButton.addEventListener('click', () => {
stripe.redirectToCheckout({
items: [{
// Define the product and plan in the Dashboard first, and use the plan
// ID in your client-side code.
plan: 'plan_EuDx4OLwYfha56',
quantity: 1
}],
successUrl: 'https://xxxx/thanks.php',
cancelUrl: 'https://xxxx/cancel.php',
customerEmail: 'xxxx@yahoo.co.jp',
clientReferenceId: 'order_123',
})
.then(function (result) {
if (result.error) {
// If `redirectToCheckout` fails due to a browser or network
// error, display the localized error message to your customer
// using `result.error.message`.
var displayError = document.getElementById('error-message');
displayError.textContent = result.error.message;
}
});
});
</script>
動的製品カタログと価格 / server → client × 1回限りの支払
金額や明細が動的に決定される商品を販売している場合(例えば、大規模な商品カタログや寄付など)
・クイックスタートの指示に従って、Checkout Sessions APIをアプリケーションに統合する
Checkoutのサーバーシステムの新バージョン
・従来とは流れが逆になっている
・最初にサーバー上にセッションを作成し、そのIDをクライアントへ渡し、顧客をCheckoutにリダイレクトする
・顧客は成功するとアプリケーションへリダイレクトされる
まずサーバー上にCheckoutセッションを作成する
▼Checkout (new) server デモ1-2、2
$checkoutSession = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],
'line_items' => [[
'name' => 'Custom t-shirt',
'description' => 'Your custom designed t-shirt',
'amount' => 500,
'currency' => 'jpy',
'quantity' => 1,
]],
'success_url' => 'https://example.com/success',
'cancel_url' => 'https://example.com/cancel',
]);
次に、セッションIDをクライアントへ渡して、支払いを完了するために顧客をCheckoutにリダイレクトする
const stripe = Stripe('pk_test_xxxx');
stripe.redirectToCheckout({
sessionId: '<?php echo $checkoutSession->id; ?>',
});
動的subscriptions / server → client × subscription
動的に決定される、または他の高度な機能のサポートを必要とするサブスクリプションサービスを提供している場合
・クイックスタートの指示に従って、Checkout Sessions APIをアプリケーションに統合する
Checkoutのサーバーシステムの新バージョン
・従来とは流れが逆になっている
・最初にサーバー上にセッションを作成し、そのIDをクライアントへ渡し、顧客をCheckoutへリダイレクトする
・顧客は成功するとアプリケーションへリダイレクトされる
Checkoutの新バージョンでは
・サポートは予定されているが、サブスクリプションで既存のCustomersを再利用することはまだサポートされていない
まずサーバー上にCheckoutセッションを作成する
▼Checkout (new) server-subscription デモ1
$session = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],
'subscription_data' => [
'items' => [[
'plan' => 'plan_123',
'trial_period_days' => 30,
]],
],
'success_url' => 'https://example.com/success',
'cancel_url' => 'https://example.com/cancel',
]);
次に、セッションIDをクライアントへ渡して、支払いを完了するために顧客をCheckoutへリダイレクトする
const stripe = Stripe('pk_test_xxxx');
stripe.redirectToCheckout({
sessionId: '{{CHECKOUT_SESSION_ID}}',
});
Connectプラットフォームとマーケットプレイス
Connectプラットフォームまたはマーケットプレイスを運営しており、接続アカウントを含む支払いを作成する
次の例では、Checkout Sessions APIを使用して直接請求を処理する
まず、接続アカウントの代わりにサーバー上にCheckoutセッションを作成してくれ
▼Checkout (new) server-connect デモ2
$checkoutSession = \Stripe\Checkout\Session::create([
'payment_method_types' => ['card'],
'line_items' => [[
'name' => "Cucumber from Roger's Farm",
'amount' => 200,
'currency' => 'jpy',
'quantity' => 10,
]],
'payment_intent_data' => [
'application_fee_amount' => 200,
],
'success_url' => 'https://xxxx/thanks.php',
'cancel_url' => 'https://xxxx/cancel.php',
], [
'stripe_account' => 'acct_xxxx',
]);
次に、セッションIDをクライアントへ渡して、支払いを完了するために顧客をCheckoutへリダイレクトする
・Stripe.jsを初期化するときは、必ず接続アカウントのIDを指定してくれ
const stripe = Stripe('pk_test_xxxx', {
stripeAccount: 'acct_xxxx',
});
stripe.redirectToCheckout({
// Pass the ID of the Checkout Session you created on your server.
sessionId: '<?php echo $checkoutSession->id; ?>',
})
Checkout Beta Migration Guide / チェックアウトベータ移行ガイド
docs
・Checkout Beta Migration Guide
・チェックアウトベータ移行ガイド
・このガイドは、Checkoutの新バージョンのパブリックベータ版からアップグレードするユーザーを対象としている
Source の代わりに Payment Methods
Checkoutのベータ版
・Sourceを作成した
Checkout
・PaymentMethodを作成する
「Customersの sourcesプロパティ」または「PaymentIntentsの sourceプロパティ」に依存していた場合
・上記変更はあなたに影響する
Webhook の変更
checkout.session.completedイベント
・引き続きcheckout_beta.session_succeededイベントを送信するが、代わりにcheckout.session.completedイベントの処理に移行することをお勧めする
・checkout.session.completed Webhookには、 Checkout Sessionsオブジェクトが含まれている
Subscription と Customer の変更
Checkoutベータ版から移行すると
・Checkoutが作成するサブスクリプションの動作がわずかに変わる
Checkoutのベータ版はSourceを作成し、それを作成したCustomerのdefault_sourceとして設定した
・移行後、CheckoutはPaymentMethodを作成し、作成したサブスクリプションのdefault_payment_methodとして設定する
Checkoutのベータ版では、サブスクリプションの成功したCheckout Sessionsはpayment_intentとsubscription両方のプロパティに値があった
・移行後、サブスクリプションの成功したCheckout Sessionオブジェクトには、 subscriptionプロパティの値しかなく、 payment_intentプロパティは空白になる
・それでも最初の請求書の支払い詳細にアクセスしたい場合は、 session.subscription.latest_invoice.payment_intentを使用できる