こんにちは、サイオステクノロジーの佐藤 陽です。
今回は決済処理のサービスを提供している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の概要
curl https://api.stripe.com/v1/products \
-u {STRIPE_SECRET_KEY} \
-d name="Gold Special"
- 認証方法
- Metadataの登録
- Child Parameterの利用
認証方法
これに関してAPI DocumentのAuthenticationの項目にも記載があり
You do not need to provide a password.
と書いてあります。
-u {STRIPE_SECRET_KEY} \
-H "Authorization: Bearer ${STRIPE_SECRET_KEY}" \
と変更します。
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