路飞支付相关

内容回顾

1.路飞学成的购物车如何实现?

  前面文章

2.商品是否有个数?

  -价格策略【用周期时间来类比个数,7天,15天,一个月】
  -购买多个无意义,因为都是从同一天开始往后累加。

3.购物车在redis中的结构。

shopping_car_[user_id]_[commodity_id]为键,然后商品详细为值。
{
    "code": 1000,
    "data": [
        {
            "title": "语文阅读",
            "img": "25852585.jpg",
            "policy": {
                "1": {
                    "period": 3,
                    "period_display": "3天",
                    "price": 111
                },
                "4": {
                    "period": 30,
                    "period_display": "1个月",
                    "price": 399
                }
            },
            "default_policy": "4"
        },
        {
            "title": "数学算数",
            "img": "451646",
            "policy": {
                "2": {
                    "period": 3,
                    "period_display": "3天",
                    "price": 222
                }
            },
            "default_policy": "2"
        }
    ],
    "error": null
}
示例

4.购物车购买数量有限制吗

可以对购买个数进行限制,通过计算长度,看买了多少

print(len(conn.keys("luffy_shopping_car_1_1")))

5.购物车是否设置超时时间?

conn.expire("luffy_shopping_car_1_1",60*30)  #30min后过期也可以

使用方案:对购买课程个数进行限制

6.为什么把购物车信息放到redis中。

  1.操作频繁,对数据库压力大,可以使用redis
  2.操作速度快
  3.购物车只是一个临时状态,而不是永久保存的

临时补充:

Django Rest Framework 接口书写规范
原则:

  • 简单逻辑先处理
  • try
  • 细粒度异常+自定义异常

    -内置

    -框架

    自定义

  • 注释
  • 文件注释【README.md】
  • 类注释
  • 函数注释
  • 文件名,类,函数,project
  • 对内容功能进行分类【views文件夹下可以创建多个views,每个views的功能是类似的】
  • 减少代码层级 不用一直if-else,直接return即可。
  • BaseResponse

开始真正的支付结算

1.首先还是在URL中添加一条路径

    url(r'payment/$',payment.PaymentViewSet.as_view())

2.创建payment.py文件【未完】

# Author:Jesi
# Time : 2018/11/22 15:33
from rest_framework.views import APIView
from ..auth.auth import LuffyAuth
from rest_framework.response import Response
from django.conf import settings
from django_redis import get_redis_connection
import json
from utils.response import BaseResponse
from api import models
import datetime

class PaymentViewSet(APIView):
    authentication_classes = [LuffyAuth,]    #首先肯定还是进行认证
    conn=get_redis_connection("default")     #链接到redis
    def post(self,request,*args,**kwargs):
        ret=BaseResponse()
        try:
            payment_dict={}

            # 1.1获取用户要结算课程ID
            course_id_list=request.data.get("courseids")
            for course_id in course_id_list:
                payment_course_dict={}

                car_key=settings.SHOPPING_CAR_KEY%(request.auth.user_id,course_id)

                #1.2监测用户要结算的课程是否已加入到购物车
                if not self.conn.exists(car_key):
                    ret.code=1001
                    ret.error="课程需要先加入购物车才能结算"

                # 1.3根据key去购物车中获取信息,放入到结算中心。
                policy=json.loads(self.conn.hget(car_key,'policy').decode('utf-8'))
                default_policy=self.conn.hget(car_key,'default_policy').decode('utf-8')
                policy_info=policy[default_policy]

                payment_course_dict={
                    "title" :self.conn.hget(car_key,'title').decode('utf-8'),
                    "img":self.conn.hget(car_key,'img').decode('utf-8'),
                    "policy_id":str(course_id),
                    "coupon":{},
                    "default_coupon":0
                }

                payment_course_dict.update(policy_info)
                payment_dict[str(course_id)]=payment_course_dict
       ret.data=payment_dict
            
       #从这儿开始往下是优惠券的逻辑,还没写完【半成品】
       #主要展示的是拿到购物车商品展示的逻辑
       
       #
2.获取优惠券 ctime=datetime.date.today() from django.db.models import Q #a.通过表达式进行构造 Q(Q(account=request.auth.user)&Q(status=0))|Q(coupon__valid_begin_date__lte=ctime) #b.通过方法进行构造 q=Q() q1=Q() q1.connector="AND" q1.children.append(('account',request.auth.user)) q1.children.append(('status',0)) q1.children.append(('coupon__valid_begin_date__lte',ctime)) q2=Q() q2.connector = "AND" q2.children.append(('coupon__valid_end_date__lte',ctime)) q.add(q1,'OR') q.add(q2,'OR') coupon_list=models.CouponRecord.objects.filter( account=request.auth.user, status=0, coupon__valid_begin_date__lte=ctime, coupon__valid_end_date__gte=ctime, ) for coupon in coupon_list: print(coupon)        #到此处结束购物车【半成品】

     except Exception as e:   pass return Response(ret.dict)

既然要结算,那么我们需要把拿到购物车中的物品,以课程号为键,以课程详细信息为值进行结构的构造,最后获取到后,才可以进行优惠券的获取然后对价格进行减免。

我们传入的值是一个课程ID,可为列表因为可能会出现购买多个课程

{"courseids":[1,2]}

3.对优惠券进行操作。

原文地址:https://www.cnblogs.com/geogre123/p/10012579.html