Agile育成ブログ
未来を変える喜びを
Django

stripe+Django


Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490

インストール

pip install stripe

settings.py

stripeの開発>APIから公開可能キーとシークレットキーを貼り付けます。


STRIPE_PUBLIC_KEY = ''
STRIPE_SECRET_KEY = ''

checkoutセッションの作成

価格や在庫状況など、商品在庫に関する機密情報は常にサーバー側に置き、顧客がクライアント側から操作できないようにします。 price_data または 事前定義された価格を使用して、Checkout セッションを作成する際に商品情報を定義し、その ID を渡します。
今回は月額のサブスクリプション

           line_items=[
               {
                   'price_data': {
                       'currency': 'usd',
                       'unit_amount': 2000,
                       'product_data': {
                           'name': 'Stubborn Attachments',
                           'images': ['https://i.imgur.com/EHyR2nP.png'],
                       },
                   },
                   'quantity': 1,
               },
           ],

modeがpaimentの場合。subscriptionにすると月額

mode='subscription',

決済が成功した場合とキャンセルページの URL を指定します。
success_urlとcancel_urlは、Djangoの関数(build_absolute_uri、reverse)を利用して、full pathを生成

success_url=request.build_absolute_uri(reverse('success.html')),
cancel_url=request.build_absolute_uri(reverse('cancel.html')),
import stripe
from django.views import generic
from django.http import JsonResponse
from django.urls import reverse


def create_checkout_session(request):
   stripe.api_key = settings.STRIPE_SECRET_KEY

   try:
       checkout_session = stripe.checkout.Session.create(
           payment_method_types=['card'],
           line_items=[
               {
                   'price_data': {
                       'currency': 'usd',
                       'unit_amount': 2000,
                       'product_data': {
                           'name': 'Stubborn Attachments',
                           'images': ['https://i.imgur.com/EHyR2nP.png'],
                       },
                   },
                   'quantity': 1,
               },
           ],
           mode='payment',
           success_url=request.build_absolute_uri(reverse('payment:success')),
           cancel_url=request.build_absolute_uri(reverse('payment:cancel')),
       )
       return JsonResponse({'id': checkout_session.id})
   except Exception as e:
       return JsonResponse({'error':str(e)})

cource.html,success.htmlとcancel.htmlを作成

{% extends "api/base.html" %}

{% block content %}
{% if user.is_authenticated %}
<form action="/create-checkout-session" method="POST">
  <section>
    <button type="button" id="checkout-button">1か月無料体験申し込み</button>
  </section>
</form>

<script type="text/javascript">
  // Create an instance of the Stripe object with your publishable API key
  var stripe = Stripe("pk_live_51JQu8WBHrrkrpmkS3FAPZsOxnpSSKXFwsnGdfqfGr1FRlgoRdvZaN64KqiLPSe0Bzzjd2o1hjEc3IIaAGFPAGIW200HmTQ2qAk");
  var checkoutButton = document.getElementById("checkout-button");

  checkoutButton.addEventListener("click", function () {
    fetch("/create_checkout_session/", {
      method: "POST",
      headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json; charset=UTF-8',
          'X-CSRFToken': '{{ csrf_token }}'
      },
    })
      .then(function (response) {
        return response.json();
      })
      .then(function (session) {
        return stripe.redirectToCheckout({ sessionId: session.id });
      })
      .then(function (result) {
        // If redirectToCheckout fails due to a browser or network
        // error, you should display the localized error message to your
        // customer using error.message.
        if (result.error) {
          alert(result.error.message);
        }
      })
      .catch(function (error) {
        console.error("Error:", error);
      });
  });
</script>
{% endif %}

{% endblock %}
<html>
<head>
 <title>購入がキャンセルされました</title>
</head>
<body>
 <section>
   <h1>購入がキャンセルされました</h1>
   <a href="{% url 'cource' %}">商品ページにもどる</a>
 </section>
</body>
</html>
<html>
<head>
 <title>購入ありがとうございます!</title>
</head>
<body>
 <section>
   <h1>購入ありがとうございます!</h1>
   <a href="{% url 'ebay_circle' %}">マイページへ</a>
 </section>
</body>
</html>

URL

urlpatterns = [   
    path('cource/', views.CourceView.as_view(), name='cource'),
  path('create_checkout_session/', views.create_checkout_session, name='checkout_session'),
    path('success/', views.PaymentSuccessView.as_view(), name='success'),
    path('cancel/', views.PaymentCancelView.as_view(), name='cancel'),
]

You cannot copy content of this page