今回は決済処理のサービスを提供しているStripe社のAPIを利用し、
Stripeアカウントの商品や価格オブジェクトを一括生成するスクリプトを作成してみました。
はじめに
Stripeの肝となるオブジェクトとして、Product(製品)とPrice(価格)があります。
これはCustomer等のオブジェクトと異なり、実際にお客さんに使っていただく前に生成することが多いかと思います。
もちろん、Stripeのダッシュボードから手作業で追加することも可能です。
ただ、Stripeアカウントを切り替える場合や、テスト環境を作成する場合など
毎回追加するのは面倒ですし、ミスによって差分が発生することもあります。
また、Infrastructure as Codeの思想で行くと、ここもコードで管理したくなりますね。
ということで、今回はProductとPriceを一発で構築するようなシェルスクリプトを書いていきたいと思います。
環境
今回のスクリプトを実行する環境および必要なものです
- WSL2(Ubuntu 20.04)
- curl
- jq
- Stripe API(2022-08-01)
- Stripe Secret Key
ゴール
今回は、スクリプトの実行によって以下のようなオブジェクトが作成されることをゴールとします。
APIの概要
Stripeは非常に丁寧なAPIドキュメントがあるので助かります。
Stripe API reference
今回はProductとPriceのAPIを使っていきます。
早速Productから作っていきましょう。Create ProductのAPIが用意されており、サンプルコードも提供されています。
curl https://api.stripe.com/v1/products \
-u {STRIPE_SECRET_KEY} \
-d name="Gold Special"
基本的にパラメータを与えていけば問題なくAPIの実行が出来ますが
個人的に引っかかったポイントが3点あるので、ご紹介します。
- 認証方法
- Metadataの登録
- Child Parameterの利用
認証方法
サンプルコードでは-uオプションを使っていますが、こうした場合実行時にパスワードが聞かれます。これに関してAPI DocumentのAuthenticationの項目にも記載があり
You do not need to provide a password.
と書いてあります。
ただ、入力が不要なのに毎回聞かれるのは気持ち悪いですよね。そのため、Bearer認可を使った方法に切り替えます。ヘッダーに“Authorization : Bearer {secret key}”を入れてあげればいいので
-u {STRIPE_SECRET_KEY} \
を
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
と変更します。
Metadata
Product作成時にMetadataを追加したいと思います。特に難しいことは無いですが、渡し方に少し癖があり
-d "metadata[author]"="SIOS TARO"
-d "metadata[publisher]"="SIOS Technology"
といった感じで、配列の形を使ってパラメータを渡してあげましょう。
Child Parameter
APIに渡すパラメータのなかで、ChildParameterを持っているものもいくつかあります。
いわゆる入れ子型になっているパラメータです。
例えばProductであればdefault_price_dataとったパラメータがあり、
このパラメータを使う事で、Productに紐づくPriceを同時に作成することができます。
例えば、priceの請求間隔を指定するためには
default_price_data.recurring.interval
という2階層潜ったパラメータまで指定する必要があります。
この際のパラメータの引き渡し方としては
-d "default_price_data[recurring][interval]"="month"
こんな感じに書くことができます。
配列で繋げていくことで深い階層に潜って行けるようです
定義されていないChild Parameter
先ほどdefault_price_dataを例に挙げてChild Parameterについて説明しましたが
続いて、同時作成するPriceにもMetadataを追加したいと思います。
ただ、ドキュメントを見るとChild Parameter内にMetadataの項目が見つかりません。
先ほどの流れで実装すると
-d "default_price_data[metadata][interval]"="Month"
といった感じでメタデータを与えればできそうですが、
結論から言うと、できませんでした。
実行してもStrip側からエラーが返ってきてしまったので
本来のObjectに含まれてるからといって、何でもかんでも設定できるわけではないようです。
(※全ての対して検証したわけではないので例外もあるかもしれないです。)
あとは、Productに対して2つ以上のPriceを作成したい場合もdefault_price_dataでは対応できなさそうですね。
なので、こういった場合は素直に
- Create ProductでProductを作成
- ProductのIdを使ってPriceを作成
という2段階のステップを踏むのがよさそうです。
スクリプトの作成
これまで書いたことを踏まえて、実際にスクリプトを書いてみます。
1つ注意する点として、curlのレスポンスからIdを取得する際、ダブルクォーテーション(“)が含まれています。そのままPriceのAPIに投げるとエラーが起きるので、sedコマンドを使って取り除いてあげましょう!
また、意図的に統一感のない書き方をしているので、自分のケースにあった書き方を採用してみてください。もっといい書き方あればぜひコメントで教えてください!
product_a
#Secret Keyを入力してください
STRIPE_SECRET_KEY=""
#ProductとPriceを同時に作成
curl https://api.stripe.com/v1/products \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d name="product_a" \
-d description="This is product_a" \
-d "metadata[author]"="SIOS TARO" \
-d "metadata[publisher]"="SIOS Technology" \
-d "default_price_data[currency]"="JPY" \
-d "default_price_data[unit_amount]"="3000" \
-d "default_price_data[recurring][interval]"="month"
product_b
#Secret Keyを入力してください
STRIPE_SECRET_KEY=""
#Productを作成した後に、Id情報を使って各Priceを作成
productId=$(curl https://api.stripe.com/v1/products \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d name="product_b" \
-d description="This is product_b" \
-d "metadata[author]"="SIOS HANAKO" \
-d "metadata[publisher]"="SIOS Technology" | jq .id | sed 's/"//g')
curl https://api.stripe.com/v1/prices \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d unit_amount=5000 \
-d currency=jpy \
-d "recurring[interval]"=month \
-d product=$productId \
-d "metadata[interval]"="month"
curl https://api.stripe.com/v1/prices \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
-d unit_amount=50000 \
-d currency=jpy \
-d "recurring[interval]"=year \
-d product=$productId \
-d "metadata[interval]"="year"
スクリプト実行
あとは書いたスクリプトを実行するだけです。
source create.sh
といった感じでスクリプトを実行してあげれば、ProductとPriceが生成されます。
まとめ
今回はStripeのAPIを使ってスクリプトを書いてみました。簡単なスクリプトを書くだけで、Stripeの環境が楽になり、コードでの管理もできるようになりました!
是非みなさんも試してみてください。