カテゴリー:
documentation
閲覧数:562 配信日:2019-04-20 08:35
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.handleCardPaymentやstripe.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を作成するときにこれらのオプションを指定できる