[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
サーバーを起動します。
コマンド
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 | クレジットカード フォーム]