zoukankan      html  css  js  c++  java
  • 支付宝沙箱模拟生成订单,回调订单状态

    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"})
    做最野的狼
  • 相关阅读:
    Python使用Thrift
    python 使用 thrift 教程
    go语言每个工程是不是都要单独设置GOPATH?
    go mod开发模式设置
    在 Ubuntu 开启 GO 程序编译之旅
    基于gin web框架搭建RESTful API服务
    Go编程基础(介绍和安装)
    Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
    Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识
    JavaScript插件:快速选择日期----jedate日历插件
  • 原文地址:https://www.cnblogs.com/shanjiaaa/p/13823334.html
Copyright © 2011-2022 走看看