支付寶沙箱模擬生成訂單,回調訂單狀態


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"})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM