2020/06/16

PythonでStripeのSubscriptionを実装してみた

pythonstripe

概要

WebサイトにStripeを使った決済を導入することになりました。

以前の記事では、クライアント側の実装を中心に実施しましたが、
今回はサーバーサイドがメインです。

サーバーはPythonで実装しているため、Pythonの本家のSDKを使って実装してみました。

実装内容

install

% poetry add stripe

config

  • .envSTRIPE_SECRET_KEY という変数名で、stripeのシークレットキーを定義しておきます。
  • 事前にStripeの価格(Price)と商品(Product)を作成しておき、価格のIDを .env に定義しておきます。

実装

流れとしては以下になります。

基本的に本家のドキュメントサイトを参考にして作っています

  • 顧客(Customer)データを登録します。
  • (クライアント側で作った)PaymentMethodを顧客に紐付ける
  • 定期購入(Subscription)データを作り、そこに顧客を紐づける

顧客(Customer)データの登録

stripe.api_key = STRIPE_SECRET_KEY # Stripeのsecret key
stripe_customer = stripe.Customer.create(email=email, name=name)
# stripe_customer["id"] などをDBに保存しておきます。

PaymentMethodを顧客に紐付ける

# Attach the payment method to the customer
stripe.PaymentMethod.attach(
    payment_method_id, # client側で作ったものをhttpのformなどで渡す
    customer=customer_id # 前述で作った、stripe_customer["id"]
)
# Set the default payment method on the customer
stripe.Customer.modify(
    customer_id, # 前述で作った、stripe_customer["id"]
    invoice_settings={
        "default_payment_method": payment_method_id, # client側で作ったものをhttpのformなどで渡す
    },
)

定期購入(Subscription)データを作り、そこに顧客を紐づける

# Create the subscription with first fee(additional invoice items)
# ここでは初回購入時の手数料(一回限りの料金)を追加しています。
add_invoice_items = [{
    "price": STRIPE_PRICE_ID_FEE,  # 事前に作成した価格のID(一回のみ請求のもの)
    "quantity": 1
}]
items = [{
    "price": STRIPE_PRICE_ID_MONTHLY  # 事前に作成した価格のID(月額課金用)
}]
subscription = stripe.Subscription.create(
    customer=customer_id,
    items=items,
    add_invoice_items=add_invoice_items,
    expand=["latest_invoice.payment_intent"],
)

こちらを連結させると、ユーザーがクレジットカードを使ってSubscriptionを簡単に作成することができました。
以上になります。