Stripe

Stripe

Stripe Checkout と Stripe Elements

[6] 決済情報等を入力させる画面が Stripe 側のサーバーにある Stripe Checkout と、自サーバーに置く Stripe Elements があります。

[7] どちらも Stripe.js という Stripe 提供の JavaScript ライブラリーを自サーバーで読み込む必要があります。 この点ではどちらを使っても大差ありません。

[8] Stripe Checkout言語によっても違う複雑な入力フォームの用意をすべて Stripe 側に任せられます。 決済手段の違いも、ある程度までは Stripe 側で吸収してくれます。 決済情報や住所入力に関係したトラブルを抱え込まずに済むのでとても便利。

[9] Stripe Elements は決済情報や住所の入力を自サーバー上の HTMLフォームを使って記述できますが、 Stripe.js が複雑な部分をラップしています。 自サーバー上なので自由に設計できる柔軟性と、 複雑なフォームを正確に運用する必要性とのトレードオフをうまいこと処理しようと企てたのでしょうか。 でも Stripe.js の要求する作法に従って作るしかないので、 自由度はほとんどありません。 結局 Stripe CheckoutStripe のサーバーでやってることを、 わざわざ手間をかけて自サーバーで再現することになっちゃいます。

[10] Stripe Elements でもクレジットカードの入力部分は iframeStripe サーバーが埋め込まれる形で実現されています。 だからセキュリティーも大丈夫で安心、ってことなんですが、 住所とか他の重要度が低い(?)個人情報は自サーバー側なんですよね。 どうせ自サーバー側にあっても大してカスタマイズできるわけでもないので、 全部 Stripe サーバー側の iframe にあったほうがセキュリティー的にも安心なんですけれども。 でもそうしちゃうと Stripe Checkout に対する優位性が本当に何も無くなってしまう。

Stripe Checkout

[11] checkout session は24時間で期限切れになるとのこと。

Payment Request API 対応

[3] paymentRequest.canMakePayment() is always false · Issue #379 · stripe/react-stripe-elements () https://github.com/stripe/react-stripe-elements/issues/379

[4] StripePayment Request API 対応は不完全。 その一部は意図的に制限している >>3 とのこと。ひどい。

[5] Stripe にとってはWeb標準API が充実するより自社サービスを使ってもらったほうが得だからかな?

利用制限

[2] 【村八分】トランプ、オンライン決済も停止される - ウォールストリートジャーナル - Togetter () https://togetter.com/li/1651445

配送先住所の取得

[12] Stripe Checkout配送先住所を記入させたら、 checkout session オブジェクトの shipping にその住所データが入ります。

[13] Dashboard に checkout session オブジェクトは表示されないので、 これを直接見ることができません。

[14] 同じ住所が checkout で作成された invoice オブジェクトに対応する支払いページ (payment intent) の「Checkout サマリー」 欄に表示されます。

[15] checkout session が mode = subscription のときこの invoice に直接たどり着く方法がありません。 payment_intent = null で変化しません。

subscription に subscription のID が入っているので、 それを使って subscription を取得します。 latest_invoice に最新の invoice のIDが入っています。 最古の invoice を取得する方法がないのですが、 新規作成直後なら最新 = 最古のはず。

Stripe API Reference - List all invoices, https://stripe.com/docs/api/invoices/list

これで subscription の invoice を取得できます。 ただし sort order を指定できない。 新規作成直後なら1個しかないはずだけど念の為と limit をそこそこ大きくしておいて最古の invoice を使うのがいいのだろうか。

invoice から payment intent の ID を取得すれば、 ダッシュボードの URL を作れます。

なおダッシュボードのページには住所が表示されますが、 payment intent オブジェクトには住所は入っていません。 shippingnull です。

payment method の payment_method から payment method を取得して billing_details を見ると請求先住所が入っているのですが、 これは配送先住所とは別です。

[16] 請求額が0円の時は invoice の payment_intentnull になります。 その場合 Checkout の住所が表示されるページが存在していません。

メモ

[1] Stripe Billing 101 - Qiita () https://qiita.com/y_toku/items/235b5e7ee00792edcbbf

[17] Stripe外からアプリの支払いを受け取った時の対処手順. カード決済の失敗理由は基本的に分からない/信用コストは自分で払う必要がある/根本… | by Takuya Matsuyama | 週休7日で働きたい, Takuya Matsuyama, https://blog.craftz.dog/stripe-payment-adjustment-df5e1c996c12