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 ...
随机推荐
- python3.5.3rc1学习二
#if else示例x = 5y = 8 if x > y: print("x is greater than y")else: print("x is not g ...
- Educational Codeforces Round 63 (Rated for Div. 2) D dp(最大连续子序列)
https://codeforces.com/contest/1155/problem/D 题意 一个n个数的数组\(a[i]\),可以选择连续的一段乘x,求最大连续子序列的值 题解 错误思路:贪心, ...
- ORB-SLAM2 地图保存
一.简介 在ORB-SLAM2的System.h文件中,有这样一句话:// TODO: Save/Load functions,让读者自己实现地图的保存与加载功能.其实在应用过程中很多场合同样需要先保 ...
- strace监视系统调用
strace可用于监视系统调用,如果在使用的系统调用中有不合适的,可以认为其行为的不恰当 命令为strace /dev/null. strace命令相当于是从内核直接接收数据,可以使用-p 9999来 ...
- java4wifidog_server_README
项目地址:https://github.com/C-hill/java4wifidog_server 开发环境:Windows JDK7 Tomcat6 Myeclipse8.5 MySQL5 ...
- JS中的undefined,null,"",0,'0'和false
){ console.log(); } '){ console.log() } '){ console.log() } if(false==0.0){ console.log() } if(false ...
- sessionStorage 、localStorage 、 cookie 和session之间的区别
四者的异同 特性 Session Cookie localStorage sessionStorage 数据的生命期 在一定时间内保存在服务器上.当访问增多,会比较占用你服务器的性能,考虑到减 ...
- GC(二)CMS
什么是CMS CMS全称 Concurrent Mark Sweep,是一款并发的.使用标记-清除算法的垃圾回收器, 使用场景 GC过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间的停顿. ...
- 循环队列c++代码
#include <ros/ros.h> #include <string> #include <stdlib.h> #include <iostream&g ...
- sqlplus简单使用
登录 C:\Users\inmeditation>sqlplus 请输入用户名: scott 输入口令: 查看当前行长 SQL> show linesize; linesize 80 查看 ...