DRF实操——支付宝的介绍与对接支付宝

DRF实操——支付宝的介绍与对接支付宝

  • 1. 支付宝的介绍
    • 实际上线环境:
    • 开发环境:
  • 2. DRF对接支付宝
    • 1. 创建配置文件
    • 2. 在setting文件中,做支付宝配置
    • 3. 安装支付宝第三方库
    • 4. 在setting文件中实例化支付宝对象
    • 5.创建模型,保存订单的支付交易号

1. 支付宝的介绍

实际上线环境:

  1. 在浏览器搜索“支付宝开放平台”,扫码登录。

在这里插入图片描述
2. 进入控制台
在这里插入图片描述
3. 网页移动应用——创建网页移动应用
在这里插入图片描述
4. 填写信息,会生成这个应用的appid,会绑定真实的账户,进行对接。
在这里插入图片描述

开发环境:

我们在开发过程中使用的是沙箱环境,进行调试和开发。
应用appid,商家信息,用户信息,都是模拟的

  1. 在控制台中找到“沙箱”
    在这里插入图片描述

  2. 沙箱中有一个appid,上线之后,直接改成在实际生成的ID即可
    在这里插入图片描述

  3. 沙箱应用——开发信息——接口加签方式——自定义秘钥——公钥模式,点击启用——支付宝秘钥生成器——秘钥工具下载
    在这里插入图片描述

  4. 打开下载的秘钥工具,点击生成秘钥

在这里插入图片描述
在这里插入图片描述
5. 新建两个记事本txt文件,分别保存生成的应用公钥应用私钥

  1. 将应用公钥填写到加签管理这个页面(即第3步的页面),点击保存显示加签完成,这时候会生成一个支付宝公钥
    在这里插入图片描述

2. DRF对接支付宝

1. 创建配置文件

这里要用公钥进行加密,用私钥进行解密。配置错误会导致无法核销。

  1. 在config文件夹下创建一个名为alipay_key的文件夹
    在这里插入图片描述
  2. 在该文件夹下创建一个alipay_public的文件用来存放支付宝公钥。开头要加上-----BEGIN PUBLKIKC KEY-----,结尾要加上-----END PUBLKIKC KEY-----
    在这里插入图片描述
  3. 再创建一个app_private_key的文件用来存放应用私钥。开头要加上-----BEGIN RSA PRIVATE KEY-----,结尾要加上-----END RSA PRIVATE KEY-----
    在这里插入图片描述
  4. 创建一个appid的文件,将沙箱环境中的appid复制过来
    在这里插入图片描述

2. 在setting文件中,做支付宝配置

#支付宝配置
APPID = open(f'{BASE_DIR}/config/alipay_key/appid').read()
APP_PRIVATE_KEY_STRING = open(f'{BASE_DIR}/config/alipay_key/app_private_key').read()
ALIPAY_PUBLIC_KEY_STRING = open(f'{BASE_DIR}/config/alipay_key/alipay_public').read()

在这里插入图片描述

3. 安装支付宝第三方库

pip install python-alipay-sdk -i https://pypi.douban.com/simple

在这里插入图片描述

4. 在setting文件中实例化支付宝对象

# 实例化支付宝对象
alipay = AliPay(appid=APPID,app_notify_url =None,app_private_key_string=APP_PRIVATE_KEY_STRING,alipay_public_key_string=ALIPAY_PUBLIC_KEY_STRING,sign_type='RSA2',# 如果是沙箱环境,要将debug设置为Truedebug=True
)

在这里插入图片描述

5.创建模型,保存订单的支付交易号

  1. 创建一个支付信息模型
class Payment(DateTimeModelMixin):trade_id = models.CharField(max_length=100,unique=True,verbose_name='支付宝交易号')order  = models.ForeignKey(Order,on_delete=models.CASCADE,verbose_name='订单')class Meta:ordering=['-create_time']db_table = 'payment'verbose_name = '支付信息'verbose_name_plural = verbose_name
  1. 创建序列化器
class PaymentSerializer(ModelSerializer):class Meta:model = Paymentfields = '__all__'
  1. 创建视图,并实现支付接口。
    路由记得自己配置。
class OrderCartViewSet(ReadOnlyModelViewSet,CreateModelMixin):serializer_class = OrderCartSerializerpermission_classes = [IsAuthenticated]# 返回当前登录用户的数据def get_queryset(self):# 使用管理器:源模型类小写_setreturn self.request.user.order_set.all()@action(methods=['put'],detail=False)def status(self,request):"""支付成功后将订单状态从待支付改为待发货"""# 得到支付宝回调过来的数据,在请求地址里卖弄query_dict = request.query_params #得到地址栏的参数 比如:https://www.baidu.com?sign=xxxdata = query_dict.dict()# 不能无脑直接修改订单状态,核实身份try:#类似于token# pop 方法会从字典中删除指定的键(在这里是 'sign')# 如果键存在,它会返回该键的值;如果键不存在,则会引发 KeyErrorsign = data.pop('sign') #删除data里面的signexcept KeyError:return Response(status=HTTP_400_BAD_REQUEST)# 验证sign。data的其他数据加密后会得到sign,这里把data传入alipay进行加密在跟sign进行比对校验res = alipay.verify(data,sign)if not res:return Response(status=HTTP_403_FORBIDDEN)#得到订单编号,支付宝交易号order_id = data.get('out_trade_no') #订单编号 out_trade_no固定参数trade_no = data.get('trade_no' ) #支付宝交易号 trade_no固定参数# 保存支付信息,修改订单状态# 这两个动作要一起完成,所以加入事务with transaction.atomic():save_point = transaction.savepoint()try:Payment.objects.create(order_id=order_id,trade_id=trade_no)Order.objects.filter(order_id=order_id,status=1).update(status=2)except Exception as e:transaction.savepoint_rollback(save_point)raise serializers.ValidationError(e)else:transaction.savepoint_commit(save_point)return Response({'order_id':order_id,'trade_id':trade_no})class PaymentViewSet(ReadOnlyModelViewSet):queryset = Payment.objects.all()serializer_class = PaymentSerializerpermission_classes = [IsAuthenticated]@action(methods=['get'],detail=True)def pay(self,request,pk):"""返回支付页面"""#获取订单信息,必须是当前登录的用户的订单,并且是没有支付的try:order = Order.objects.get(order_id=pk,user=request.user,status=1)except Order.DoesNotExist:return Response(status=HTTP_404_NOT_FOUND)# 对接支付宝,返回支付页面# 通过支付宝对象处理订单信息order_string = alipay.api_alipay_trade_page_pay(out_trade_no=order.order_id, #订单号传过去total_amount = str(order.total_amount), #要支付的金额subject=f'PROMOTE系统{order.order_id}',#标题# 这里可以配置到配置文件中去,前端更新,方便我们同步更新return_url='http://localhost:8080/home/order/success', #回调地址,成功后就跳转到前端的支付成功的页面)# 将订单信息发送给支付宝#即沙箱环境中的支付宝网关地址pay_url = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do?' + order_string# 返回支付页面,前端拿到这个地址后发起请求,就会跳转到支付宝的支付页面return Response({'pay_url':pay_url})
  1. 点击支付后,页面会跳转到支付宝的支付页面
    在这里插入图片描述
  2. 在支付宝开放平台找到买家账号密码进行登录
    在这里插入图片描述
  3. 支付成功后会根据回调地址跳转到我们前端的支付成功页面
    在这里插入图片描述
  4. 在加载这个页面时,前端就会拿到这个页面中的订单参数,去访问OrderCartViewSet中的status接口,修改订单状态为待发货。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551583.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【以图搜图代码实现2】--faiss工具实现犬类以图搜图

第一篇:【以图搜图代码实现】–犬类以图搜图示例 使用保存成h5文件,使用向量积来度量相似性,实现了以图搜图,说明了可以优化的点。 第二篇:【使用resnet18训练自己的数据集】 准对模型问题进行了优化,取得了…

【完-网络安全】Windows用户

文章目录 内置账号用户组通过命令行管理用户 内置账号 通过注销切换用户账号 Administrator用户 该帐号为系统默认的管理员帐号,该帐户具有Windows的最高管理权限,默认禁用。 Guest用户,来宾账户 可运行部分抵权限程序,查看部分文…

【STM32单片机_(HAL库)】4-0【定时器TIM】定时器中断配置步骤

定时器工作原理 定时器计数模式 定时器溢出时间计算 定时器中断实验配置步骤 msp 函数是对 MCU 相关的硬件进行初始化设置,通常被设计用于处理特定硬件外设或功能的底层初始化工作。

redis的数据结构,内存处理,缓存问题

redisObject redis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象: 这就redis的头信息,占有16个字节 redis中有两个热门数据结构 1.SkipList,跳表,首先是链表,和普通链表有以下差异&am…

前端工程规范-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具,它们结合起来可以提供以下作用和优势: 代码格式化和风格统一: Prettier 是一个代码格式化工具,能够自动化地处理代码的缩进、空格、换行等格式问题,…

【STM32单片机_(HAL库)】4-2【定时器TIM】定时器输出PWM配置步骤

PWM介绍 PWM波形(Pulse Width Modulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。 频率 1/Ts 占空比 Ton / Ts 分辨率 占空比变化步距 定时器输出PWM配置

2024年十大热门人力资源管理系统对比与推荐

本文介绍了ZohoPeople、金蝶云、用友、北森等10款热门HRMS系统,包括各自特点如ZohoPeople的全球化管理、北森的全面人才管理等。建议企业先试用再决定购买,以找到最适合的系统。 一、Zoho People Zoho People 是一个基于云的全球化人力资源管理系统 (HR…

啤酒在文学中的浪漫形象:精酿啤酒的诗意之旅

在文学的浩瀚星空中,啤酒并非仅仅是醉人的琼浆,它更是一种情感的载体,一种浪漫的符号。尤其是当提及Fendi Club精酿啤酒时,我们仿佛能闻到那从古老酒窖中飘出的馥郁香气,感受到它在文字间流淌的诗意与温情。 一、啤酒…

鸿蒙开发(NEXT/API 12)【请求用户授权】手机侧应用开发

为保护用户隐私,Wear Engine的API需要用户授权才可以正常访问。建议开发者在用户首次调用Wear Engine开放能力的时候执行本章节操作。 申请用户穿戴设备权限 应用拉起华为账号登录和授权界面,由用户授权相应的数据访问权限。用户可以自主选择授权的数据…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素&#xff0…

【含文档】基于Springboot+Vue的公园管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

前端css样式设置元素的绝对定位和相对定位,要注意宽度和高度的设置

vue3子div position absolute,父div positon relative 。如果不设置子div的 width 和height,那么子div中如果数据变长,子div相对父div位置会变化。子div数据超过&#xff0c;显示... 如何实现 <template><div class"parent"><div class"child&q…

开源实战分享 | 新书:《大型语言模型实战手册》随书代码分享

《大型语言模型实战手册》(英文版)目前电子版在亚马逊有售&#xff0c;纸质版预计在2024年10月15日开售。该书通过超过275张定制插图&#xff0c;深入探索大型语言模型的世界&#xff0c;为Python开发者提供使用大型语言模型所需的实用工具和概念。 如果对于插图没有特别执念的…

商务英语口语柯桥外语学习|ass是“屁股”,save是“救”,那 save my ass是什么意思?

有些人活着&#xff0c;屁股却已经“死”了 工作工作&#xff0c;上工就“坐”&#xff0c;“久坐”几乎是无法避免的事情&#xff0c;但你知道吗&#xff0c;长期久坐可能会患上死臀综合症&#xff08;Dormant Butt Syndrome&#xff09;&#xff01; 如果你坐久了就觉得屁股痛…

PCL库简单的icp配准

#include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/registration/icp.h>int main(int argc, char** argv) {// 确保提供了两个PCD文件作为输入if (argc ! 3) {PCL_ERROR("请提供两个PCD文件作为输入。\n");return (-1);}// …

Spring系列 BeanPostProcessor

文章目录 BeanPostProcessor注册时机执行时机 InstantiationAwareBeanPostProcessorSmartInstantiationAwareBeanPostProcessor 本文源码基于spring-beans-5.3.31 参考&#xff1a;https://docs.spring.io/spring-framework/reference/core/beans/factory-extension.html#beans…

C#实战|人员管理系统[1]:项目主体框架如何搭建

哈喽,你好啊,我是雷工! 有人的地方就有江湖,有江湖的地方就得用人员管理系统,今天开始练习实现一个人员管理系统。 以下为练习笔记。 01 UI层 这里使用的版本是:VS2022 创建一个Windows窗体应用程序,命名为:PeopleManger 可以添加一个通用类文件夹,集中放置通用的一些…

mybatis-plus ==> 入门教程

文章目录 为什么要学呢&#xff1f;注意事项 简单入门案例配置日志雪花算法更改 ID 的方法 CRUD插入&#xff08;不解释了&#xff0c;代码非常简单&#xff09;更新查询&#xff08;批量查询&#xff09;按条件查询分页查询删除&#xff08;批量、通过条件、逻辑删除&#xff…

AutoSar 通信服务架构,CAN通信诊断详解

文章目录 Com&#xff08;通信服务模块&#xff09;PDU的定义和结构PDU的分类IPDU Mux 模块PDU R 模块&#xff08;路由&#xff09;Bus TP 模块BUS InterfaceCanIf模块LinIf模块 发送数据示例&#xff08;CAN报文&#xff09;接收数据示例&#xff08;CAN报文&#xff09;通信…

基于SpringBoot的休闲娱乐代理售票系统设计与实现

1.1研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统&#xff0c;由从今传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是理所当然的。那么开发休闲娱乐代理售票…