djangoとstripeを使って定期購読の機能を作成する方法を忘れないように記事にしておく。
Stripeとは
決済プラットフォームです。自分で決済機能を実装することなくStripeが用意してくれているAPIを叩くだけで決済機能を自分のアプリに搭載できます。
実装の流れ
実装の流れとしては以下のような流れになります
定期購読用の商品を作成
Stripeのwepページでログインをし、下記の画面の商品を追加で商品を追加します。
決済ボタンを作成
<form action="/checkout/" method="POST">
{% csrf_token %}
<script
src="https://checkout.stripe.com/checkout.js"
class="stripe-button"
data-key={{stripe_key}}
data-amount="1000"
data-name="お支払い"
data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
data-locale="auto"
data-currency="JPY"
data-zip-code="false">
</script>
</form>
stripe_keyには、stripe画面の公開可能キーを設定します。左のメニューをクリックすると見ることができます。
下記のようにviewで返すようにしてあげるといいでしょう。
def stripePage(request):
context = {"stripe_key": settings.STRIPE_PUBLIC_KEY}
return render(request, 'stripePage.html', context)
顧客登録
決済後に実行されるviewのメソッドに顧客と登録する処理を実装します。
customer = stripe.Customer.create(
email=request.POST["stripeEmail"],
source=request.POST["stripeToken"], #トークン
)
postするとstripeEmailに決済時に記載するメールアドレス、stripeTokenにはトークンが入っているのでそれを使って顧客データを登録します。
顧客と定期購読商品の紐付け
下記のメソッドで定期購読商品と顧客登録で登録した顧客情報を紐付けます。
subs = stripe.Subscription.create(
customer=customer.id,
items=[
{
"plan": "プランID",
"quantity": 1,
},
]
)
プランIDには、Stripeの画面で確認できます。
最初に作成した商品の詳細情報の画面を確認すると料金の欄にplan_****というIDが記載されていると思います。そのIDを設定しましょう。
Stripeの顧客IDは、独自のアプリのモデルにユーザと紐付けて格納しておきましょう。
商品購入済みの顧客かどうかを確認
顧客情報は下記のコードで取得できます。
customer = stripe.Customer.retrieve("Stripeの顧客ID")
これで情報を取得し、取れるかどうか、もしくは一度削除された顧客かどうかをチェックします
ここは、もう少しいいチェックの方法がありそうです。詳しい方がいたら教えていただきたいです。
if not customer or ("deleted" in customer and customer.deleted):
解約時に顧客情報削除
顧客情報をdeleteメソッドで削除してしまいます。
stripe.Customer.delete(user.stripe_id)
以上です。
簡単ですね。ただ、クレジットカードの期限が切れた時などの処理がどうすればいいのかいまいちわかってないので、もう少し調べてみます。
コメントを書く