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'),
]