1.支付寶配置settings
# 支付寶配置 ALIPAY_APPID = '2016102600762759' # 沙箱環境中alipay應用ID ALIPAY_DEBUG = True ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do' # alipay沙箱環 境支付寶網管 ALIPAY_RETURN_URL = 'http://127.0.0.1:8888/payment/callback/' # 支付完成后支 付寶回調我們應用的地址
2.model遷移商品表,訂單表,用戶購買課程表(注:vip表與用戶表關聯)
from django.db import models # Create your models here. from utils.MyBaseModel import Base class Goods(Base): GOODS_TYPE=( ('1','Vip'), ('2','Course') ) CHANNEL_TYPE=( ('1','普通'), ('2','促銷') ) course = models.ForeignKey('course.Course', on_delete=models.PROTECT) goods_type = models.CharField('商品種類', choices=GOODS_TYPE, max_length=8) product_id = models.CharField('產品id', max_length=8) title = models.CharField('商品名稱', max_length=24) price = models.DecimalField('商品價格', max_digits=8, decimal_places=2) channel_type = models.CharField('購買渠道', choices=CHANNEL_TYPE, max_length=8) period = models.IntegerField('有效期', default=365) is_launched = models.BooleanField('是否上架', default=True) class Meta: db_table = 'tb_goods' def __str__(self): return self.title class Order(Base): PAY_METHOD=( (1,'支付寶'), ) ORDER_STATUS=( (1,'待支付'), (2,'已支付'), (3,'已取消'), ) user = models.ForeignKey('user.User', on_delete=models.PROTECT, verbose_name="下單用戶") goods = models.ForeignKey(Goods, on_delete=models.PROTECT) order_id = models.CharField('訂單號', max_length=24) trade_no = models.CharField('支付寶訂單號', max_length=32, null=True) # 28位 pay_time = models.DateTimeField('支付時間', null=True) pay_method = models.CharField('支付方式', choices=PAY_METHOD, default=1, max_length=8) status = models.CharField('支付狀態', choices=ORDER_STATUS, default=1, max_length=8) total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品總金額") class Meta: db_table = 'tb_orders' def __str__(self): return self.order_id class GoodsCourse(Base): """ 用戶購買的課程 """ user = models.ForeignKey('user.User', on_delete=models.CASCADE, related_name='paycourse') course = models.ForeignKey('course.Course', on_delete=models.CASCADE, related_name='payuser') class Meta: db_table = 'tb_usercourse' def __str__(self): return "用戶:%s, 課程:%s" % (self.user.username, self.course.title) class Vip(Base): vip_choise = ( ('0', '普通用戶'), ('1', '普通會員'), ('2', '高級會員'), ) title=models.CharField('vip名稱',max_length=16) vip_type = models.CharField('Vip種類', choices=vip_choise, max_length=4) desc = models.CharField('vip描述', max_length=255) period = models.IntegerField('有效期', default=365) class Meta: db_table = 'tb_vip' def __str__(self): return self.title class User(AbstractUser): phone = models.CharField('手機號',max_length=20) img = models.ImageField(upload_to='user',null=True) nick_name = models.CharField('昵稱',max_length=20) address = models.CharField('地址',max_length=255) vip = models.ForeignKey(Vip, on_delete=models.SET_NULL, default=None, null=True) vip_expiration = models.DateField('vip到期時間', blank=True, default=None, null=True) class Meta: db_table = 'tb_user'
3.獲取支付寶生成碼函數
# -*- coding: utf-8 -*- from user.models import * class EmailAuthBackend: def authenticate(self, request, username=None, password=None): try: user=User.objects.get(username=username) except Exception as e: user = None if not user: try: user = User.objects.get(email=username) except Exception as e: user = None if user and user.check_password(password): return user else: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None def jwt_response_payload_handler(token, user=None, request=None, role=None): """ 自定義jwt認證成功返回數據 : token 返回的jwt :user 當前登錄的用戶信息[對象] : request 當前本次客戶端提交過來的數據 :role 角色 """ # permission_classes = (MyPermission,) # # 自定義認證類, 自定義會覆蓋全局配置 # permission_classe=[IsAuthenticated] # 接口中加權限 if user.first_name: name = user.first_name else: name = user.username return { 'authenticated': 'true', 'id': user.id, "role": role, 'name': name, 'username': user.username, 'email': user.email, 'token': token, } # # 自定義權限類
4.序列化商品表
from .models import * from rest_framework import serializers class GoodSerlizier(serializers.ModelSerializer): class Meta: model=Goods fields="__all__"
5.POST生成訂單,POST回填改變訂單狀態
from django.shortcuts import render from rest_framework.views import APIView from rest_framework.permissions import AllowAny,IsAuthenticated from rest_framework.response import Response from .models import Goods,Order,GoodsCourse from rest_framework import viewsets from decimal import Decimal from goods.utils import get_order_id, get_pay_url,alipay from .serliazer import * # Create your views here. class PayUrlView(APIView): permission_classes = (IsAuthenticated,) def post(self,request): goods_id=request.data.get('goods_id') print(goods_id) goods=Goods.objects.get(id=goods_id) user=request.user order_id = get_order_id() if user.vip.vip_type == '1': # 普通會員 goods_price = goods.price * Decimal('0.80').quantize(Decimal('0.00')) elif user.vip.vip_type == '2': # 高級會員 goods_price = goods.price * Decimal('0.60').quantize(Decimal('0.00')) else: # 普通用戶 goods_price=goods.price goods_price = Decimal(goods_price).quantize(Decimal('0.00')) order = Order(user=user, goods=goods, order_id=order_id, pay_method=1,total_amount=goods_price) order.save() print(order.total_amount,type(order.total_amount)) # 3. 根據訂單 生成支付鏈接 subject="實驗樓訂單:%s, 價格:%s" % (order.order_id, order.total_amount) pay_url=get_pay_url(order.order_id, order.total_amount, subject) # 4. 返回鏈接 return Response({"code": 0, "msg": "下單成功", "data": {"pay_url": pay_url}}) class PeyMentVIew(APIView): def post(self,request): data=request.data sign=data.pop('sign') order=Order.objects.get(order_id=data['out_trade_no']) order.trade_no=data['trade_no'] order.pay_time=data['timestamp'] order.status = 2 order.save() user=order.user course=order.goods.course GoodsCourse.objects.create(user=user,course=course) return Response({"code":0,"msg":"sussful"})