lf 前后端分离 (6) 支付
支付
import datetime from django.core.exceptions import ObjectDoesNotExist from rest_framework.views import APIView
from rest_framework.response import Response from app01.utils.auth import LoginAuth
from app01.utils.response import BaseResponse
from app01.utils.exception import CommonException
from app01.utils.pay import AliPay
from app01.models import * class PaymentView(APIView):
'''
模拟请求数据格式: {
is_beli:true,
course_list=[
{ course_id:1
default_price_policy_id:1,
coupon_record_id:2
},
{ course_id:2
default_price_policy_id:4,
coupon_record_id:6
}
],
global_coupon_id:3,
pay_money:298 } 状态码:
1000: 成功
1001: 课程不存在
1002: 价格策略不合法
1003: 加入购物车失败
1004: 获取购物车失败
1005: 贝里数有问题
1006: 优惠券异常
1007: 优惠券未达到最低消费
1008: 支付总价格异常 '''
authentication_classes = [LoginAuth] def get_alipay(self):
# 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
app_id = ""
# POST请求,用于最后的检测
notify_url = "http://47.94.172.250:8804/page2/"
# notify_url = "http://www.wupeiqi.com:8804/page2/"
# GET请求,用于页面的跳转展示
return_url = "http://47.94.172.250:8804/page2/"
# return_url = "http://www.wupeiqi.com:8804/page2/"
merchant_private_key_path = "keys/app_private_2048.txt"
alipay_public_key_path = "keys/alipay_public_2048.txt" alipay = AliPay(
appid=app_id,
app_notify_url=notify_url,
return_url=return_url,
app_private_key_path=merchant_private_key_path,
alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
debug=True, # 默认False,
)
return alipay def cal_coupon_price(self, price, coupon_record_obj):
coupon_type = coupon_record_obj.coupon.coupon_type
money_equivalent_value = coupon_record_obj.coupon.money_equivalent_value
off_percent = coupon_record_obj.coupon.off_percent
minimum_consume = coupon_record_obj.coupon.minimum_consume
rebate_price = 0
if coupon_type == 0: # 立减券
rebate_price = price - money_equivalent_value
if rebate_price <= 0:
rebate_price = 0
elif coupon_type == 1: # 满减券
if minimum_consume > price:
raise CommonException(1007, "优惠券未达到最低消费")
else:
rebate_price = price - money_equivalent_value
elif coupon_type == 2:
rebate_price = price * off_percent / 100 return rebate_price def post(self, request):
print(request.data)
response = BaseResponse()
# 1.获取数据 user_id = request.user.pk
global_coupon_id = request.data.get("global_coupon_id")
pay_money = request.data.get("pay_money")
course_list = request.data.get("course_list")
is_beli = request.data.get("is_beli")
now = datetime.datetime.now() try:
# 2 校验数据
# 2.2 校验课程 course_price_list = []
for course_dict in course_list:
# 2.2.1 校验课程id
course_id = course_dict.get("course_id")
course_obj = Course.objects.get(pk=course_id)
# 2.2.2 价格策略id
if course_dict.get("default_price_policy_id") not in [obj.pk for obj in course_obj.price_policy.all()]:
raise CommonException(1002, "价格策略异常")
# 2.2.3 课程优惠券id
price_policy_obj = PricePolicy.objects.get(pk=course_dict.get("default_price_policy_id"))
course_dict["original_price"] = price_policy_obj.price
course_dict["valid_period_display"] = price_policy_obj.get_valid_period_display()
course_dict["valid_period"] = price_policy_obj.valid_period
coupon_record_id = course_dict.get("coupon_record_id")
if coupon_record_id:
coupon_record_list = CouponRecord.objects.filter(account=request.user,
status=0,
coupon__valid_begin_date__lte=now,
coupon__valid_end_date__gte=now,
coupon__content_type_id=9,
coupon__object_id=course_id
)
print("coupon_record_id", coupon_record_id)
print([obj.pk for obj in coupon_record_list])
# 默认获取没有选择的优惠券和筛选后优劵
if coupon_record_id not in [obj.pk for obj in coupon_record_list]:
raise CommonException(1006, "课程优惠劵异常")
# 计算循环课程的课程优惠券优惠后的价格
coupon_record_obj = CouponRecord.objects.get(pk=coupon_record_id)
rebate_price = self.cal_coupon_price(price_policy_obj.price, coupon_record_obj)
course_price_list.append(rebate_price)
course_dict["rebate_price"] = rebate_price
else:
course_price_list.append(price_policy_obj.price) # 2.3 校验通用优惠券id
global_coupon_record_list = CouponRecord.objects.filter(account=request.user,
status=0,
coupon__valid_begin_date__lte=now,
coupon__valid_end_date__gte=now,
coupon__content_type_id=9,
coupon__object_id=None
)
print("global_coupon_record_list", global_coupon_record_list) if global_coupon_id:
if global_coupon_id not in [obj.pk for obj in global_coupon_record_list]:
raise CommonException("通用优惠券异常", 1006)
global_coupon_record_obj = CouponRecord.objects.get(pk=global_coupon_id)
final_price = self.cal_coupon_price(sum(course_price_list), global_coupon_record_obj)
else:
final_price = sum(course_price_list)
# 2.4 计算实际支付价格与money 校验
if is_beli:
final_price = final_price - request.user.beli / 10
if final_price < 0:
final_price = 0
print(final_price) if final_price != float(pay_money):
raise CommonException("支付总价格异常!", 1008) # 4.调用alipay 接口
alipay = self.get_alipay()
query_params = alipay.direct_pay(
subject="路飞学成",
out_trade_no="x345" + str(datetime.datetime.now()),
total_amount=pay_money,
)
pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)
response.data = {
"url": pay_url
} except ObjectDoesNotExist as e:
response.code = 1001
response.msg = "课程不存在!"
except CommonException as e:
response.code = e.code
response.msg = e.msg
# except Exception as e:
# response.code = 500
# response.msg = str(e) return Response(response.dict)
pay
lf 前后端分离 (6) 支付的更多相关文章
- lf 前后端分离 (2) 课程数据获取,Serializer的返回
一.关于课程数据的返回 在进行前后端分离时,会通过def 进行前后端传值, 本质上遵循rest 网址规范 增删改查查 get,post,put,del get(\d+) 1.在从数据库获取数据后,进 ...
- lf 前后端分离 (1) auth,token认证
一.关于登录验证 用户在登录的时候会通过验证以及滑动解锁,注意的是需要后端if verify(request.data): 来判断是否发送了那三个验证数据 通过 random_str=str(uuid ...
- lf 前后端分离 (5) 优惠券
关于优惠券 优惠券主要通过前端传回来的course_id_list 创建数据结构 首先清空操作,将所有的优惠券清空, 并将所有优惠劵放到redis中的过程 import datetime import ...
- lf 前后端分离 (4) 价格策略
一.价格策略 价格策略就是通过前端发送要购买的课程以及价格策略来找出表关联的字段返回客户端 通过contenttype 属性 找到课程所有的价格策略 for prcie_policy in cours ...
- lf 前后端分离 (3) 中间建跨域
一.关于中间建跨域 为了减少跨域代码冗余,采用中间件 from django.utils.deprecation import MiddlewareMixin class CorsMiddleware ...
- 一行代码实现Vue微信支付,无需引用wexin-sdk库,前后端分离HTML微信支付,无需引用任何库
前后端分离项目实现微信支付的流程: 1:用户点击支付 2:请求服务端获取支付参数 3:客户端通过JS调起微信支付(微信打开的网页) * 本文主要解决的是第3步,视为前两步已经完成,能正确拿到支付参数, ...
- Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...
- springboot 前后端分离开发 从零到整(一、环境的搭建)
第一次写文章,有什么错误地方请大家指正,也请大家见谅. 这次为大家分享我做毕业设计的一个过程,之前没有接触过springboot,一直做的都是Javaweb和前端,做了几个前后端分离的项目.现在听说s ...
- 巨蟒python全栈开发flask8 MongoDB回顾 前后端分离之H5&pycharm&夜神
1.MongoDB回顾 .启动 mongod - 改变data/db位置: --dbpath D:\data\db mongod --install 安装windows系统服务 mongod --re ...
随机推荐
- 剑指Offer-14.链表中倒数第k个结点(C++/Java)
题目: 输入一个链表,输出该链表中倒数第k个结点. 分析: 第一个解法,我们可以先遍历一遍链表,计算下节点的总数n,然后再从头结点查n-k个节点,即是倒数第k个节点. 第二个解法,便是使用双指针,两个 ...
- luoguP4588 [TJOI2018]数学计算
题意 考虑一个操作会对一段时间内的询问产生影响,于是将线段树上的这段时间打上乘这个数的标记,最后dfs整颗线段树. code: #include<bits/stdc++.h> using ...
- 学习:反调试之IsDebuggerPresent
前言:一个反调试IsDebuggerPresent的CreackMe IsDebuggerPresent函数的了解: IsDebuggerPresent 作用 确定调用进程是否由用户模式的调试器调试. ...
- 介绍一个比较强大的网页剪藏工具——web-clipper
网址:https://clipper.website/ 在语雀的第三方工具处遇到的. 感觉可以代替印象笔记网页端的剪藏,还是很强大的.
- JavaScript计算日期前一天和后一天
1.页面排版 <button onclick="before()">上一天</button> <button onclick="after( ...
- JVM-基本操作
1.我们为什么要对jvm做优化?在本地开发环境中我们很少会遇到需要对jvm进行优化的需求,但是到了生产环境,我们可能将有下面的需求: 运行的应用“卡住了”,日志不输出,程序没有反应服务器的CPU负载突 ...
- BIM软件Revit的优点
BIM软件Revit的优点 那么多人喜欢使用这个软件的是因为BIM软件Revit极其强大的集成性和平台性. BIM软件Revit的集成性 建筑是一个复杂数 ...
- LeetCode28——实现strStr()
6月中下旬辞职在家,7 月份无聊的度过了一个月.8 月份开始和朋友两个人写项目,一个后台和一个 APP ,APP 需要对接蓝牙打印机.APP 和蓝牙打印机都没有搞过,开始打算使用 MUI 开发 APP ...
- 什么是JavaBean?
什么是JavaBean? 首先明确的是JavaBean是一种Java类,而且是一种特殊的.可重用的类. 必须具有无参数的构造器,所有的属性都是private的,通过提供setter和getter方法来 ...
- 【MySQL】MMM和MHA高可用架构
用途 对MySQL主从复制集群的Master的健康监控. 当Master宕机后把写VIP迁移到新Master. 重新配置集群中的其他Slave从新Master同步 MMM架构 主服务器发生故障时, 1 ...