创建商品goods模型

创建goods模型

python ../manage.py startapp goods # 创建course模型

在setting.py中注册goods模型

INSTALLED_APPS = [
    'goods.apps.GoodsConfig',
]
# 注:pycharm无法联想,需要把apps文件夹设置为源根

创建 goods/urls.py路由文件

from django.urls import path, re_path
from . import views
urlpatterns = [
    path('getpayurl/', views.PayUrlView.as_view()),
    path('peyment/', views.PayMentView.as_view()),
]

goods/admin.py路由文件

from django.contrib import admin
from . import models
# Register your models here.
admin.site.register(models.Goods)
admin.site.register(models.Orders)

goods/models.py路由文件

from django.db import models
from utils.MyBaseModel import Base
# Create your models here.


class Goods(Base):
    GOODS_TYPE = (
        ('1', 'Vip'),
        ('2', 'Course')
    )
    CHANNEL_TYPE = (
        ('1', '普通'),
        ('2', '促销')
    )
    course = models.ForeignKey('course.Coures', 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 Orders(Base):
    PAY_METHOD = (
        (1, "支付宝"),
    )
    ORDER_STATUS = (
        (1, "待支付"),
        (2, "已支付"),
        (3, "已取消"),
    )
    user = models.ForeignKey('users.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

goods/serializers.py路由文件

from rest_framework import serializers
from goods.models import Goods

class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Goods

        fields = '__all__'   # 所有字段

goods/utils.py路由文件

支付宝

import datetime
import os
import random

from alipay import AliPay
from syl import settings

app_private_key_path = os.path.join(settings.BASE_DIR,"apps/goods/key/app_private_key.pem")
alipay_public_key_path = os.path.join(settings.BASE_DIR,"apps/goods/key/alipay_public_key.pem")
with open(app_private_key_path) as f:
    app_private_key_string = f.read()
with open(alipay_public_key_path) as f:
    alipay_public_key_string = f.read()

alipay = AliPay(
    appid=settings.ALIPAY_APPID,
    app_notify_url=None,
    # 默认回调url
    app_private_key_string=app_private_key_string,
    alipay_public_key_string=alipay_public_key_string,
    # app_private_key_path=app_private_key_path,
    # alipay_public_key_path=alipay_public_key_path,
    sign_type="RSA2",
    debug=settings.ALIPAY_DEBUG
)

def get_pay_url(out_trade_no, total_amount, subject):
    # 生成登录支付宝连接
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no=out_trade_no,
        total_amount=str(total_amount),
        subject=subject,
        return_url=settings.ALIPAY_RETURN_URL,
    )
    # 响应登录支付宝连接
    # 真实环境电脑网站支付网关:https://openapi.alipay.com/gateway.do? + order_string
    # 沙箱环境电脑网站支付网关:https://openapi.alipaydev.com/gateway.do? +order_string
    alipay_url = settings.ALIPAY_URL + "?" + order_string
    return alipay_url


def get_order_id():
    d = datetime.datetime.now()
    base = 'SYL'
    time_str = '%04d%02d%02d%02d%02d%02d' % (d.year, d.month, d.day, d.hour,d.minute, d.second)
    rand_num = str(random.randint(10000, 99999))
    return base + time_str + rand_num

goods/views.py路由文件

# -*- coding: utf-8 -*-
from rest_framework.views import APIView
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from .models import Goods,Orders
from goods.utils import get_order_id, get_pay_url, alipay
from decimal import Decimal
from course.models import UserCourse


class PayUrlView(APIView):
    permission_classes = (IsAuthenticated,)

    def post(self, request):
        # 1. 获取课程id,获取购买途径(普通购买, 促销购买) 获取用户
        goods_id = request.data.get('goods_id')
        goods = Goods.objects.get(id=goods_id)
        user = request.user
        # 2. 下定单
        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 = Orders(user=user, goods=goods, order_id=order_id, pay_method=1,
                       status=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 PayMentView(APIView):
    permission_classes = (AllowAny,)

    def post(self,request):
        # 1. 获取了支付宝返回的数据
        data=request.data
        print(data)
        sign=data.pop('sign')
        order=Orders.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
        UserCourse.objects.create(user=user,course=course)
        return Response({
    
    'code':0,'msg':'购买成功'})

syl/setings.py中配置支付相关参数

# 支付宝配置
ALIPAY_APPID = '2016101800716047' # 沙箱环境中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/' # 支付完成后支付宝回调我们应用的地址

测试

  • 请求地址
  • `http://192.168.56.100:8888/goods/getpayurl/
  • 携带参数
{
    
    
	"goods_id":1
}
  • 返回数据
{
    
    
	"code":0,
	"msg":"下单成功",
	"data":{
    
    
		"pay_url":"https://openapi.alipaydev.com/gateway.do?
		app_id=2016101800716047&biz_content=%7B%22subject%22%3A%22%5Cu5b9e%5Cu9a8c%5Cu697
		c%5Cu8ba2%5Cu5355%3ASYL2020101216322149584%2C+%5Cu4ef7%5Cu683c%3A99.00%22%2C%22ou
		t_trade_no%22%3A%22SYL2020101216322149584%22%2C%22total_amount%22%3A%2299.00%22%2
		C%22product_code%22%3A%22FAST_INSTANT_TRADE_PAY%22%7D&charset=utf8&method=alipay.trade.page.pay&return_url=http%3A%2F%2F127.0.0.1%3A8888%2Fpayment
		%2Fcallback%2F&sign_type=RSA2×tamp=2020-10-
		12+16%3A32%3A21&version=1.0&sign=qIM7yrjYgvqOn2DCYK4rBgtwqDnZ%2BTwf89axXQPMzk67FO
		OHH18YtnoROi4ml5i5w%2Fd%2FtD2RsYyxU5Jeatxw9Skz%2B9HQCAYfmQriYDo5fz2hOrC6Ydx92z5%2
		BB5o%2BUIh29EAE8JS5MhUOOO8T3r9NtzmQTOs0kSWpnaXjX4S7l9Z83li76MG83H18jBodpWofgzcTTD
		dPsBnaHmeeJjGg9LKgSDS37ZKP9GE79asVn8S9w49qVmTPzZGdKIZxyLf2K44EllnGxhlDLFRlGLYJOlE
		%2Bxo1hr3IKH40WoYh3fkmv2%2FEDnl0OtNXHt5HRUH4uZ2k38BNf1ebrODRqWRg1eQ%3D%3D"
	}
}

猜你喜欢

转载自blog.csdn.net/dasfa11/article/details/109105730