Stripe Payments > PREPARING FOR SCA > Payment Intents

Stripedocumentation

目次一覧

 状態:確認中  閲覧数:2,191  投稿日:2019-03-08  更新日:2019-04-25  
Payment Intents API

Payment Intents Quickstart / Payment Intents クイックスタート

Payment Intents Migration Guide / Payment Intents 移行ガイド

Migrating to Payment Intents with Automatic Confirmation / 自動確認による Payment Intents への移行

Payment Intents Usage Guide / Payment Intents 使用ガイド

Creating PaymentIntents / PaymentIntentsを作成する

Verifying Payment Status / 支払い状況の確認

Off-session Payments with Payment Intents / Payment Intents を使用したオフセッション支払

Payment Methods API

Saving Payment Methods / 支払い方法を保存する

Payment Intents API

 閲覧数:342 投稿日:2019-03-08 更新日:2019-04-19 

docs


Payments > PREPARING FOR SCA > Payment Intents
PaymentIntents Overview
PaymentIntentsの概要
・Stripeの新しい「基本的な支払いAPI」であるPaymentIntentsについて学んでくれ

動的支払いフローを構築するための新しい方法だ


将来的には、PaymentIntentsがStripe上のすべての支払いコレクションを強化することを期待している

SCAに対応している


・省略

仕組みを見る


PaymentIntentオブジェクト
・status属性を介して支払いの状態を追跡する
・支払いが成功すると、PaymentIntentのステータスがsucceededに変わり、自信を持って注文を処理できる

Payment Intents APIは、2つのアクションを中心にしている
< Create >
・チェックアウトフローの開始時にPaymentIntentを作成すると、注文に対する支払いの試行をすべて追跡できる

< Confirm >
・PaymentIntentを確認すると、支払いプロセス全体を通じて支払いが行われる
・PaymentIntentは、confirmを使用してサーバー上で、またはStripe.jsおよびモバイルSDKを使用してクライアント上で確認できる

1回限りの支払いを受け入れる


1回払いでは
・通常、すぐに請求される支払いの詳細が収集され、領収書の送信、注文の発送、データベース内の何かの支払い済みとしてのマーク付けなどのアクションで注文を処理する
・支払いの実行方法に応じて、Stripeにクライアントで自動的に支払いを確認させることも、支払いが認証された後にサーバーで手動でPaymentIntentを確認することもできる
・表を使用して、自動確認と手動確認の間のトレードオフを理解してくれ

自動確認
・Payment Intents API を起動する最も簡単な方法
・クライアントで支払いを確認し、支払い後ロジックにWebフックを使用する

手動確認
・Charges APIから直接移行する最も簡単な方法
・サーバーで支払いを確認してすぐに追加のロジックを実行する

比較一覧表
自動確認 手動確認
支払いを確認する場所 クライアント サーバ
支払いが成功した後の処理 非同期 同期
Webhook 使用 未使用

セッション外支払いフロー


・省略

一目で


PaymentIntentによって試行された料金の全履歴は、PaymentIntentの chargesプロパティに格納される

Payment Intents Quickstart / Payment Intents クイックスタート

 閲覧数:246 投稿日:2019-03-08 更新日:2019-04-23 

docs


Payments > PREPARING FOR SCA > Payment Intents > Quickstart
PaymentIntents Quickstart
PaymentIntentsクイックスタート
・PaymentIntentsでの支払いを受け取る方法を学ぶ
・ElementsとPayment Intents APIを使用して1回限りの支払いを行い、カード決済を受け入れる方法を学ぶ

支払いの完了方法に応じて


「Payment Intents API」を使用してカードの支払いを受け取る方法が2つある
・自動確認と手動確認だ

自動確認フロー
・クライアントでの支払いを確認し、支払いが成功したときにWebフックを使用して通知する

手動確認フロー
・サーバーでの支払いが確認され、支払いが成功した直後にサーバーで支払いを実行できる

自動確認のクイックスタート


自動確認
・Payment Intents API を使用するための最も早い方法だ
・カードの3Dセキュア認証など、一部の支払い方法には非同期フローがあるため、自動確認システムでは、支払い後ロジックを処理するためにWebフックを使用する必要がある

処理の流れ
場所 処理内容
Server -
-
Client confirm
-
Webhooks fulfill
PaymentIntentsとStripe Elementsを使用したカード支払いの受け入れ
※サーバーサイドとクライアントサイドのアクションを伴う5段階のプロセスである
・1.サーバーで PaymentIntent を作成する
・2.PaymentIntent のクライアントシークレットをクライアントへ渡す(クライアントサイドで PaymentIntent のクライアントシークレットを利用可能にする)
・3.(「Stripe Elements」を設定後、)クライアントで支払い方法の詳細を収集する
・4.クライアントからStripeへ支払いを送信する
・5.顧客の注文を非同期的に処理する

ステップ1:サーバーで PaymentIntent を作成する


PaymentIntent
・顧客から支払いを集めるというあなたの意図を表し、各段階を通して支払いプロセスのライフサイクルを追跡するオブジェクトである
・PaymentIntentを作成するときに、通貨、許可されたソースタイプ、および顧客から集金したい金額収集したい金額と通貨を指定する
・次の例は、サーバーにPaymentIntentを作成する方法を示している

PaymentIntentデモ1-0
・payment_method_typesパラメータを未指定
デフォルトは[“ card”]
// 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::create([
 'amount' => 1099,
 'currency' => 'jpy',
]);


PaymentIntentデモ1-1
・payment_method_typesパラメータを明示的に指定
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "eur",
 "payment_method_types" => ["card"],
]);


顧客がチェックアウトプロセスを開始したときなど、金額が判明したらすぐにPaymentIntentを作成することをお勧めする
・カート小計の更新時や配送料と税金の計算時など、金額が変更された場合は、金額を更新できる
・顧客から集金する金額がチェックアウトプロセス中に変更された場合(例えば、カート内の小計が変更された場合、または配送料と税金が計算された場合)、それに応じてPaymentIntentオブジェクトを更新する

次の例は、PaymentIntentの金額を更新する方法を示している
・第1引数で 'pi_xxxx'として指定している内容は、PaymentIntentオブジェクトのid
・存在しないidを指定すると、「Fatal error: Uncaught Stripe\Error\InvalidRequest: No such payment_intent」エラーが発生する
・PaymentIntentデモ1-2
// 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\PaymentIntent::update(
 'pi_xxxx',
 [
   'amount' => 1499,
 ]
);


ステップ2:PaymentIntentのクライアントシークレットをクライアント側へ渡す


クライアントサイドでPaymentIntentのクライアントシークレットを利用可能にする
・PaymentIntentオブジェクトには、 クライアントシークレット(client_secretプロパティ) 、つまり「請求を作成するためにクライアント側のStripe.jsへ渡す必要がある一意のキー」が含まれている
・アプリケーションでサーバーサイドレンダリングを使用している場合は、テンプレートフレームワークを使用して、 データ属性または hidden のHTML要素を使用してクライアントシークレットをページに埋め込む

PaymentIntentデモ2
// 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 = # ... Fetch or create the PaymentIntent;
$intent1 = \Stripe\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
]);

$intent2 = \Stripe\PaymentIntent::update(
 $intent1['id'],
 [
   'amount' => 1499,
 ]
);
?>

<input id="cardholder-name" type="text">
<!-- placeholder for Elements -->
<div id="card-element"></div>
<button id="card-button" data-secret="<?php echo $intent2->client_secret; ?>">
 Submit Payment
</button>


各PaymentIntentは通常、アプリケーション内の単一の「カート」または顧客セッションと相関している
・チェックアウト時にPaymentIntentを作成し、そのIDをアプリケーションのデータモデルのユーザーのカートに保存して、必要に応じて再度取得することができる

クライアントシークレットを使用して、PaymentIntentに指定された金額で支払い処理を完了することができる
・ログに記録したり、URLに埋め込んだり、顧客以外に公開したりしないでくれ
・クライアントシークレットを含むページでTLSが有効になっていることを確認してくれ

ステップ3:(「Stripe Elements」を設定後、)クライアントで支払い方法の詳細を収集する


PaymentIntentsはStripe.jsと完全に統合されている
・Elementsを使用してクライアント側で安全に支払い情報を収集し、それをStripeへ送信して料金を作成する
・Elementsを使い始めるには、あなたのウェブサイトに次のスクリプトタグを含める
<script src="https://js.stripe.com/v3/"></script>


PCIに準拠するためには
・このスクリプトを常にjs.stripe.comから直接ロードする必要がある
・バンドルに含めたり、自分でコピーをホストすることはできない

Stripeの高度な詐欺機能を最大限に活用するには
・チェックアウトページだけでなく、サイトのすべてのページにこのスクリプトを含める
・すべてのページにスクリプトを含めることで、StripeはユーザーがWebサイトを閲覧したときに詐欺を示す可能性がある異常な動作を検出することができる

Stripeオブジェクトのインスタンス
・次に、最初のパラメータとして publishable APIキーを指定して、 Stripeオブジェクトのインスタンスを作成する
・PaymentIntentsのStripe.js機能にアクセスするためのオプションとして、以下に示すbetas値も必ず指定してくれ
・Elementsオブジェクトのインスタンスを作成し、それを使用してCard要素をページ内の適切なプレースホルダにマウントする

・正式版のコード
const stripe = Stripe('pk_test_xxxx');

const elements = stripe.elements();
const cardElement = elements.create('card');
cardElement.mount('#card-element');


・payment_intent_beta_3バージョンの頃のコード
const stripe = Stripe('pk_test_××××', {
 betas: ['payment_intent_beta_3']
});

const elements = stripe.elements();
const cardElement = elements.create('card');
cardElement.mount('#card-element');


ステップ4: クライアントからStripeへ支払いを送信する


支払いを完了するには
・2番目のステップで利用可能になったクライアントシークレットを取得する
・data属性からクライアントシークレットを取得したら、 stripe.handleCardPaymentを使って支払いを完了する

・正式版のコード
const cardholderName = document.getElementById('cardholder-name');
const cardButton = document.getElementById('card-button');
const clientSecret = cardButton.dataset.secret;

cardButton.addEventListener('click', async (ev) => {
 const {paymentIntent, error} = await stripe.handleCardPayment(
   clientSecret, cardElement, {
     payment_method_data: {
       billing_details: {name: cardholderName.value}
     }
   }
 );

 if (error) {
   // Display error.message in your UI.
   console.log(error);
 } else {
   // The payment has succeeded. Display a success message.
   console.log("成功");
 }
});


・payment_intent_beta_3バージョンの頃のコード
const cardholderName = document.getElementById('cardholder-name');
const cardButton = document.getElementById('card-button');
const clientSecret = cardButton.dataset.secret;

cardButton.addEventListener('click', async (ev) => {
 const {paymentIntent, error} = await stripe.handleCardPayment(
   clientSecret, cardElement, {
     source_data: {
       owner: {name: cardholderName.value}
     }
   }
 );

 if (error) {
   // Display error.message in your UI.
   console.log(error);
 } else {
   // The payment has succeeded. Display a success message.
   console.log("成功");
 }
});


システムがSCA対応であることを確認するには
・顧客の名前、Eメール、請求先住所、および配送先住所(ある場合)を stripe.handleCardPayment 呼び出しに必ず提供してくれ

認証など、支払いを完了するために顧客が追加の手順を実行する必要がある場合
・Stripe.jsはその手順を実行する
・支払いが正常に完了すると、返されたPaymentIntentのstatusプロパティの値はsucceededである
・支払いが成功しなかった場合は、返されたerrorを調べて原因を特定できる

ステップ5: 顧客の注文を非同期的に処理する


//中略

支払いが成功したときに通知を受けて履行を促進するには、非同期イベントを処理する必要がある

注文を処理する方法はいくつかある
・ウェブフックを設定する
//中略

PaymentIntentが顧客から支払いを回収しようとすると、chargeオブジェクトが作成される
・PaymentIntentの charges プロパティを調べて、試行されたchargeの完全なリストを取得できる
※retrieveメソッドの第1引数で 'pi_xxxx'として指定している内容は、PaymentIntentオブジェクトのid
・課金は時系列の逆順にリストされているため、最新の料金が配列の先頭になる
・この配列には、最後の成功した課金金額に加えて、支払い処理中に発生した失敗した課金額も含まれている

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;


・Stripe.jsから返されたPaymentIntentを使用して、顧客の支払いが成功または失敗したときに直ちに顧客にフィードバックを提供できる
・ただし、支払いを受け取った時点でフルフィルメントを推進する場合は、一貫性を維持するために、サーバー上でpayment_intent.succeededイベントとpayment_intent.payment_failedイベントを監視することをお勧めする

手動確認のクイックスタート


・省略

システムをテストする


テストすることが重要
・「追加の認証を必要とするカード」と「ユーザーにとって最もスムーズなチェックアウトエクスペリエンスを保証しないカード」を正しく処理していることを確認するために、Payment Intents API システムを徹底的にテストすることが重要だ
・さまざまな種類のカードをシミュレートするためにテストモードで使用できるテストカードがある

システムを検証するために使用する必要がある2枚のテストカード
・3Dセキュア必須および3Dセキュア不要のカード
・これらのカード番号は、「将来の有効期限」と「3桁のCVCコード」(を入力すること)で使用できる

一覧表
カード番号 3Dセキュアな使い方 説明
4000000000003220 必須 このテストカードはすべてのトランザクションで3D Secure 2を必要とし、テストモードで3D Secure 2をトリガーする
4000000000003055 サポートしているが必須ではない このテストカードは3D Secure 2をサポートしているが必須ではなく、テストモードで追加の認証手順を必要とする
・アプリケーションまたは支払いデモで、これらのカードを使用して、さまざまな動作を確認してくれ

ビューポートメタタグの要件


すべてのデバイスで優れたユーザーエクスペリエンスを提供するには
・ページのビューポートwidthをdevice-widthに設定する必要がある
・これはviewportメタタグで行われる
・他にもいくつかのビューポート設定があり、必要に応じて設定できる
・設定のどこかにwidth=device-widthを含めるようにしてくれ

・例えば、次のものはElementsで動作する
<meta name="viewport" content="width=device-width, initial-scale=1" />

・あなたのページにすでにこのタグがあり、それにwidth=device-width含まれていれば、すべて設定済みだ

width=device-widthを設定せずにElementsを使用しても機能するが
・とにかく追加することを強くお勧めする
・以下省略

Payment Intents Migration Guide / Payment Intents 移行ガイド

 閲覧数:268 投稿日:2019-04-08 更新日:2019-04-22 

docs


Payments > PREPARING FOR SCA > Payment Intents > Migration Guide
Payment Intents Migration Guide
Payment Intents 移行ガイド
・既存システムをPayment Intents APIへ移行する方法を学ぶ
・手動確認を使用して、既存のカードとCharges APIのシステムをPayment Intents APIへ移行する方法を学ぶ

既存のカードとCharges API システム から移行する場合
・「手動で確認する」ことをお勧めする。これが移行するための最速の方法だ

ウェブフックに慣れている場合
・自動確認を使用することをお勧めする
・自動確認は、支払いの収集に必要な操作を自動的に処理する

注意事項


手動確認を使用する予定はないため、
・以下の日本語訳は最新へアップデートしていない
→ 以前(2019/4/8時点)に掲載されていた情報に基づく日本語訳のため、注意が必要





































新しいフロー


Payment Intents APIは、Stripeによる支払いを受け入れるための新しいフローを導入した
・トークン化された支払い情報をサーバーに送信して手動で請求オブジェクトを作成する代わりに、まずサーバー上にPaymentIntentを作成してから、Stripe.jsまたはStripeのモバイルSDKの1つを使用してクライアント側で支払いプロセスの完了を開始する
・このアプローチは前のモデルを逆にするので、あなたはこのAPIを採用するためにあなたの既存のトークンまたはソースベースのStripeシステムの重要な部分を並べ替える必要があるかもしれない

Payment Intents APIフローを従来のシステムと比較する


Elementsを使用してクレジットカードでの支払いを受け付ける従来のトークンベースのStripeシステムには、通常次の手順が含まれる
・Elementsを使用してブラウザで顧客の支払い情報を集める
・Stripe.jsで支払い情報をトークン化する
・サーバーにトークンを送信するためのリクエストを実行する
・トークンを使用して、希望する金額と通貨でサーバーに請求を作成する
・支払いが成功したら、顧客の注文を履行する

比較すると、同等のPayment Intents APIシステムには通常、次の手順が含まれる
・希望する金額と通貨であなたのサーバーにPaymentIntentを作成する
・PaymentIntentのクライアントシークレットをクライアントサイドに送信する
・Elementsを使用してブラウザで顧客の支払い情報を集める
・Stripe.jsまたはモバイルSDKを使用してダイナミック3Dセキュアを実行し、クライアント側で支払いを完了する
・支払いが成功した場合は、サーバーのWebフックを使用して顧客の注文を処理する

移行のための戦略


あなたの支払いフローを移行するのは大変なことだ
・Payment Intents APIをCharges APIと並行して使用することは安全だ
・私たちの目標は、できるだけ段階的に移行できるようにすることだ
・この目的のために、私たちはあなたの変更を以下のステップに分割することを勧める

課金から読み取るコードを移行する
システムを移行する
・アップグレードされたシステムが3D Secure認証を処理することを確認するために3D Secureテストカードで各支払いフローを必ずテストしてくれ

課金から読み取るコードの移行


chargeオブジェクトには2つの新しいプロパティpayment_method_detailsbilling_detailsがある
・これらは、課金に使用された支払い方法の詳細を読み取るための一貫したインターフェースを提供する
・これらのフィールドは、すべてのAPIバージョンと、 charges APIとPayment Intents APIの両方で作成されたchargeオブジェクトで使用できる

次の表は、課金でよく使用されるプロパティと、新しいプロパティを使用して同じ情報にアクセスする方法を示している
・省略

Webシステムを移行する / Elements


Stripe.js&Elementsを使用して構築されたシステムは、以下のステップで構成されている
・サーバー側で支払いを回収するintentを登録する
・クライアント側で支払いの詳細を集める
・支払いの作成を開始
・サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバーにPaymentIntentを作成し、それをクライアント側からアクセスできるようにする必要がある
Not possible before
Stripe::PaymentIntent.create({
 amount: 1099,
 currency: 'eur',
})
2 クライアント側で支払い詳細を収集する
handleCardPayment関数を使用して、支払い情報を収集し、それをStripeに直接送信する
const {token} =
 await stripe.createToken(
   cardElement
 );
const {paymentIntent, error} =
 await stripe.handleCardPayment(
   INTENT_SECRET_FROM_STEP_1,
   cardElement
 );
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに課金を作成することだ。前の手順で呼び出されたhandleCardPayment関数によって課金の作成が開始されるため、これは不要になった
charge = Stripe::Charge.create(
 source: FROM_PREVIOUS_STEP,
 amount: 1099,
 currency: 'eur',
)
Completed in previous step
4 顧客の注文を処理する
StripeはPayment Intents APIシステムで非同期に料金を発生させるため、Webフックを使用して支払いがいつ正常に完了したかを判断する必要がある。 顧客の支払いが成功した後で注文の履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

Webシステムを移行する / 支払いリクエストボタン


Stripe.js paymentRequest API
・従来のPaymentRequestシステムで取得されたトークンを使用してそれをPaymentIntentに添付することによって、Payment Intents APIと連携する

PaymentRequestを使用して構築されたシステムは、以下のステップで構成されている
・サーバー側で支払いを回収するintentを登録する
・クライアント側で支払いの詳細を集める
・支払いの作成を開始
・サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバーにPaymentIntentを作成し、それをクライアント側からアクセスできるようにする必要がある
Not possible before
Stripe::PaymentIntent.create({
 amount: 1099,
 currency: 'eur',
})
2 クライアント側で支払い詳細を収集する
PaymentRequestオブジェクトのtokenイベントをリッスンする。これは、支払いプロセスがいつ完了したかを示すために使用できるトークンとコールバック関数を提供する。
このシステムをPayment Intents APIをサポートするように調整するには、サーバーにトークンを送信するのではなく、handleCardPayment関数を使用してトークンIDを渡す。 handleCardPayment関数によって返されたpromiseが解決したら、完了コールバックを呼び出す
paymentRequest.on(
 'token',
 ({token, complete}) => {
   // Send the token to the server
   // Invoke the callback when done
   complete(success);
});
paymentRequest.on(
 'token',
 ({token, complete}) => {
   stripe.handleCardPayment(
     INTENT_SECRET_FROM_STEP_1,
     {token: token}
   ).then(({
     paymentIntent,
     error,
   }) =>
     complete(error ? 'fail' : 'success')
   );
});
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに課金を作成することだ。前の手順で呼び出されたhandleCardPayment関数によって課金の作成が開始されるため、これは不要になった
charge = Stripe::Charge.create(
 source: FROM_PREVIOUS_STEP,
 amount: 1099,
 currency: 'eur',
)
Completed in previous step
4 顧客の注文を処理する
StripeはPayment Intents APIシステムで非同期に料金を発生させるため、Webフックを使用して支払いがいつ正常に完了したかを判断する必要がある。 顧客の支払いが成功した後で注文の履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

Webシステムを移行する /  Legacy Checkout


従来のCheckoutを使用している場合
・新しいCheckoutにアップグレードする
・これは、Stripeで支払いを受け取る最も早い方法だ
・それを使うと、あなたは一度限りの支払いと購読を受け入れることができる
・サーバーでStripe APIを使用せずにCheckoutを使用することもできる

代わりに独自のチェックアウトフローを作成したい場合
・Elementsに切り替えてくれ

Elementsにアップグレードしたと仮定すると、次の手順で構成されるPayment Intents APIシステムを構築できる
・サーバー側で支払いを回収するintentを登録する
・クライアント側で支払いの詳細を集める
・支払いの作成を開始
・サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバーにPaymentIntentを作成し、それをクライアント側からアクセスできるようにする必要がある
Not possible before
Stripe::PaymentIntent.create({
 amount: 1099,
 currency: 'eur',
})
2 クライアント側で支払い詳細を収集する
返されたソースをサーバーに送信する代わりに、handleCardPayment関数を使用する。この関数は支払い情報を収集してそれをStripeに直接送信する
StripeCheckout.configure({
 // ...configuration
 source: (source) => {
   // send source.id to your server
 },
});
const {paymentIntent, error} =
 await stripe.handleCardPayment(
   INTENT_SECRET_FROM_STEP_1,
   cardElement // from Elements
 );
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに課金を作成することだ。前の手順で呼び出されたhandleCardPayment関数によって課金の作成が開始されるため、これは不要になった
charge = Stripe::Charge.create(
 source: FROM_PREVIOUS_STEP,
 amount: 1099,
 currency: 'eur',
)
Completed in previous step
4 顧客の注文を処理する
StripeはPayment Intents APIシステムで非同期に料金を発生させるため、Webフックを使用して支払いがいつ正常に完了したかを判断する必要がある。 顧客の支払いが成功した後で注文の履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する


Migrating to Payment Intents with Automatic Confirmation / 自動確認による Payment Intents への移行

 閲覧数:284 投稿日:2019-04-09 更新日:2019-04-23 

docs


Payments > PREPARING FOR SCA > Payment Intents API > Migration Guide > Automatic Confirmation
Migrating to Payment Intents with Automatic Confirmation
自動確認による Payment Intents への移行
・自動確認を使用して、既存のカードとCharges APIのシステムをPayment Intents APIへ移行する方法を学ぶ

従来の Charges API システムとの比較


Elementsを使用してカードでの支払いを受け付ける従来のトークンベースのStripeシステムには、通常次の手順が含まれる
・Elementsを使用してブラウザで顧客の支払い情報を集める
・Stripe.jsで支払い情報をトークン化する
・サーバーにトークンを送信するためのリクエストを実行する
・トークンを使用して、希望する金額と通貨でサーバーに請求を作成する
・支払いが成功したら、顧客の注文を履行する

比較すると、自動確認を使用したPayment Intents API システムには通常、次の手順が含まれる
・希望する金額と通貨でPaymentIntentを(あなたの)サーバー上に作成する
・PaymentIntentのクライアントシークレットをクライアントサイドに送信する
・Elementsを使用してブラウザで顧客の支払い情報を集める
・Stripe.jsまたはモバイルSDKを使用してダイナミック3Dセキュアを実行し、クライアント側で支払いを完了する
・支払いが成功した場合は、サーバーのWebフックを使用して顧客の注文を処理する 

移行のための戦略


あなたの支払いフローを移行するのは大変なことだ
・Payment Intents APIを徐々に採用し、Charges APIと並行して使用するのが安全だ
・そのために、移行を次の手順に分割することをお勧めする
・1.APIのバージョンとクライアントライブラリを更新する
・2.該当する場合は、Charges APIとPayment Intents APIによって作成された請求書の間に一貫した読み取りパスができるように、 請求書から読み取るコードを移行する
・3.Payment Intents APIを使用するために、 Web 、 iOS 、およびAndroid上の既存のCharges APIシステムを移行する
・4.「Customerオブジェクトにカードを保存するシステム」を移行する
・5.アップグレードされたシステムが3D Secure認証を処理することを確認するために、3D Secureテストカードでテスト

APIのバージョンとクライアントライブラリを更新する


Payment Intents APIはすべてのAPIバージョンで機能するが
・最新のAPIバージョンにアップグレードすることをお勧めする

2019-02-11よりも古いAPIバージョンを使用する場合
・コード例を見ながら次の2つの変更点に注意してくれ

requires_source
・require_payment_methodに改名された

requires_source_action
・require_actionに改名された

また、Stripe社のAPIライブラリの何れかを使用している場合
・Payment Intents APIを使用するために最新バージョンのライブラリにアップグレードしてくれ


Webシステムを移行する / Elements


Stripe.js&Elementsを使用して構築されたシステムは、以下のステップで構成されている
・1.サーバー側で支払いを回収するintentを登録する
・2.クライアント側で支払いの詳細を集める
・3.支払いの作成を開始する
・4.サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバー上にPaymentIntentを作成し、それをクライアント側からアクセスできるようにする
以前は不可能だった
Stripe::PaymentIntent.create({
 amount: 1099,
 currency: 'jpy',
})
2 クライアント側で支払い詳細を収集する
handleCardPayment関数を使用して、支払い情報を収集し、それをStripeへ直接送信する
const {token} =
 await stripe.createToken(
   cardElement
 );
const {paymentIntent, error} =
 await stripe.handleCardPayment(
   INTENT_SECRET_FROM_STEP_1,
   cardElement
 );
if (error) {
 // Display error.message in your UI.
} else {
 // The payment has succeeded
 // Display a success message
}
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに課金を作成することだ。前の手順で呼び出されたhandleCardPayment関数によって課金の作成が開始されるため、これは不要になった
$charge = \Stripe\Charge::create([
   'source' => '{{FROM_PREVIOUS_STEP}}',
   'amount' => 1099,
   'currency' => 'jpy',
]);
前のステップで完了
4 サーバー側で顧客の注文を処理する
自動確認では、クライアント側での顧客の行動に基づいて料金が非同期で自動的に作成されるため、Webフックを監視して支払いが正常に完了した時期を判断する必要が必要がある。 顧客の支払いが成功した後で注文履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

Webシステムを移行する / 支払いリクエストボタン


Stripe.js paymentRequest API
・従来のPaymentRequestシステムで取得されたトークンを使用してそれをPaymentIntentに添付することによって、Payment Intents APIと連携する

PaymentRequestを使用して構築されたシステムは、以下のステップで構成されている
・サーバー側で支払いを回収するintentを登録する
・クライアント側で支払いの詳細を集める
・支払いの作成を開始
・サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバーにPaymentIntentを作成し、それをクライアント側からアクセスできるようにする必要がある
Not possible before
Stripe::PaymentIntent.create({
 amount: 1099,
 currency: 'jpy',
})
2 クライアント側で支払い詳細を収集する
PaymentRequestオブジェクトのtokenイベントをリッスンする。これは、支払いプロセスがいつ完了したかを示すために使用できるトークンとコールバック関数を提供する。
このシステムをPayment Intents APIをサポートするように調整するには、サーバーにトークンを送信するのではなく、handleCardPayment関数を使用してトークンIDを渡す。 handleCardPayment関数によって返されたpromiseが解決したら、完了コールバックを呼び出す
paymentRequest.on(
 'token',
 ({token, complete}) => {
   // Send the token to the server
   // Invoke the callback when done
   complete(success);
});
paymentRequest.on(
 'paymentmethod',
 ({paymentMethod, complete}) => {
   // First, confirm the PaymentIntent to
   // see if there are any payment errors.
   const {error: confirmError} =
     await stripe.confirmPaymentIntent(
       INTENT_SECRET_FROM_STEP_1
     );

   if (confirmError) {
     // Complete with 'fail' and show error:
     complete('fail');
   } else {
     // Otherwise, close the Payment Request
     // modal and call handleCardPayment
     // to complete any potential actions
     // required.
     complete('success');
     const {error, paymentIntent} =
       await stripe.handleCardPayment(
         INTENT_SECRET_FROM_STEP_1,
       );

     // Handle payment error, if any.
   }
 }
);
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに課金を作成することだ。前の手順で呼び出されたhandleCardPayment関数によって課金の作成が開始されるため、これは不要になった
$charge = \Stripe\Charge::create([
   'source' => '{{FROM_PREVIOUS_STEP}}',
   'amount' => 1099,
   'currency' => 'jpy',
]);
前のステップで完了
4 顧客の注文を処理する
自動確認では、クライアント側での顧客の行動に基づいて料金が非同期で自動的に作成されるため、Webフックを監視して支払いが正常に完了した時期を判断する必要がある。 顧客の支払いが成功した後で注文履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

Webシステムを移行する /  Legacy Checkout


従来のバージョンのCheckoutを使用している場合
・新しいCheckoutへアップグレードする
・これは、Stripeで支払いを受け取る最も早い方法だ
・それを使うと、あなたは一度限りの支払いと購読を受け入れることができる
・サーバーでStripe APIを使用せずにCheckoutを使用することもできる
Checkoutの移行ガイドに従って、既存の統合を移行する

代わりに独自のチェックアウトフローを作成したい場合
・Elementsに切り替えてくれ

Elementsにアップグレードしたと仮定すると
・(上記の)Elements移行ガイドを使用してPayment Intents API統合を構築できる

「顧客オブジェクトにカードを保存するシステム」の移行


ヨーロッパに拠点を置き、強力な顧客認証の準備をしている場合、7月1日以降では
・次回のオフセッション支払いのためにカードを保存するとき、認証を実行して、オフセッション免除の資格を得る必要がある
・このAPIは7月1日までに利用可能になるだろう

チェックアウトフローでカードを保存する


チェックアウトフローでカード情報を収集するPayment Intents APIシステムは、次の手順で構成されている
・1.サーバー側で支払いを回収する intentを登録する
・2.クライアント側で支払い詳細を収集する
・3.支払いの作成を開始する
・4.サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
顧客の支払いを処理するには、まずサーバー上にPaymentIntentを作成し、支払い方法を保存する顧客のIDを設定する。 次に、PaymentIntentをクライアント側でアクセス可能にする
以前は不可能だった
Stripe::PaymentIntent.create({
 'customer' => '{{CUSTOMER_ID}}',
 amount: 1099,
 currency: 'jpy',
})
2 クライアント側で支払い詳細を収集する
「支払い情報を収集してStripeへ直接送信するhandleCardPayment関数」と「提供された支払い方法を顧客に添付するsave_payment_method」を使用する
const {token} =
 await stripe.createToken(
   cardElement
 );
const {paymentIntent, error} =
 await stripe.handleCardPayment(
   '{{INTENT_SECRET_FROM_STEP_1}}',
   cardElement,
   {save_payment_method: true},
 );
2 クライアント側で支払い詳細を収集する
既存のシステムでは、支払方法を顧客に添付するには別の手順が必要だ。 handleCardPayment関数が提供された支払い方法を顧客に添付するので、これはもう必要ない
$card = \Stripe\Customer::createSource(
 '{{CUSTOMER_ID}}',
 [
   'source' => '{{TOKEN_OR_SOURCE}}',
 ]
);
handleCardPayment関数で完了した
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに請求を作成することだ。前の手順で呼び出されたhandleCardPayment関数が請求の作成を開始するため、これは不要になった
$charge = \Stripe\Charge::create([
   'source' => '{{FROM_PREVIOUS_STEP}}',
   'customer' => '{{CUSTOMER_ID}}',
   'amount' => 1099,
   'currency' => 'jpy',
]);
前のステップで完了
4 サーバー側で顧客の注文を処理する
自動確認では、クライアント側での顧客の行動に基づいて料金が非同期で自動的に作成されるため、Webフックを監視して支払いが正常に完了した時期を判断する必要が必要がある。 顧客の支払いが成功した後で注文履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

チェックアウトフロー外でのカードの保存


チェックアウトフローの外でカードを保存する場合
・既存のシステムとPayment Methods APIのシステムとの間には2つの違いがある

クライアント側
・createTokenまたはcreateSourceの代わりにcreatePaymentMethod関数を使用してくれ

BEFORE
const {token} =
 await stripe.createToken(
 // or stripe.createSource
   cardElement
 );

AFTER
const {paymentMethod} =
 await stripe.createPaymentMethod(
   'card',
   cardElement
 );


サーバー側
・Customers APIの代わりにPayment Methods APIを使用して、Customerオブジェクトに支払い方法を添付する

BEFORE
$card = \Stripe\Customer::createSource(
 '{{CUSTOMER_ID}}',
 [
   'source' => '{{TOKEN_FROM_STEP_1}}',
 ]
);

AFTER
$payment_method = \Stripe\PaymentMethod::retrieve('{{PAYMENT_METHOD_ID}}'))
$payment_method->attach(['customer' => '{{CUSTOMER_ID}}']);


保存したカードで支払う


顧客がチェックアウトフローで支払う「保存済みの支払方法を選択できるようにするシステム」は、次の手順で構成されている
・1.サーバー側で支払いを回収する intentを登録する
・2.クライアント側で顧客の保存した支払い方法から支払い詳細を収集する
・3.支払いの作成を開始する
・4.サーバー側で顧客の注文を処理する
ステップ 処理内容 BEFORE AFTER
1 サーバー側で支払いを回収するintentを登録する
以前に保存した支払い方法で支払いをするときは、CustomerオブジェクトのIDでPaymentIntentを作成する
以前は不可能だった
Stripe::PaymentIntent.create({
 'customer' => '{{CUSTOMER_ID}}',
 amount: 1099,
 currency: 'jpy',
})
2 クライアント側で顧客の保存した支払い方法から支払い詳細を収集する
handleCardPayment関数を使用して、支払い情報を収集し、それをStripeへ直接送信する
顧客の選択した保存済みソースIDをサーバーに送信してくれ
const {paymentIntent, error} =
 await stripe.handleCardPayment(
   INTENT_SECRET_FROM_STEP_1,
   {payment_method: PAYMENT_METHOD_ID}
   // An existing Card or Source ID
   // can also be used
 );
if (error) {
 // Display error.message in your UI.
} else {
 // The payment has succeeded
 // Display a success message
}
3 支払いの作成を開始する
既存のシステムでは、最後のステップはトークン化された支払い情報を使用してサーバーに請求を作成することだ。前の手順で呼び出されたhandleCardPayment関数が請求の作成を開始するため、これは不要になった
$charge = \Stripe\Charge::create([
   'source' => '{{FROM_PREVIOUS_STEP}}',
   'customer' => '{{CUSTOMER_ID}}',
   'amount' => 1099,
   'currency' => 'jpy',
]);
前のステップで完了
4 サーバー側で顧客の注文を処理する
自動確認では、クライアント側での顧客の行動に基づいて料金が非同期で自動的に作成されるため、Webフックを監視して支払いが正常に完了した時期を判断する必要が必要がある。 顧客の支払いが成功した後で注文履行などの手順を実行するには、Webhookのサポートを実装し、payment_intent.succeededイベントを監視する
課金が成功したら、履行してくれ payment_intent.succeeded Webhookイベントを監視し、Webhookハンドラーを実行する

保存した支払い方法にアクセスする


顧客の以前に保存されたCards、Sources、およびPaymentMethodsを表示するには
・customerオブジェクトのsourcesプロパティを読み取る代わりに支払い方法を一覧表示する
・顧客に追加された新しいPaymentMethodsが顧客オブジェクトのsourcesプロパティに重複しないため、これが必要だ

BEFORE
customer->sources

AFTER
\Stripe\PaymentMethod::all(['customer' => '{{CUSTOMER_ID}}', 'type' => 'card']);


Payment Intents Usage Guide / Payment Intents 使用ガイド

 閲覧数:1,109 投稿日:2019-04-10 更新日:2019-04-26 

docs


Payments > PREPARING FOR SCA > Payment Intents > Usage
Payment Intents Usage
Payment Intents 使用ガイド
・Payment Intents APIのすべての機能の使い方を学ぶ

非同期支払いフロー
・アプリケーションの外部で発生するユーザー操作に依存するため、管理が複雑だ
・Payment Intents APIは、PaymentIntentオブジェクト内で支払いのスstatusプロパティを追跡することによってこれを簡素化する
・これは、ペイメントライフサイクルの中で唯一の真実のsourceとして機能する

PaymentIntent オブジェクト内にある status プロパティの概要


PaymentIntentの目的
・成功ステータスを取得することだ
・そこに着くためにあなたは3つのことをする必要がある
・PaymentIntentを作成する
・有効な支払い方法を添付してくれ
・PaymentIntentを確認する

PaymentIntentでは
・資金不足や支払いの詳細が正しくない場合に、追加の認証手順または新しい支払い方法が必要になる場合がある
・この状態は、PaymentIntent オブジェクトの status プロパティに反映される

status プロパティには(取り得る)7つの値がある
PAYMENTINTENT STATUS 説明
requires_payment_method PaymentIntentを作成すると、支払い方法を添付するまでステータスはrequire_payment_methodになる
requires_confirmation 「支払い方法を指定したPaymentIntent」を確認する準備が整った
requires_action PaymentIntentを確認すると、Stripeは免除を利用してユーザーを認証せずに支払いを完了する。 支払い方法で追加の認証が必要な場合、PaymentIntentのステータスはrequire_actionになる
processing 必要なアクションが処理されると、PaymentIntentは処理に移る
requires_capture カードを保留にするために承認とキャプチャを別々に行う場合は、PaymentIntentを作成するときにcapture_methodをmanualに設定する。 それから、カードを認証するためにconfirmを呼び出し、資金を獲得する準備ができたら捕捉する
canceled あなたは成功する前にいつでもPaymentIntentをキャンセルすることができる
succeeded 成功のステータスを持つPaymentIntentは、支払いが完了し、資金があなたのアカウントにあることを意味する。 PaymentIntentが成功した後、顧客に返金する必要がある場合はRefunds APIを使用してくれ
ダッシュボードで PaymentIntentのステータスを確認できる

例1:一時支払いの作成


クイックスタートでは
・Payment Intents APIを使用して1回限りの支払いを処理する方法について説明する
・1回限りの支払いは、「支払いの詳細を収集して直ちに請求することを必要とする」eコマース注文または寄付のようなものだ
・注文をどのように満たすかに応じて、選択する2つのフローがある

自動確認
・クライアントでPaymentIntentを確認する
・これを実行するには、Webフックなどの非同期プロセスを使用する必要がある

手動確認を使用すると
・サーバー上のPaymentIntentを確認してすぐに注文を処理できる

例2:後で請求するためにカードを保存する


以前に保存した支払い方法の請求を処理する方法
・2つある

支払い方法の詳細を収集して後で請求するには、「Payment Intents API」オフセッションフローを使用する
・PaymentIntentがrequire_actionを要求したときに、電子メールまたはアプリの通知を送信して、ユーザーに認証を手動で依頼する必要がある

Stripe BillingのSubscription APIを使用する
・これは、PaymentIntentがrequire_actionステータスになったときにカスタマイズ可能なEメールを自動的に送信することによって、追加認証をユーザーに求めることを処理する

例3:PaymentIntentsのキャンセルと返金


顧客からの支払いを集めるためにPaymentIntentを使用する予定がなくなった場合
・PaymentIntentをキャンセルできる
・PaymentIntentのキャンセルはオプションだ
・PaymentIntentをrequire_confirmationやrequire_payment_methodのような不完全な状態にしても大丈夫だ
・不完全なPaymentIntentsは、チェックアウト時のコンバージョン率を理解するのに役立つ
// 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");
$intent->cancel();


paymentIntentは
・require_payment_method、require_capture、require_confirmation、require_actionの何れかのステータスがある場合にのみキャンセルできる
・PaymentIntentは、アクティブに処理されている間、または成功した後でキャンセルすることはできない

PaymentIntentがキャンセルされると
・追加料金を支払うためにそれを使用することはできなくなる
・キャンセルされたPaymentIntentに対してアプリケーションが実行しようとした操作はすべてエラーで失敗する

成功ステータスに達した後にPaymentIntentを返金するには
・Refunds APIを使用する

例4:課金せずにカードを保留にする


Stripeは2段階のカード支払いをサポートしているので、最初にカードを認証してから、後で資金を獲得するのを待つことができる
・支払いが承認されると、資金はカード発行者によって保証され、その金額は最大7日間、顧客のカードに保持される
・支払いがこの時間内に取得されない場合、PaymentIntentと承認は両方ともキャンセルされ、資金が解放される

別々の認証と取得が必要であることを示すには
・PaymentIntentを作成するときにcapture_methodオプションの値をmanualに設定する必要がある
・これにより、ストライプは顧客のカードの金額のみを承認するようになる
// 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\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
 'payment_method_types' => ['card'],
 'capture_method' => 'manual',
]);


承認された資金を取得するには
・PaymentIntentcapture要求を行う
・合計承認額はデフォルトで取り込まれ、これ以上取り込むことはできない
・最初の金額(例えば、10ドルの承認に対して8ドル)より少ない金額を取得するには、amount_to_captureオプションを渡す
・部分的にキャプチャすると自動的に残りの金額が解放される

次の例は、承認された支払いから資金を集める方法を示している
// 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');
$intent->capture(['amount_to_capture' => 750]);


承認をキャンセルする必要がある場合
・PaymentIntentをキャンセルできる

一部の発行者からのカード明細書では
・承認と取得(決済)された支払いが区別されていないため、顧客に混乱を招くことがある
・また、承認された支払いは1回しかキャプチャできない
・支払いの一部を取得した場合は、その差に対して別の取得を実行できない
・必要に応じて、後で顧客のカードの詳細を保存し、必要に応じて将来の支払いを作成することで、よりよいサービスを受けることができる

さらに、顧客が手動取得でPaymentIntentの支払い処理を完了すると
・payment_intent.amount_capturable_updatedイベントが発生する
・PaymentIntentのamount_capturableプロパティを調べて、PaymentIntentから取得できる合計金額を確認できる

カードによる支払いのみが
・個別の承認とキャプチャをサポートする
・他の支払い方法(例えば、ACHまたはiDEAL)は、最初に許可されてから捕捉されることはできない

例5:Apple PayとGoogle Payで Payment Intents を使用する


Payment Intents APIを使用して、 Apple PayやGoogle Payなどのモバイルカードウォレットを受け取ることができる
・Web上では、Apple Pay、Google Pay、Microsoft Pay、およびPayment Request APIのための単一のシステムを提供するPayment Requestボタンを使用してくれ

例6:Connectedアカウントに代わって請求する


Stripeは、 接続アカウントに代わって料金を作成するためのいくつかのアプローチをサポートしている

1つのアプローチは直接請求だ
・そこでは接続されたアカウントは、Stripe料金、払い戻し、およびチャージバックの費用に対して責任がある
・PaymentIntentを使って直接請求を行うには、PaymentIntentを作成するときに接続アカウントのIDを指定する
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
], ["stripe_account" => "{{CONNECTED_ACCOUNT_ID}}"]);


さらに、Payment Intents APIは
・自動的に接続アカウントへの転送を作成し、接続アカウントを支払いの記録として使用することをサポートする

transfer_data [destination]
・転送を受け取るべき接続アカウントのIDだ

on_behalf_ofパラメータ
・支払いの記録上の取引先として使用する接続アカウントのIDだ
・設定すると、自動的にストライプが(下記を)処理する
・指定されたアカウントの国で料金を決済し、それにより減少を最小限に抑え、通貨換算を回避する
・接続先アカウントの国の料金体系を使用する
・アカウントがプラットフォームと異なる国にある場合は、接続されたアカウントのアドレスと電話番号が(プラットフォームではなく)顧客のクレジットカード明細書に表示される

transfer_groupパラメータ
・PaymentIntentによって作成されたすべての請求に伝播され、同じように動作する
・最後に、application_fee_amountパラメータを指定して、申請料を差し控えることができる

// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "application_fee_amount" => 200,
 "payment_method_types" => ["card"],
 "on_behalf_of" => "{{CONNECTED_ACCOUNT_ID}}",
 "transfer_data" => [
   "destination" => "{{CONNECTED_ACCOUNT_ID}}"
 ]
]);




















※以下は、(2019年4月前半)以前に掲載されていた内容の日本語訳

Payment Intents APIを使用して構築されたStripeシステム


通常、次の4つのステップに従う
・1.顧客がチェックアウトプロセスを開始したら、サーバー上に新しいPaymentIntentを作成する
・2.クライアントサイドでPaymentIntentのクライアントシークレットを利用できるようにする
・3.クライアント側でStripe.jsを使用して支払い情報を収集し、課金を開始し、必要な次のアクションを処理する
・4.必要に応じて、Webフックを使用して課金の成否を監視および処理する

Payment Intents APIを使用する場合、課金の作成はクライアント側で開始され、Stripeのサーバーで行われる
・ある意味では、プロセスは非同期だ
・成功または失敗を示す応答がサーバーにすぐに送信されることはない
・そのため、顧客が購入した商品およびサービスをいつ履行する必要があるかを判断するには、Webフックを利用する必要がある

Payment Intents APIが必要とするアプローチ
・クライアント側でStripe.jsを使用して顧客の支払い情報をトークン化し、それをサーバーに送信して課金を作成する、より伝統的なStripeモデルの逆だ
・このAPIと直接課金の作成との違いの詳細については、 移行ガイドを参照してくれ。
・Payment Intents APIとの完全なStripeシステムを構築する方法を示すステップバイステップの説明については、 支払いのクイックスタートを参照してくれ

PaymentIntentのライフサイクル


各PaymentIntentは、使用中に複数の状態に遷移するオブジェクトだ
・PaymentIntentは、1回の課金が成功した時点で最終ステータス( succeeded )になる
・PaymentIntentで実行された課金が失敗した場合は、同じPaymentIntentを使用して、顧客が正常に完了するまで追加の課金を試行することができる

以下は、PaymentIntentが通常トランザクション中に進行する段階だ
・1.新しいPaymentIntentを作成すると、require_payment_methodステータスから始まる。これは、(顧客が入力する)支払い方法情報を待っていることを示す
・2.顧客が支払い方法情報を提供すると、アプリケーションが課金の実行を試みることを確認するまで、PaymentIntentのステータスはrequires_confirmationに進む
・3.追加の認証情報の入力を求めるなど、追加の手順を含む支払い方法を顧客が使用する場合、PaymentIntentはそれを追跡してそのステータスをrequire_actionに更新し、next_actionプロパティに、顧客が次の作業を完了するのに役立つ関連情報を入力する
・4.課金の試行が確認され、実行するアクションがそれ以上残っていない場合、課金が続行され、PaymentIntentのステータスがprocessingに進む
・5.課金が正常に完了すると、PaymentIntentは満たされ、そのステータスはsucceededに変わる。PaymentIntentが1回の成功した課金を完了した後は、PaymentIntentによるこれ以上の課金は試行できない

プロセスの途中で支払いが失敗した場合
・PaymentIntentのステータスはneeds_payment_methodにリセットされる
・初期状態に戻ったときに、顧客にもう一度やり直すように促すことができる
・必要に応じて、別の支払い方法で行うこともできる
・PaymentIntentによって試行された課金の全履歴は、PaymentIntentのchargesプロパティに格納される

特定の状況下で発生する可能性がある2つの追加の状態がある
・PaymentIntentをキャンセルすると、そのステータスはcancelledに変わる
・キャンセル後は、PaymentIntentに追加料金を課金することはできない
・システムで2段階のカード支払いを別々の承認ステップと取得ステップで使用している場合、課金を承認した後、PaymentIntentの状態はrequire_captureに変わる
・あなたは7日以内に料金を課金しなければならない、さもなければPaymentIntentはキャンセルされる

Stripe.jsとElements
・Payment Intents APIと緊密に統合されており、各段階でPaymentIntentの進行を管理することの複雑さを大幅に軽減している
・通常、確認などのステップは舞台裏でStripe.jsによって実行されるため、アプリケーションでそれらを処理する必要はない
・課金プロセスをもっと細かく制御したい場合は、より実践的な方法を選択することをお勧めする

クライアント側で支払いを完了する


Payment Intents APIはStripe.jsと統合され、Elementsを使用してクライアント側で安全に支払い情報を収集する
・購入を完了するには、PaymentIntentのクライアントシークレットを取得し、それをStripe.jsのstripe.handleCardPayment関数へ渡す
・この関数を呼び出すと、目的の要素から顧客の支払い情報を収集し、それをStripeに安全に送信して取引を完了する
・正常に完了した場合、結果オブジェクトのerrorプロパティはnullだ
▼PaymentIntentデモ4-1
const stripe = Stripe('pk_test_xxxx', {
 betas: ['payment_intent_beta_3']
});

(async () => {
 const {paymentIntent, error} = await stripe.handleCardPayment(clientSecret, cardElement);
 if (error) {
   // Display error.message in your UI.
 } else {
   // The payment has succeeded. Display a success message.
 }
})();


一部の支払い方法では、3Dセキュア認証などの追加手順が必要だ
・あなたが支払いを完了するためにStripe.jsのhandle関数の1つを使用するとき、それは必要な次の行動を通して自動的に顧客を案内する
・それはまたあなたのためのPaymentIntentをconfirmsする

ソースと顧客


収集された支払い情報
・保存され、後で再利用するためにcustomerオブジェクトに関連付けられる
・PaymentIntentを作成するときに、save_payment_methodの値をtrueに設定し、希望のcustomerソースを指定する

・次の例は、顧客の支払い情報を保存するPaymentIntentを作成する方法を示している
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
 "save_payment_method" => true,
 "customer" => "cus_DyA7gideDWXNOX",
 "source" => "src_1DWaarHgsMRXo4MtXrvYGoMZ",
]);


クライアントサイドのhandleCardPayment関数にはsave_payment_methodパラメーターもある
・これはオプションで、顧客から提供された支払い情報を保存するために使用できる
・これは、チェックアウトプロセス中に顧客の支払い情報を保存するかどうかを選択するオプションを顧客に提供したい場合に役立つ
・このパラメータは、現在提供されている支払い情報にのみ適用される
・顧客が後で別の支払い情報を提供した場合は、新しい情報を保存するためにsave_payment_method再度指定する必要がある

保存したソースを使う


保存されているソースを使用
・ PaymentIntentを作成するときに、関連するIDにcustomerパラメータとsourceパラメータを指定して、保存されているソースを使用するように指示することができる
・PaymentIntentがsourceパラメータで確認されると、すぐに指定されたソースで支払いを完了しようとする
・PaymentIntentが保存されたソースで支払いを正常に完了できる場合は、PaymentIntentをクライアント側に渡す必要はない
・次の例は、保存されたソースを使用するPaymentIntentを作成する方法を示している
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
 "source" => "src_1DWDnvHgsMRlo4Mtl1GO25qW",
 "customer" => "cus_DyA7gideDWXNOX",
 "confirm" => true,
 "return_url" => "https://your-app-domain.com/complete",
]);


Connectを使う


Stripeは、 接続アカウントに代わって課金を作成するためのいくつかのアプローチをサポートしている
1つのアプローチは直接請求だ
・そこでは、接続されたアカウントはStripe手数料、払い戻し、およびチャージバックの費用に対して責任がある
・PaymentIntentを使って直接請求を行うには、PaymentIntentを作成するときに接続アカウントのIDを指定する
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
], ["stripe_account" => "{CONNECTED_ACCOUNT_ID}"]);


さらに、Payment Intents APIは、自動的に接続アカウントへの転送を作成し、接続アカウントを支払いの記録として使用することをサポートする
・transfer_data[destination]は、転送を受け取るべき接続アカウントのIDだ
・on_behalf_ofパラメータは、支払いの記録上の取引先として使用する接続アカウントのIDだ。※Creating Separate Charges and Transfers における設定なので以下省略
・transfer_groupパラメータは、PaymentIntentによって作成されたすべての課金に伝播され、 同じように動作する。※Creating Separate Charges and Transfers における設定

・最後に、 application_fee_amountパラメータを指定して、 application feeを差し控えることができる
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "application_fee_amount" => 200,
 "payment_method_types" => ["card"],
 "on_behalf_of" => "{CONNECTED_ACCOUNT_ID}",
 "transfer_data" => [
   "destination" => "{CONNECTED_ACCOUNT_ID}"
 ]
])


Creating PaymentIntents / PaymentIntentsを作成する

 閲覧数:385 投稿日:2019-04-20 更新日:2019-04-23 

docs


Payments > PREPARING FOR SCA > Payment Intents > Usage > Creating PaymentIntents
Creating PaymentIntents
PaymentIntentsを作成する
・支払いの受け取りを開始するには、サーバー側でPaymentIntentを作成する

Payment Intents APIとのシステムを構築するには
・2つのアクションがある
・それは、支払いの作成と確認だ
・各PaymentIntentは通常、アプリケーション内の単一のショッピングカートまたは顧客セッションと相関している
・PaymentIntentは、サポートされている支払い方法、回収金額、目的の通貨など、取引に関する詳細をカプセル化する

自動確認を使用する場合は
・チェックアウトプロセスの最初にPaymentIntentを作成してくれ

手動確認を使用する場合は
・ElementsまたはStripe社のiOSおよびAndroid SDKを使用して顧客から支払い情報を収集した後にPaymentIntentを作成してくれ

自動確認用のPaymentIntentの作成


自動確認を使用するシステムでは
・サーバー上にPaymentIntentを作成し、そのクライアントシークレットをクライアントに渡す
・支払いはクライアント上で確認され、サーバーはWebフックを監視して、それが正常に完了したか失敗したかを検出する

PaymentIntentを作成するときに、金額や通貨などのオプションを指定できる
▼PaymentIntentデモ1-1
・payment_method_typesパラメータを明示的に指定。このパラメータのデフォルト値は ['card']なので、指定しなくても結果は同じ
// 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_xxxx");

\Stripe\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
 'payment_method_types' => ['card'],
]);


まだ持っていない場合は、今すぐお気に入りの言語用のAPIライブラリをインストールしてくれ
・便宜上、このページを読みながらログインしている場合は、テスト用の秘密のAPIキーを使用して例を事前に入力している
・あなただけがこの値を見ることができる
・これはあなたをStripeに認証するので、それを秘密にし、安全に保つ
・本番環境ではテストキーを実際のライブキーに置き換えてくれ
・ダッシュボードからすべての鍵を入手できる

PaymentIntentを作成したら
・PaymentIntentクライアントシークレットをクライアント側に渡して、ElementsまたはStripe社のiOSおよびAndroid SDKを使用して顧客のカードを安全に収集してトークン化できる

ベストプラクティス


顧客がチェックアウトプロセスを開始したときなど、金額が判明したら
・すぐにPaymentIntentを作成することをお勧めする
・金額が変わった場合は、金額を更新できる
・例えば、顧客がチェックアウトプロセスを取り消して新しい商品をカートに追加した場合、彼らがチェックアウトプロセスを再開したときにそれに応じて金額を更新する必要がある

チェックアウトプロセスが中断され、後で再開した場合
・新しいPaymentIntentを作成するのではなく、同じPaymentIntentを再利用するようにしてくれ
・各PaymentIntentには一意のIDがあり、必要に応じてそれを取得することができる
・アプリケーションのデータモデルでは、検索を容易にするために、PaymentIntentのIDを顧客のショッピングカートまたはセッションに保存できる
・PaymentIntentを再利用することの利点は、このオブジェクトによって、特定のカートまたはセッションで失敗した支払いの試行を追跡できるようになることだ

同じ購入に対して重複したPaymentIntentsが誤って作成されないようにするために
・PaymentIntentを作成するときにも、通常はアプリケーションのカートまたは顧客セッションに関連付けるIDに基づいて、べき等性キーを指定する必要がある

PaymentIntentを同時に作成して確認する


すでに支払い情報を収集している場合
・サーバー上にPaymentIntentを作成し、confirmパラメーターの値としてtrueを渡すことによってすぐにそれを確認できる
・手動確認でPaymentIntentを使用するには、confirmation_methodをmanualに設定することもできる
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
 "payment_method" => "{{PAYMENT_METHOD_ID}}",
 "confirm" => true,
]);



クライアント側に「クライアントシークレット」を渡す


PaymentIntentには、client secretプロパティ 、個々のPaymentIntentに固有のキーが含まれている
・アプリケーションのクライアント側では、支払いを完了するためにStripe.js関数(stripe.handleCardPaymentstripe.handleCardActioなど)を呼び出すときに、クライアントシークレットがパラメータとして使用される

クライアントシークレットを使用するには
・サーバー上のPaymentIntentから取得してクライアントサイドに渡す必要がある

クライアント側にclient secretをクライアント側に届けるために、さまざまな方法がある
・アプリケーションのアーキテクチャに最も適した方法を選択してくれ

サーバーサイドレンダリング
・アプリケーションでサーバーサイドレンダリングを使用している場合は、レンダリング中にチェックアウトページのHTML出力にクライアントシークレットを埋め込むためにテンプレートフレームワークを使用することをお勧めする
・それをデータ属性または隠しHTML要素に埋め込んでから、それをJavaScriptで抽出して支払いを完了することができる
▼PaymentIntentデモ2
checkout.php
// 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 = # ... Fetch or create the PaymentIntent;
$intent1 = \Stripe\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
]);

$intent2 = \Stripe\PaymentIntent::update(
 $intent1['id'],
 [
   'amount' => 1499,
 ]
);
?>

<input id="cardholder-name" type="text">
<!-- placeholder for Elements -->
<div id="card-element"></div>
<button id="card-button" data-secret="<?php echo $intent2->client_secret; ?>">
 Submit Payment
</button>


シングルページアプリケーション


クライアントサイドのブラウザのfetch関数を使用
・あるいは、クライアントサイドのブラウザのfetch関数を使用して、サーバー上のエンドポイントからクライアントシークレットを取得することもできる
・このアプローチは、クライアント側が単一ページのアプリケーション、特にReactやVueなどの最新のフロントエンドフレームワークで構築されているアプリケーションである場合に一般的に最も適している

PaymentIntentsデモ6
・次の例では、クライアントシークレットを処理するサーバエンドポイントを作成する方法を示す
▼secret.php
// 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::create([
 'amount' => 1099,
 'currency' => 'jpy',
]);

$intentResult = \Stripe\PaymentIntent::update(
 $intent['id'],
 [
   'amount' => 1499,
 ]
);
echo json_encode(array('client_secret' => $intentResult->client_secret));

・この例では、クライアントサイドでJavaScriptを使用してクライアントシークレットを取得する方法を示す
▼index.html
<script>
//JavaScript
var response = fetch('/demo/settlement/stripe/paymentintent/6/secret.php').then(function(response) {
 return response.json();
}).then(function(responseJson) {
 var clientSecret = responseJson.client_secret;
 console.log(clientSecret);
 //Call stripe.handleCardPayment() with the client secret.
});

//JavaScript (ESNext)
(async () => {
 const response = await fetch('/demo/settlement/stripe/paymentintent/6/secret.php');
 const {client_secret: clientSecret} = await response.json();
 console.log(clientSecret);
 // Call stripe.handleCardPayment() with the client secret.
})();
</script>

非同期処理が分からない

iOSおよびAndroidアプリケーションの場合も同様に
・サーバーからクライアントシークレットを取得できる

クライアントシークレットを使用して、PaymentIntentに指定された金額で支払い処理を完了することができる
・ログに記録したり、URLに埋め込んだり、顧客以外に公開したりしないでくれ
・クライアントシークレットを含むページでTLSが有効になっていることを確認してくれ

動的ステートメント記述子


デフォルトでは
・あなたが彼らのカードに課金するときはいつでも、あなたのStripeアカウントの公開ビジネス情報は顧客の明細書に表示される
・支払いごとに異なる説明を入力するには、statement_descriptorパラメータを含める

PaymentIntentsデモ7
// 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\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
 'payment_method_types' => ['card'],
 'statement_descriptor' => 'Custom descriptor',
]);


ステートメント記述子
・22文字以内で、特殊文字<、>、 '、 "、または*は使用できない
・数字だけで構成してはいけない
・動的ステートメント記述子を使用する場合、動的テキストはStripe Dashboardで設定されたステートメント記述子の接頭部に追加される
・動的ステートメントからデフォルトステートメント記述子を分離するために、*と空のスペースも追加される
・これら2文字は22文字の制限にカウントされる

22文字を超えるとエラーが発生し(、PaymentIntent作成処理自体が)失敗する
・上記エラーとなる設定例
'statement_descriptor' => '2019/4/22 日本語 Custom descriptor',

( ! ) Fatal error: Uncaught Stripe\Error\InvalidRequest: The statement descriptor must be at most 22 characters.
 
ステートメント記述子には少なくとも1つの英字が含まれていなければならない
・上記エラーとなる設定例
'statement_descriptor' => '2019/4/22 日本語',

( ! ) Fatal error: Uncaught Stripe\Error\InvalidRequest: The statement descriptor must contain at least one alphabetic character.

メタデータに情報を保存する


メタデータの追加をサポート
・Stripeは、支払い処理など、最も一般的なリクエストへのメタデータの追加をサポートしている
・メタデータは、顧客には表示されず、支払いが拒否されたのか、Stripeの詐欺防止システムによってブロックされたのかどうかについても考慮されない

メタデータを介して、自分にとって意味のある他の情報をStripeアクティビティに関連付けることができる
・あなたが含むどんなメタデータもダッシュボードで見ることができ(例えば、個々の支払いのためにページを見るとき)、そしてまた一般的なレポートとエクスポートで利用可能だ
・例えば、店舗の注文IDは、その注文の支払いに使用されるPaymentIntentに添付できる
・そうすることで、あなた、あなたの会計士、またはあなたの財務チームは、Stripeでの支払いとあなたのシステムでの注文を簡単に調整することができる

Radarを使用している場合
・追加の顧客情報と注文情報をメタデータとして渡すことを検討してくれ
・こうすることで、メタデータ属性を使用してレーダールールを作成し、ダッシュボード内で利用可能な支払いに関する詳細情報を入手できるため、レビュープロセスを促進できる

PaymentIntentが請求を作成すると
・PaymentIntentはそのメタデータを請求にコピーする
・後でPaymentIntentのメタデータを更新しても、以前にPaymentIntentによって作成された請求のメタデータは変更されない

PaymentIntentsデモ8
// 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\PaymentIntent::create([
 'amount' => 1099,
 'currency' => 'jpy',
 'payment_method_types' => ['card'],
 'metadata' => ['order_id' => 6735],
]);


・機密情報(個人を特定できる情報、カードの詳細など)をメタデータとして、またはPaymentIntentの説明パラメータに保存しないでくれ

















































※以下は、(2019年4月前半)以前に掲載されていた内容の日本語訳

Payment Intents APIを使用して支払いを受け取るための最初のステップ


サーバー側でPaymentIntentを作成することだ
・各PaymentIntentは通常、アプリケーション内の単一のショッピングカートまたは顧客セッションと相関している
・顧客がチェックアウトプロセスを開始したときにPaymentIntentを作成することをお勧めする
・これにより、1つのオブジェクトに対するすべての支払い試行を追跡できる

PaymentIntentは、サポートされている支払い方法、回収金額、目的の通貨など、取引に関する詳細をカプセル化する
・PaymentIntentを作成するときにこれらのオプションを指定できる

Verifying Payment Status / 支払い状況の確認

 閲覧数:413 投稿日:2019-04-23 更新日:2019-04-25 

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認証の手動処理


・省略

Off-session Payments with Payment Intents / Payment Intents を使用したオフセッション支払

 閲覧数:549 投稿日:2019-04-24 更新日:2019-04-26 

docs


Payments > PREPARING FOR SCA > Payment Intents > Usage > Off-session Payments
Off-session Payments with Payment Intents
Payment Intents を使用したオフセッション支払

後で支払いを作成する方法
・顧客が3Dセキュアなどの認証手順を完了できないときに、顧客の支払い情報を保存して後で支払いを作成する方法を学ぶ

顧客からの支払いを受け取るためにPaymentIntentを使用する場合
・最後のステップは支払いの確認だ
・シナリオによっては、顧客がアプリケーションを積極的に使用している間にこれが発生する
・但し、それ以外の場合は、顧客がアプリケーションを積極的に使用していないときに顧客に請求する必要がある
・これは「セッション外」支払いと呼ばれる

システムがセッション外支払いを使用する場合
・アプリケーションは、プロセスを完了するために必要な追加のステップを顧客が確実に実行するようにする責任がある
・これは、ヨーロッパで今後予定されている強力な顧客認証規則に準拠する必要があるシステムにとって重要な考慮事項だ
・3Dセキュア認証などの一部の手順は、クライアント上で実行する必要がある
・このような場合は、電子メールまたはプッシュ通知で顧客に通知し、認証を完了するためにアプリケーションに戻るよう依頼する方法を構築する必要がある

アプリケーションで定期的な支払いが必要な場合は
・Stripe BillingのSubscriptions APIを使用してくれ
・どの subscription に認証が必要かを識別し、追加の認証が必要なときにカスタマイズ可能な電子メールを購読者に送信する

Payment Intents APIを使用してセッション外の支払いを集めるには、次の手順を実行する
・1.支払い情報を収集して顧客に添付する
・2.後で、PaymentIntentを作成し、支払い方法を添付する
・3.PaymentIntentのステータスを確認する
・4.必要に応じて支払いを完了するように顧客に通知する

ステップ1:支払い情報を収集して顧客に添付する


支払い情報を収集
・Stripe.js ElementsまたはモバイルSDKを使用して 、顧客の支払い情報を安全に収集することから始める

支払い情報を入手したら
・顧客を作成して支払い方法を添付する

// 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");

// Create a Customer:
$customer = \Stripe\Customer::create([
   'email' => 'paying.user@example.com',
]);

// Attach payment method to the customer:
StripePaymentMethod::attach("pm_123456789", [
 "customer" => $customer->id,
]);

// YOUR CODE: Save the customer ID and other info in a database for later.


ステップ2:後で、支払い方法を指定してPaymentIntentを作成する


PaymentIntentを作成するときは
・顧客のIDと以前に保存したCard、Source、またはPaymentMethodのIDの両方を指定する
・また、PaymentIntentのconfirmプロパティの値をtrueに設定する必要がある
・これにより、PaymentIntentが作成されるとすぐに確認が行われる
・すでに作成されているPaymentIntentをプログラムで確認することもできる

次のコード例は、customerとpayment_methodを使用してPaymentIntentを作成および確認する方法を示している
// 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\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
 "customer" => "{{CUSTOMER_ID}}",
 "payment_method" => "{{PAYMENT_METHOD_ID}}",
 "confirm" => true,
]);


ステップ3: PaymentIntentのステータスを確認する


この時点で、要求は402 HTTPステータスコードで失敗する可能性がある
・これは、支払いが失敗したことを意味する
・last_payment_errorプロパティを確認して再試行し、必要に応じて顧客に通知して新しい支払い情報を収集する

それ以外の場合は
・新しく作成されたPaymentIntentのstatusプロパティを調べて、支払いが正常に完了したかどうかを確認する
・以下のリストは、考えられるstatus値とその意味を説明している

requires_action :支払いを完了するためにアプリケーションに戻るように顧客に通知する
succeeded :支払いが完了し、提供された支払い方法を使用して料金が作成された。 それ以上の手順は必要ない

ステップ4:必要に応じて支払いを完了するように顧客に通知する


支払いが失敗した場合(require_payment_method)またはさらに認証が必要な場合(require_action)は
・支払いを完了するためにアプリケーションに戻るように顧客に通知する必要がある
・このような場合に顧客に送信できる支払いフォームを使用してWebページまたはモバイルアプリの画面を作成することをお勧めする

このページで、PaymentIntentのクライアントシークレットを使用可能にし、Stripe.jsまたはモバイルSDKを使用して認証を表示する

テスト中は
・このフローを強制するために、3D Secureの必須テストカード番号(4000000000003063)を使用できる
・認証不要の3D Secure not requiredカード(4242424242424242)を使用すると、フローのこの部分をスキップして手順3で完了する

自動確認
・Stripe.jsと自動確認のシステムでは、クライアントシークレットをhandleCardPayment関数へ渡す
・この関数は、認証プロセスを通じて顧客を自動的に案内し、支払いの完了を開始する
・モバイルアプリケーションの次のステップを処理する方法の詳細については、AndroidおよびiOS SDKの資料を参照することができる
async () => {
 const {paymentIntent, error} = await stripe.handleCardPayment({{CLIENT_SECRET}});
 if (error) {
   // Display error.message in your UI.
 } else {
   // The payment has succeeded. Display a success message.
 }
})();


Payment Methods API

 閲覧数:221 投稿日:2019-04-25 更新日:2019-04-25 

docs


Payments > PREPARING FOR SCA > Payment Intents > Usage > Payment Methods API
Payment Methods Overview
Payment Methods API

API


PaymentMethods

Payment Methods API  への移行


新しいPayment Methods API
・既存の「Tokens」および「Sources API」に代わる新しい「Payment Methods API」が 、システムによる支払い情報の収集および保存のための推奨方法になった
・これは「Payment Intents API」と連携して、幅広い支払い方法の支払いを作成する

「Payment Methods API」と「Sources API」の主な違い
・Sourceがstatusプロパティを通じてトランザクションの状態を記述することだ。つまり、各Sourceオブジェクトは、支払いに使用する前にchargeable状態に移行する必要がある
・対照的に、PaymentMethodsはステートレスで、特定の支払いの取引状態を表すためにPaymentIntentオブジェクトに依存している

Stripeは最終的にすべての支払い方法を「Payment Methods API」でサポートする予定だ
・それまでの間、Sources APIは、特定の支払い方法が「Payment Methods API」でまだサポートされていない場合に適している
FLOWS PAYMENT METHODS WITH PAYMENT INTENTS API TOKENS OR SOURCES WITH CHARGES API
Cards サポート トークンでサポート
ソースにはお勧めできない
・他は省略
Stripe: 決済手段ガイド

ソースとカードとの互換性


以前にカードまたは情報源を使用してStripeで顧客カードの詳細を収集したことがある場合は
・支払い情報を移行せずに直ちにPayment Methods APIを使用し始めることができる
!この互換性はカードとカードソースにのみ適用され、一般に既存のすべてのソースタイプには適用されない
!他のタイプのソースと統合している場合は、すぐにそれらのソースでPayment Intents APIを使用できる

顧客に保存されているすべてのカードとすべてのカードソースは
・PaymentMethodオブジェクトを受け入れるすべてのAPIで使用できる
・例えば、PaymentIntentを作成するときに、保存したカードをPaymentMethodとして使用できる
// 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");

StripePaymentIntent::create([
 "payment_method_types" => ["card"],
 "amount" => 1099,
 "currency" => "jpy",
 "customer" => "cus_EuDxccEWADyPip",
 "payment_method" => "card_1ESZCTJiXAQvfxv33qy49u11",
]);

・オブジェクトをPaymentIntentに添付するときは、カードまたはカードソースが保存されている顧客を忘れずに指定してくれ

保存されたすべてのカードとカードソースは、PaymentMethod APIを介して取得することも出来る
・従来のcardオブジェクト
{
 "id": "card_1EBXBSDuWL9wT9brGOaALeD2",
 "object": "card",
 "address_city": "San Francisco",
 "address_country": "US",
 "address_line1": "1234 Fake Street",
 "address_line1_check": null,
 "address_line2": null,
 "address_state": null,
 "address_zip": null,
 "address_zip_check": null,
 "brand": "Visa",
 "country": "US",
 "customer": "#{customer_id}",
 "cvc_check": null,
 "dynamic_last4": null,
 "exp_month": 8,
 "exp_year": 2024,
 "fingerprint": "53v265akSHAnIk1X",
 "funding": "credit",
 "last4": "4242",
 "metadata": {
 },
 "name": null,
 "tokenization_method": null
}


・PaymentMethod APIを介して取得したカード
{
 "id": "card_1EBXBSDuWL9wT9brGOaALeD2",
 "object": "payment_method",
 "billing_details": {
   "address": {
     "city": "San Francisco",
     "country": "US",
     "line1": "1234 Fake Street",
     "line2": null,
     "postal_code": null,
     "state": null
   },
   "name": null,
   "phone": null,
   "email": null
 },
 "card": {
   "brand": "visa",
   "checks": {
     "address_line1_check": null,
     "address_postal_code_check": null,
     "cvc_check": null
   },
   "country": "US",
   "exp_month": 8,
   "exp_year": 2024,
   "fingerprint": "53v265akSHAnIk1X",
   "funding": "credit",
   "last4": "4242",
   "three_d_secure_usage": {
     "supported": true
   },
   "wallet": null
 },
 "created": 123456789,
 "customer": "cus_EepWxEKrgMaywv",
 "livemode": false,
 "metadata": {
 },
 "type": "card"
}


・従来のsourceオブジェクト
{
 "id": "src_1AhIN74iJb0CbkEwmbRYPsd4",
 "object": "source",
 "amount": null,
 "client_secret": "src_client_secret_xxxx",
 "created": 1500471469,
 "currency": null,
 "flow": "none",
 "livemode": false,
 "metadata": {
 },
 "owner": {
   "address": {
     "city": "Berlin",
     "country": "DE",
     "line1": "Nollendorfstraße 27",
     "line2": null,
     "postal_code": "10777",
     "state": null
   },
   "email": "jenny.rosen@example.com",
   "name": "Jenny Rosen",
   "phone": null,
   "verified_address": null,
   "verified_email": null,
   "verified_name": null,
   "verified_phone": null
 },
 "status": "chargeable",
 "type": "card",
 "usage": "reusable",
 "card": {
   "exp_month": 4,
   "exp_year": 2024,
   "address_line1_check": "unchecked",
   "address_zip_check": "unchecked",
   "brand": "Visa",
   "country": "US",
   "cvc_check": "unchecked",
   "funding": "credit",
   "last4": "4242",
   "three_d_secure": "optional",
   "tokenization_method": null,
   "dynamic_last4": null
 }
}


・PaymentMethod APIを介して取得したsource
{
 "id": "card_1EBXBSDuWL9wT9brGOaALeD2",
 "object": "payment_method",
 "billing_details": {
   "address": {
     "city": "Berlin",
     "country": "DE",
     "line1": "Nollendorfstraße 27",
     "line2": null,
     "postal_code": "10777",
     "state": null
   },
   "name": "Jenny Rosen",
   "phone": null,
   "email": "jenny.rosen@example.com"
 },
 "card": {
   "brand": "visa",
   "checks": {
     "address_line1_check": null,
     "address_postal_code_check": null,
     "cvc_check": null
   },
   "country": "US",
   "exp_month": 4,
   "exp_year": 2024,
   "fingerprint": "53v265akSHAnIk1X",
   "funding": "credit",
   "last4": "4242",
   "three_d_secure_usage": {
     "supported": true
   },
   "wallet": null
 },
 "created": 1500471469,
 "customer": "#{customer_id}",
 "livemode": false,
 "metadata": {
 },
 "type": "card"
}


この互換性により、新しいオブジェクトは作成されない
・PaymentMethod API は、同じ基礎となるオブジェクトに対して異なるビューを提供する
・例えば、Payment Methods API を介したカードまたはカードソースへの更新は、ソースAPIを介して表示され、またその逆も同様だ

Saving Payment Methods / 支払い方法を保存する

 閲覧数:557 投稿日:2019-04-25 更新日:2019-04-27 

docs


Payments > PREPARING FOR SCA > Payment Intents > Usage > Saving Payment Methods
Saving Payment Methods
支払い方法を保存する
・あとで顧客に請求できるようにPayment Methods APIを使用してStripeアカウントに支払い方法の詳細を保存する方法を学ぼう

Stripeを使用すると
・後で使用するために支払い情報を簡単に保存できるようにするCustomerオブジェクトを作成できる
・顧客オブジェクトを使用して、 subscriptions またはセッション外支払いを作成できる
・以前に収集された支払い情報を使用して、顧客の直接の関与なしに支払いが発生した場合、その支払いはセッション外と説明される

顧客の支払い情報を収集すると
・PaymentMethodが作成される
・このPaymentMethodは、最初に顧客に添付された場合を除き、1回しか使用できない

支払い中にクライアント側でPaymentMethodを保存する


PaymentMethodを顧客に保存
・支払い処理中に、save_payment_methodフラグを使用して、PaymentMethodをPaymentIntentに関連付けられた顧客に保存できる
・これは、チェックアウトプロセス中に顧客の支払い情報を保存するかどうかを選択するオプションを顧客に提供したい場合に役立つ
・支払いが成功したかどうかにかかわらず、PaymentMethodは顧客に添付される

PaymentIntentデモ10-1、10-2、10-3
・「関連付けられた顧客」という点が重要
・「関連付けられていない顧客」へ対して実行すると「message: "A valid `customer` must be provided when `save_payment_method=true`."」エラーが発生する
const stripe = Stripe('pk_test_xxxx');
const {paymentIntent, error} = await stripe.handleCardPayment(
 '{{PAYMENT_INTENT_CLIENT_SECRET}}',
 cardElement,
 {
   save_payment_method: true,
 }
);


save_payment_methodパラメータ
・指定された時点で現在のPaymentMethodとCustomerにのみ適用される
・顧客が支払い方法を変更した場合は、新しい支払い方法を保存するためにsave_payment_methodをもう一度渡す必要がある

PaymentIntentで支払を実装する場合の選択肢

サーバー側でPaymentMethodを保存する


支払い情報は顧客に関連付けることが出来る
・収集された支払い情報は保存され、後で再利用するために顧客に関連付けることが出来る
・PaymentIntentを作成するときに、save_payment_methodの値をtrueに設定し、希望の顧客とpayment_methodを指定する

次の例は、顧客の支払い情報を保存するPaymentIntentを作成する方法を示している
・PaymentIntentデモ11-1
・Customerオブジェクト作成。PaymentMethodオブジェクト作成。PaymentIntentオブジェクト作成する際、両者を関連付け。支払いは実行していない
・PaymentMethodをサーバで作成しているため、使用場面は限られると思われ
// 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");

// Create a Customer:
$customer = \Stripe\Customer::create([
   'email' => 'paying.user@example.com',
]);

$paymentMethod = \Stripe\PaymentMethod::create([
 'type' => 'card',
 'card' => [
   'number' => '4000003920000003',
   'exp_month' => 4,
   'exp_year' => 2020,
   'cvc' => '314'
 ]
]);

$paymentintent = \Stripe\PaymentIntent::create([
 "amount" => 1099,
 "currency" => "jpy",
 "payment_method_types" => ["card"],
 "save_payment_method" => true,
 "customer" => $customer->id,
 "payment_method" => $paymentMethod['id'],
]);


支払いの外でPaymentMethodを保存する


PaymentIntentのコンテキスト外で(例えばcreatePaymentMethodを使用して )支払い情報を収集している場合は
・サーバーからPaymentMethodを顧客に添付できる
// 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");

$payment_method = StripePaymentMethod::retrieve('{{PAYMENT_METHOD_ID}}');
$payment_method->attach(['customer' => '{{CUSTOMER_ID}}']);


・後でこの顧客のPaymentIntentを作成するときに、顧客とPaymentMethodの両方を指定する
// 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");

StripePaymentIntent::create([
 "payment_method_types" => ["card"],
 "amount" => 1099,
 "currency" => "jpy",
 "customer" => "{{CUSTOMER_ID}}",
 "payment_method" => "{{PAYMENT_METHOD_ID}}",
]);


ストライプは、保存時にカード情報を検証する
・このプロセスの結果として、顧客は彼らの明細書に1ドルの一時的な承認を見るかもしれない
・これは、将来の請求が成功することを保証するものではない(例えば、カードに十分な資金がなくなった、紛失または盗難にあった、またはアカウントが閉鎖された場合など)
・このプロセスでは、実行された可能性がある、レーダーによる従来の銀行小切手(CVCや郵便番号など)を含むすべての小切手の結果も更新される

保存した支払い方法にアクセスする


顧客の以前に保存されたCards、Sources、およびPaymentMethodsを表示するには
・customerオブジェクトのsourcesプロパティを読み取る代わりに支払い方法を一覧表示する
・顧客に追加された新しいPaymentMethodsが顧客オブジェクトのsourcesプロパティに重複しないため、これが必要だ

BEFORE
customer->sources


AFTER
\Stripe\PaymentMethod::all(['customer' => '{{CUSTOMER_ID}}', 'type' => 'card']);


関連デモ
・PaymentMethod デモ「all-1」「all-2」「retrieve-1」
・Customer デモ 「src-6」「retrieve-1」
「PaymentMethodオブジェクト」と「Customerオブジェクト」の関係


Stripe Billing > Quickstart / クイックスタート

Stripe Payments > SOURCES / ソース

コメント投稿(ログインが必要)



週間人気ページランキング / 12-1 → 12-7
順位 ページタイトル抜粋 アクセス数
1 Stripe Q50。 Connect 「Standardアカウント」で、自身に連結された子アカウントを、ダッシュボードから削除するには? | QA(Stripe) 9
1 決済用語 9
1 EMVレベル1 / EMVレベル2 / EMVCo とは? 9
2 EMVCo | クレジットカード仕様(仕様) 8
3 Stripe Q16。PaymentIntentの支払いで郵便番号入力を求められる。Radar rules の ZIP code を無効にしているのに | QA(Stripe) 5
4 本番環境利用の申請 | その他エントリー(Stripe) 4
4 LINE LIVE | ライブ配信サービス(課金販売できるプラットフォーム) 4
5 「支払」と「送金」の違い | 違い 3
5 機能一覧表 / Q.アカウント複数作成 / Stripeアカウント登録 3
5 Q63.No signatures found matching the expected signature for payload について | QA(Stripe) 3
5 Stripe Q13。決済成功時に、「請求に紐づけられたメールアドレス」に対して、メール送信したいのですが、 | QA(Stripe) 3
5 Gumroadとは?/ 特徴 / Link 3
6 2 段階認証を削除する / 2 段階認証削除後に受信したメール 2
6 Stripe Q38。Difference between “paymentIntent.status === 'succeeded'” and “payment_intent.succeeded event of Webhook” | QA(Stripe) 2
6 fulfillment / fulfillment とは? / ECサイト運営におけるfulfillmentとは? 2
6 大前提 / source objec /「card object」と「source object」の関係 2
6 Checkout (new) はどこで実行するかにより2種類に分かれる 2
6 ふわっち | ライブ配信サービス(課金販売できるプラットフォーム) 2
6 Periscopeが日本で流行っていない理由は、日本では収益を上げることが出来ないから 2
6 クラウドファンディングのメリット / クラウドファンディングのデメリット 2
2022/12/8 1:01 更新