学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Django3.2 | 34 | QRオーダーシステムの構築 | Stripeモデルの実装

[33 | カート実装] << [ホーム] >> [35 | クレジットカード フォーム]

まずは以下の手順でStripeのアカウントを取得してください。
mrradiology.hatenablog.jp


ダッシュボードで「公開可能キー」と「シークレットキー」をコピーします。

公開可能キーとシークレットキー
公開可能キーとシークレットキー


「qrmenu_server」側で作業します。


「qrmenu_server/qrmenucore/models.py」ファイルを以下のように編集します。


記述編集 【QRMenu/qrmenu_server/qrmenucore/models.py】

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

# Create your models here.
class Place(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    image = models.CharField(max_length=255)
    number_of_tables = models.IntegerField(default=1)

    def __str__(self):
        return "{}/{}".format(self.owner.username, self.name)
    
class Category(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE, related_name="categories")
    name = models.CharField(max_length=255)

    def __str__(self):
        return "{}/{}".format(self.place, self.name)
    
class MenuItem(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="menu_items")
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    price = models.IntegerField(default=0)
    image = models.CharField(max_length=255)
    is_available = models.BooleanField(default=True)

    def __str__(self):
        return "{}/{}".format(self.category, self.name)
    
class Order(models.Model):
    PROCESSING_STATUS = "processing"
    COMPLETED_STATUS = "completed"
    STATUSES = (
        (PROCESSING_STATUS, 'Processing'),
        (COMPLETED_STATUS, 'Completed'),
    )

    place = models.ForeignKey(Place, on_delete=models.CASCADE)
    table = models.CharField(max_length=2)
    detail = models.TextField()
    payment_intent = models.CharField(max_length=255)
    amount = models.IntegerField()
    status = models.CharField(max_length=20, choices=STATUSES, default=PROCESSING_STATUS)
    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return "{}/{}/{}円".format(self.place, self.table, self.amount)



タイムゾーンを日本時間に変更します。
「qrmenu_server/settings.py」ファイルを以下のように変更します。


記述変更 【QRMenu/qrmenu_server/qrmenu_server/settings.py】121行目〜123行目

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'



「qrmenucore/admin.py」ファイルに記述を追加します。


記述追加 【Desktop/QRMenu/qrmenu_server/qrmenucore/admin.py】8行目

from django.contrib import admin
from . import models

# Register your models here.
admin.site.register(models.Place)
admin.site.register(models.Category)
admin.site.register(models.MenuItem)
admin.site.register(models.Order)



マイグレーションファイルを作成します。
コマンド
python manage.py makemigrations

マイグレーションファイル作成
マイグレーションファイル作成



マイグレーションを実行します。
コマンド
python manage.py migrate

マイグレーション実行
マイグレーション実行



Stripeをインストールします。
コマンド
pip3 install stripe==2.56.0

Stripeインストール
Stripeインストール



サーバーを起動します。
コマンド
python manage.py runserver


ストライプの設定を追加します。
「qrmenu_server/settings.py」ファイルの最後に以下の記述を追加します。
シークレットキーは「sk_test_」から始まるキーです。


記述追加 【Desktop/QRMenu/qrmenu_server/qrmenu_server/settings.py】149行目

STRIPE_API_SECRET_KEY = "ご自分のStripeシークレットキーを入れてください。"



「qrmenu_server/urls.py」ファイルに記述を追加します。


記述追加 【Desktop/QRMenu/qrmenu_server/qrmenu_server/urls.py】21行目

from django.contrib import admin
from django.urls import path, include

from qrmenucore import views

urlpatterns = [
    path('admin/', admin.site.urls),

    path('auth/', include('djoser.urls')),
    path('auth/', include('djoser.urls.authtoken')),

    path('api/places/', views.PlaceList.as_view()),
    path('api/places/<pk>', views.PlaceDetail.as_view()),

    path('api/categories/', views.CategoryList.as_view()),
    path('api/categories/<pk>', views.CategoryDetail.as_view()),

    path('api/menu_items/', views.MenuItemList.as_view()),
    path('api/menu_items/<pk>', views.MenuItemDetail.as_view()),

    path('api/create_payment_intent/', views.create_pyment_intent),
]



「qrmenucore/views.py」ファイルに記述を追加します。


記述追加 【QRMenu/qrmenu_server/qrmenucore/views.py】

import json
import stripe

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings

from rest_framework import generics
from . import models, serializers, permissions

# Create your views here.
class PlaceList(generics.ListCreateAPIView):
    serializer_class = serializers.PlaceSerializer

    def get_queryset(self):
        return models.Place.objects.filter(owner_id=self.request.user.id)
    
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class PlaceDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = [permissions.IsOwnerOrReadOnly]
    serializer_class = serializers.PlaceDetailSerializer
    queryset = models.Place.objects.all()

class CategoryList(generics.CreateAPIView):
     permission_classes = [permissions.PlaceOwnerOrReadOnly]
     serializer_class = serializers.CategorySerializer

class CategoryDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    permission_classes = [permissions.PlaceOwnerOrReadOnly]
    serializer_class = serializers.CategorySerializer
    queryset = models.Category.objects.all()

class MenuItemList(generics.CreateAPIView):
     permission_classes = [permissions.PlaceOwnerOrReadOnly]
     serializer_class = serializers.MenuItemSerializer

class MenuItemDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    permission_classes = [permissions.PlaceOwnerOrReadOnly]
    serializer_class = serializers.MenuItemSerializer
    queryset = models.MenuItem.objects.all()

stripe.api_key = settings.STRIPE_API_SECRET_KEY

@csrf_exempt
def create_pyment_intent(request):
   try:
        data = json.loads(request.body)
        intent = stripe.PaymentIntent.create(
            amount = data['amount'],
            currency = 'jpy',
            payment_method = data['payment_method']['id'],
            off_session=True,
            confirm = True,
        )

        order = models.Order.objects.create(
            place_id = data['place'],
            table = data['table'],
            detail = json.dumps(data['detail']),
            amount = data['amount'],
            payment_intent = intent['id']
        )

        return JsonResponse({
            "success": True,
            "order": order.id,
        })

   except Exception as e:
        return JsonResponse({
            "success": False,
            "error": str(e),
        }) 



↓↓クリックして頂けると励みになります。


[33 | カート実装] << [ホーム] >> [35 | クレジットカード フォーム]