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 ...
随机推荐
- imutils.path
from imutils import paths # 要在哪条路径下查找 path = '...' # 查找图片,得到图片路径 imagePaths = list(imutils.paths.lis ...
- NOIP2018普及组复赛游记
2018年11月10日,NOIP2018普及组复赛. 这是我初中阶段最后一次复赛了. 和往常一样,我们在预定的早上7点,没有出发. 10分钟之后,人终于到齐了,于是出发了,一路无话. 到了南航,合照三 ...
- 2019 SDN上机第二次作业
2019 SDN上机第二次作业 1.利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 1. ...
- [译][ABP vNext]ABP CLI,v0.18版本的新模板和其他功能
ABP CLI,v0.18版本的新模板和其他功能 ABP v0.18已发布, 包含解决的70+个issue,500+次提交 网站更改 abp.io网站完全更新以突出ABP框架的目标和重要功能.文档和博 ...
- 剑指offer:二叉树打印成多行(层次遍历)
1. 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2. 思路 层次遍历 3. 递归 public class Solution { ArrayList<Array ...
- kubelet证书过期解决方法
昨天收到报警短信:集群中某node状态为notReady,由于是长期不用的,所以放到今天才有空处理,以下记录处理过程. 查看kubelet日志,发现不停的打印证书过期相关提示信息. 以下操作基于kub ...
- Kubernetes 遇到的问题
Kubernetes 遇到的问题 k8s 版本 k8s v1.13.5 docker 18.09.2 问题一 kubelet 报错 May 22 10:14:42 test-ops-k8s-03 ku ...
- 下载代码的时候 SSH与http的区别
SSH: git@gitlab.alibaba-inc.com:damai-mz/mz-market.git HTTP:http://gitlab.alibaba-inc.com/damai-mz/m ...
- Identity Server4资料
https://www.cnblogs.com/cgzl/p/9405796.html https://www.cnblogs.com/cgzl/p/7780559.html https://clou ...
- D3力布图绘制--节点间的多条关系连接线的方法(转)
在项目中遇到这样的场景,在使用D3.js绘制力布图的过程中,需要在2个节点间绘制多条连接线,找到一个不错的算法,在此分享下. 效果图: HTML中要连接 <!DOCTYPE html> & ...