こんにちは、サイオステクノロジーの佐藤 陽です。
今日も今日とて Stripe に関する話題なんですが、今回の記事は完全なる自分のための備忘録です。
バックエンドだけで「カード情報が紐づいた顧客を作成する」方法をメモしておきます。
テストの時などにサクっと作れると便利なんですよね。
興味ある方は是非、最後までご覧ください。
はじめに
Stripe を使ったアプリケーションのテストをする場合、テスト用の Customer が必要になることが多いです。
この テスト用のCustomer を Stripe の Dashboard 上から作成することもできますが、
APIテストを自動化することを想定した場合、Dashboard からの操作は避けたいところです。
自動化に組み込めるよう、テストに適したCustomer を作成するスクリプトを組んでいきたいと思います。
なお、この方法はあくまでStripeのテスト環境でのみ利用できます。
「解説はいいから、スクリプトの中身だけ欲しい!!!」という方はコチラ
作成する顧客の想定
今回作成する顧客は
- 名前情報を持つ
- メールアドレス情報を持つ
- 有効な支払い方法が紐づいている
としたいと思います。
ポイントとしては、「有効な支払い方法が紐づいている」という点です。
なぜかというと、Subscription の作成を行う際に、Customer に有効な支払い方法紐づいている必要があるためです。
ステップ
ステップとしては以下の 3 ステップです。
- Customer 作成
- 支払い方法割り当て
- Customer のデフォルト支払い方法を更新
3 番目の処理を忘れがちなので注意してください!!
Customer 作成
名前とメールアドレスを与えて、Customer を作成します。
STRIPE_SECRET_KEY="sk_*****"
curl -L 'https://api.stripe.com/v1/customers' \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d 'name=SIOS Taro'
-d 'email=tarotaro@siostaro.com'
支払い方法割り当て
次に、作成した Customer に対して支払い方法を割り当てていきます。
現在はテスト用途で行っていることもあり、実際のクレジットカードの割り当ては行いません。
Stripe が提供しているシミュレーション用のカードを利用します。
テスト環境でのみ使えるカードで
様々なカード会社のカードや、「支払い成功」や「期限切れ」など様々なケースをシミュレーションできます。
そして通常のアプリの動作として、これらのカードを登録するには以下のような方法が考えられます。
- SetupIntent や PaymentIntent 経由で Element を作成し登録
- CustomerPortal を利用して登録
ただ、これはいづれもフロントエンドなりブラウザ操作なりが必要になってしまいます。
今回はバックエンドだけでやることが実装なので、これらは採用しません。
ではカード番号を入力せずにどう登録すればよいかというと、Stripe が提供するテスト用の PaymentMethod を使います。
Stripe ではシミュレーション用のカードだけではなく、シミュレーション用の PaymentMethod も提供してくれています。
この PaymentMethod を使って、Customer に支払い方法を割り当てていきます。
API : Attach a Payment Method to a Customer
STRIPE_SECRET_KEY="sk_******",
PAYMENT_METHOD_ID="pm_card_visa" #テスト用のPaymentMethod
CUSTOMER_ID="cus_*****" #割当先Customer
curl -L "https://api.stripe.com/v1/payment_methods/${PAYMENT_METHOD_ID}/attach" \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d "customer=${CUSTOMER_ID}"
これで割り当て完了です。
Customer のデフォルト支払い方法を更新
割り当て完了!完成!
と思いがちなんですが、まだ一工程残っています。
先ほどの AttachAPI の説明にも書いてありますが、顧客の invoice_settings.default_payment_method を更新する必要があります。
To use this PaymentMethod as the default for invoice or subscription payments, set invoice_settings.default_payment_method, on the Customer to the PaymentMethod’s ID.
やっていきましょう。
API : Update a customer
STRIPE_SECRET_KEY="sk_******",
CUSTOMER_ID="cus_*****" #更新対象Customer
PAYMENT_METHOD_ID="pm_*****" # 割り当てられたPaymentMethod
curl "https://api.stripe.com/v1/customers/${CUSTOMER_ID}"" \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d "invoice_settings[default_payment_method]=${PAYMENT_METHOD_ID}" \
これで完成です。
スクリプト
これらの実装を上手く繋げたりして、以下のようなスクリプトを作成しました。
(スクリプト書きなれていないので、不自然な点あったらごめんなさい。)
#Stripe APIを利用するためのSecret Key
STRIPE_SECRET_KEY=""
#テスト用のPaymentMethod
PAYMENT_METHOD_ID="pm_card_visa"
#Create Customer
response=$(curl -L 'https://api.stripe.com/v1/customers' \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d "name=SIOS Taro" \
-d "email=tarotaro@siostaro.com" )
customer_id=$(echo "$response" | jq -r '.id')
#Attach PaymentMethod to Customer
response=$(curl -L "https://api.stripe.com/v1/payment_methods/${PAYMENT_METHOD_ID}/attach" \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d "customer=${customer_id}")
paymentmethod_id=$(echo "$response" | jq -r '.id')
#Update Customer's Default PaymentMethod
curl "https://api.stripe.com/v1/customers/${customer_id}" \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d "invoice_settings[default_payment_method]=${paymentmethod_id}"
これで Customer の作成から、支払い方法の紐づけまでを一気に行えることができます。
この Customer が居てくれれば、すぐにSubscription API のテストなども実施できますね。
補足
今回は最初に述べた形でCustomerを作成しましたが、
- 住所も登録済みであってほしい
- 有効期限切れのカードが紐づいててほしい
など
テストケースに合わせて、Customerに対する要望も異なってくるかと思います。
そういった場合も、APIのパラメータや、利用するカードを切り替えれば問題なく実現できるかと思います。
是非 CI/CD などに組み込んで、動的にテストを行っていきましょう!
まとめ
今回はテスト用に、支払い方法が割り当て済みのCustomerを作成する紹介をしました。
最後にCustomerのinvoice_settings.default_payment_methodを更新する処理を忘れないようにしましょう。
自分の備忘録的な感じの記事になってしまいましたが、どなたかの役に立てば幸いです。
ではまた!