【Stripe】顧客の支払処理に保存したクレジットカードを使う方法【Django】

アイキャッチ画像
  • Stripeを用いて、顧客の支払処理に保存したクレジットカードを使う方法とは?
  • StripeのCustomer API・Payment Intent APIの使い方とは?

本記事ではこのような疑問を解決します。

前回こちらの記事でStripeを用いた、顧客登録とクレジットカード保存の方法を解説しました。

関連記事

Stripeを用いた、顧客登録とクレジットカード保存の方法とは?StripeのCustomer API・Setup Intent APIの使い方とは? 本記事ではこのような疑問を解決します。Webアプリ開発の中でStripeを利用し[…]

アイキャッチ画像

今回は上の記事の続きとして、
顧客の支払処理に保存したクレジットカードを使う方法を解説していきます。

なお、本記事では前回と同様WebフレームワークにDjangoを使用します。
(※他の言語・FWでも書き方が異なるだけで実装方法は基本的に同じです。)

顧客の支払処理に保存したクレジットカードを使う処理の流れ

今回は、
「会員登録を済ませたログインユーザーが以前登録したクレジットカードで支払処理をする」
という流れで話を進めていきます。

①ユーザー側:支払画面にアクセスする


①開発者側:
・バックエンド(views.py)
→テンプレートへ渡す支払金額を指定する

→Customerオブジェクトから顧客のカード情報を取得する

・フロントエンド(stripe.js)
→バックエンドから受け取ったデータ(支払金額・カード情報)を表示する

②ユーザー側:利用するクレジットカードを選択し、支払確定ボタンを押す


②開発者側:
・バックエンド(views.py)
→Customerオブジェクトから顧客が選択したカード情報を取得する
→Payment Intentオブジェクトを生成する
→任意で支払情報をDBに保存する

③ユーザー側:支払い完了画面等が表示される


③開発者側:
・バックエンド(views.py)
→支払い完了ページ等を表示する

顧客登録とクレジットカード保存の実装手順

ここでは以下のDjangoプロジェクトを前提とし、顧客の支払処理に保存したクレジットカードを使う処理に関係するファイルのみを操作します。

 sampleproject
 ├── sampleapp
 │   ├── __init__.py
 │   ├── admin.py
 │   ├── apps.py
 │   ├── migrations
 │   │   └── (中身省略)
 │   ├── models.py
 │   ├── tests.py
 │   └── views.py
 ├── sampleproject
 │   ├── __init__.py
 │   ├── __pycache__
 │   │   └── (中身省略)
 │   ├── asgi.py
 │   ├── settings.py
 │   ├── urls.py
 │   └── wsgi.py
 ├── templates
 │   ├── payment.html
 │   └── thanks.html
 └── manage.py 

バックエンド(Django)側の設定

DjangoでのStripe初期設定をする(settings.py)

#Stripeのダッシュボードからシークレットキーとパブリックキーをコピペする
STRIPE_API_KEY = 'Stripeのシークレットキー'
STRIPE_PUBLISHABLE_KEY = 'Stripeのパブリックキー'

URLを設定する(urls.py)

urlpatterns = [
    path('payment/', views.payment, name="payment"),# 支払画面を表示する
    path('payment_post/', views.payment_post, name="payment_post"),# 支払処理を行う
    path('thanks/', views.thanks, name="thanks"),# 支払処理完了ページ等を表示する
]

支払いページを返す処理を記述する(views.py)

まずは顧客が支払う金額を指定します。

支払金額は任意の方法で数値を取得しましょう。

今回は支払金額を2,000円とします。

次に事前に生成してあるCustomerオブジェクトから、顧客のカード情報を取得します。

今回は1人の顧客が2つのカードを登録しているという想定です。

from django.conf import settings
import stripe

def payment(request):
    # 何かしらの方法で、StripeのCustomerオブジェクトIDをDBに格納しておく→Userテーブル(orその他テーブル)
    user = request.user
    customer_id = user.stripe_customer_id# CustomerオブジェクトIDを格納するフィールド名(任意)

    # 支払金額(amount)を何かしらの方法で指定する→ECサイトであればカート内商品の合計金額など
    amount = 2000
    
    stripe.api_key = settings.STRIPE_API_KEY
    card_list = stripe.Customer.list_payment_methods(
            customer_id,# CustomerオブジェクトID
            type="card",
            )
    context = {
            "amount": amount,# 支払金額
            "card_list": card_list,# 顧客のカード情報
        }
    template_name = 'payment.html'
    return render(request, template_name, context)

支払情報が送信された後の処理を記述する(views.py)

まずは支払画面からPOST送信された情報(顧客が選択したカードの情報)をもとに、
Customerオブジェクトから、支払処理に使用するカードを取得します。

次に、支払いに必要な情報を挿入したPayment Intentオブジェクトを生成します。

これで支払処理自体は完了です。

なお、支払処理完了後に任意でデータベースにPayment Intentオブジェクトのidを保存するのも良いでしょう。

※今回はエラーが起きた場合の処理は省略します。

def payment_post(request):
    user = request.user
    customer_id = user.stripe_customer_id
    
    stripe.api_key = settings.STRIPE_API_KEY
    stripe_card = stripe.Customer.list_payment_methods(
        customer_id,
        type="card",
        )

    # 今回はStripeからのカード情報の取得順によって、支払いに使用するカードを指定する
    card_number = request.POST.get('card_number')
    selected_card = stripe_card["data"][int(card_number)]["id"]
    amount = request.POST.get('amount')

    payment_intent = stripe.PaymentIntent.create(
            amount=amount,# 支払金額
            currency='jpy',# 利用通貨
            customer=customer_id,# CustomerオブジェクトID
            payment_method=selected_card,# 支払いに使用するクレジットカード
            off_session=True,# 支払いの実行時に顧客が決済フローに存在しないことを示す
            confirm=True,# PaymentIntentの作成と確認を同時に行う
            )
    # PaymentIntentオブジェクトIDをDBに保存する場合は、「payment_intent.id」をsave()でDB保存する

    return redirect('app:thanks')


# 単純に、支払完了ページを表示する処理
def thanks(request):
    template_name = "thanks.html"
    return render(request, template_name)

フロントエンド(HTML・JavaScript)側の設定

支払いページを作成する(payment.html)

<!DOCTYPE html>
{% load static %}
<html lang="ja">
    <head>
        <meta charset="UTF-8"> 
    </head>
    <body>
        <form action="{% url 'app:payment_post' %}" method="POST">
        <input type="hidden" name="amount" value="{{ amount }}"/>
        <p>合計金額:{{ amount }}円</p>
    {% for c in card_list %}
    <div>
        <!-- 今回はStripeからのカード情報の取得順で使用するカードを指定 -->
        <input type="radio" name="card_number" value="{{ forloop.counter0 }}" required/>
        <!-- 顧客が登録してあるカード情報の表示→表示する項目は選択するカードたちを区別できるものにする -->
        <p>{{ c.card.brand }}<br>{{ c.card.exp_month }}<br>{{ c.card.exp_year }}<br>{{ c.card.last4 }}</p>
    </div>
    {% endfor %}
    <button type="submit">支払い確定</button>{% csrf_token %}
</form>
        
    </body>

支払処理完了後に表示するページのファイルを作成する(thanks.html)

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <p>支払完了</p>
    </body>

まとめ

以上がStripeを用いた、顧客の支払処理に保存したクレジットカードを使う方法になります。

簡単に流れをおさらいすると、
事前に生成されたCustomerオブジェクトから、支払いに使うカード情報を取得し、
そのカード情報を引数に指定したPayment Intentオブジェクトを生成するというプロセスです。

本記事が、少しでもStripeを用いたWebアプリ開発の手助けになれれば幸いです。

実務1年未満でもOK!フリーランスエンジニアの案件獲得方法はこちら!

必読

フリーランスエンジニアが案件獲得方法とは?自ら営業せずに案件を獲得するには?実務経験1年未満でも大丈夫なの? 本記事ではこのような疑問を解決します。これからフリーランスエンジニアとして独立したい方は、兎にも角にも案件の獲得が急務です[…]

アイキャッチ画像