当前位置: 首页 > news >正文

支付宝支付接入流程

一、 接入准备

支付宝支付流程没有微信那么复杂,而且支付宝支持沙箱。登录支付宝开放平台控制台

在这里插入图片描述

点击开发工具中的沙箱

在这里插入图片描述
接口加密方式,我这里使用的是自定义密钥。生成密钥的方式

  1. 使用支付宝官方提供的密钥工具,唯一要注意的是支付宝密钥工具生成的是 txt 格式的,也就是不包含头部和尾部标识的
    -----BEGIN PUBLIC KEY----------END PUBLIC KEY-----
    
  2. 使用 openssl 命令自己生成。
    openssl
    OpenSSL> genrsa -out app_private_key.pem 2048  #  私钥
    OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem  #  导出公钥
    OpenSSL> exit
    

我们需要的东西基本都有了。调试的使用可以下载工具支付宝客户端沙箱版 ,用沙箱账号进行支付。

开发

import logging
from enum import Enumfrom Cryptodome.PublicKey import RSA
from alipay import AliPay, AliPayConfig"""
支付宝支付接入
SDK 文档:https://gitee.com/yqmc/alipay/blob/master/README.zh-hans.md
pip install python-alipay-sdk --upgrade
"""class AlipayType(Enum):WEB = 'web'  # 电脑网站支付WAP = 'wap'  # 手机网站支付APP = 'app'  # app支付MINI = 'mini'  # 小程序支付class AliPayClient:def __init__(self, appid, app_private_key_path, alipay_public_key_path, is_sandbox=False, default_notify_url=None,return_url=None):"""初始化数据:param appid: APP ID:param app_private_key_path: 应用私钥路径:param alipay_public_key_path: 支付宝公钥路经:param is_sandbox:  是否是沙箱模式:param default_notify_url:  默认通知地址"""self.appid = appidself.default_notify_url = default_notify_urlself.return_url = return_urlself.sandbox = is_sandboxself.alipay_gateway_url = 'https://openapi.alipay.com/gateway.do?' if not self.sandbox else 'https://openapi-sandbox.dl.alipaydev.com/gateway.do?'self.app_private_key_string = self.read_secret(app_private_key_path)self.alipay_public_key_string = self.read_secret(alipay_public_key_path)self.alipay = AliPay(appid=self.appid,app_notify_url=self.default_notify_url,app_private_key_string=self.app_private_key_string,alipay_public_key_string=self.alipay_public_key_string,sign_type="RSA2",debug=True,verbose=True,  # 输出调试数据config=AliPayConfig(timeout=15)  # 可选,请求超时时间)if self.sandbox:logging.debug('当前为沙箱环境')@staticmethoddef read_secret(secret_path, import_key=False):"""从文件加载秘钥:param secret_path::param import_key: 是否需要导入秘钥:return:"""with open(secret_path, "r") as fp:return RSA.importKey(fp.read()) if import_key else fp.read()def create_order(self, out_trade_no, amount, subject, notify_url=None, return_url=None,pay_type=AlipayType.WEB.value):"""创建支付订单:param out_trade_no: 订单号:param amount: 金额:param subject: 订单备注:param notify_url: 通知地址:param return_url: 回调地址:param pay_type: AlipayType支付类型:return: order_string"""trade_client = {AlipayType.WEB.value: self.alipay.api_alipay_trade_page_pay,AlipayType.WAP.value: self.alipay.api_alipay_trade_wap_pay,AlipayType.APP.value: self.alipay.api_alipay_trade_app_pay,AlipayType.MINI.value: self.alipay.api_alipay_trade_create}kwargs = dict(out_trade_no=out_trade_no,total_amount=amount,subject=subject,notify_url=notify_url)pay_type in [AlipayType.WEB.value, AlipayType.WAP.value] and kwargs.update(return_url=return_url)order_string = trade_client[pay_type](**kwargs)return self.alipay_gateway_url + order_stringdef create_pre_order(self, subject, out_trade_no, amount, notify_url=None):"""交易预创建(扫码支付):param subject: 订单备注:param out_trade_no: 订单号:param amount: 金额:param notify_url: 通知地址return {'code': '10000', 'msg': 'Success', 'out_trade_no': '2023102401', 'qr_code': 'https://qr.alipay.com/bax01636yklunuyxijpc002f'}"""resp = self.alipay.api_alipay_trade_precreate(subject=subject,out_trade_no=out_trade_no,total_amount=amount,notify_url=notify_url)return respdef refund(self, out_trade_no, refund_amount):result = self.alipay.api_alipay_trade_refund(out_trade_no=out_trade_no, refund_amount=refund_amount)return True if result.get("code") == "10000" else Falsedef notify_verify(self, data):"""验证回调通知:验证 alipay 的异步通知:param data:  来自支付宝回调 POST 给你的 data,字典格式。data = {"subject": "测试订单","gmt_payment": "2016-11-16 11:42:19","charset": "utf-8","seller_id": "xxxx","trade_status": "TRADE_SUCCESS","buyer_id": "xxxx","auth_app_id": "xxxx","buyer_pay_amount": "0.01","version": "1.0","gmt_create": "2016-11-16 11:42:18","trade_no": "xxxx","fund_bill_list": "[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]","app_id": "xxxx","notify_time": "2016-11-16 11:42:19","point_amount": "0.00","total_amount": "0.01","notify_type": "trade_status_sync","out_trade_no": "xxxx","buyer_logon_id": "xxxx","notify_id": "xxxx","seller_email": "xxxx","receipt_amount": "0.01","invoice_amount": "0.01","sign": "xxx"}"""signature = data.pop("sign")# verificationsuccess = self.alipay.verify(data, signature)return success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED")

相关文章:

支付宝支付接入流程

一、 接入准备 支付宝支付流程没有微信那么复杂,而且支付宝支持沙箱。登录支付宝开放平台控制台 点击开发工具中的沙箱 接口加密方式,我这里使用的是自定义密钥。生成密钥的方式 使用支付宝官方提供的密钥工具,唯一要注意的是支付宝密钥工具…...

管理员|顾问必看!8个Salesforce权限集的最佳实践

Salesforce中的权限一直始终是热门话题。权限集是简档的附加。它们通常具有相同的设置,用于增加用户的权限,使其超过简档提供的权限。可以将简档视为许多用户共有的基本权限集,而权限集是部分用户需要的额外权限。 本篇文章将介绍Salesforce…...

【linux进程(六)】环境变量再理解程序地址空间初认识

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 程序地址空间 1. 前言2. 在ba…...

10步开启SAFe敏捷发布列车

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 敏捷畅想一、培训 SAFe 项目顾问 (SPC)二、培训精益敏捷领导者三、 举办价值流研讨会并确定您的第一个敏捷发布系列四、 定义/设置 ART 和团队五、 担任重要角色六、…...

面试题之Vue和React的区别是什么?

一提到前端框架,相信大家都对Vue和React不陌生,这两个前端框架都是比较主流的,用户也都比较多,但是我们在使用这些框架的时候,是否对这两个框架之间的区别有所了解呢?接下来,让我们来一起的系统…...

Linux基础知识——概述和常用文件管理命令

Linux基础知识——概述和常用文件管理命令 文章目录 Linux基础知识——概述和常用文件管理命令概述常用的一些文件指令 概述 终端:一个terminal窗口就是以个屏幕, 远程连接了一个服务器, 每一个terminal可以连接到任何一个其他服务器上;关掉terminal相当于只是关掉…...

腾讯云创建了jenkins容器,但无法访问

1、首先,查看本机能不能ping通你的腾讯云服务器 如果ping的通那就下一步 2、查看腾讯云服务器的防火墙关了没,没关关掉、 firewall-cmd --state not running 3、那就在云服务器的控制台开放端口...

C语言的const函数修饰指针

文章目录 一、const函数的作用 int a 10; int *p ; p &a;从上面的代码分析,p 存放的就是a的地址, *p 存放的就是 a 的值。 一、const函数的作用 一旦使用了const函数修饰一个变量,那么这个变量就无法变化了。 所以下面三种情况&#…...

EasyExcel使用方式(包含导出图片)

1、导EasyExcel依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> </dependency> 2、创建导出excel的实体类 Getter Setter EqualsAndHashCode HeadStyle(fillF…...

redis学习(三)——java整合redis

Jedis Jedis可以用于java连接redis数据库 新建一个maven项目&#xff0c;导入Jedis依赖 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test…...

OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程

OpenText 安全取证软件&#xff0c;行业标准的数字调查解决方案&#xff0c;适用于各种规模和各种行业的组织 降低成本和复杂性 • 远程调查比轮流调查过程更有效 对结果持有信心 • 磁盘级可见性可以完成相关端点数据的搜索和收集 谨慎调查 • 完整的网络调查&#xf…...

【vue】vue前端、生产(线上)环境请求unicloud云服务空间axios报错

目录 原因总结&#xff1a;借助Nginx使得axios可跨域请求 原因 使用axios的时候&#xff0c;如果是开发环境下&#xff0c;WebStorm&#xff08;IDEA&#xff09;会自带跨域功能&#xff0c;说白了就是不用考虑跨域的事情了。但是在生产环境下&#xff0c;vue前端编译成静态文…...

JVM详解(InsCode AI 创作助手)

JVM是一个虚拟的计算机&#xff0c;它有自己的硬件架构&#xff0c;如处理器、堆栈和寄存器等&#xff0c;也有自己的指令系统。JVM的主要任务是负责加载、验证、编译和执行Java程序。 一、JVM参数默认配置如下 内存设置&#xff1a; 初始堆内存大小&#xff1a;物理内存的1/…...

华为c语言编程规范

提示&#xff1a;附件为编程规范 文章目录 前言一、华为c语言编程规范总结 前言 例如&#xff1a;华为规范下载 一、华为c语言编程规范 该处使用的url网络请求的数据。 总结 提示&#xff1a;这里对文章进行总结&#xff1a; 例如&#xff1a;以上就是今天要讲的内容&#xf…...

SQL Server Management Studio (SSMS)的安装教程

文章目录 SQL Server Management Studio (SSMS)的安装教程从Microsoft官网下载SQL Server Management Studio安装程序。选中安装程序右键并选择“以管理员的身份运行”选项选择安装目录&#xff0c;单击“安装”按钮开始安装过程安装成功界面安装完成后&#xff0c;您可以启动S…...

React 图片瀑布流

思路&#xff1a; 根据浏览器宽度&#xff0c;确定列数&#xff0c;请求的图片列表数据是列数的10倍&#xff0c;按列数取数据渲染 Index.js: import React from react import { connect } from react-redux import { withRouter } from react-router-dom import { SinglePag…...

C++数据结构X篇_21_插入排序(稳定的排序)

文章目录 1. 插入排序原理2. 算法图解3. 核心代码&#xff1a;4. 插入排序整体代码实现 1. 插入排序原理 插入排序是一种最简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相…...

【Unity】3D跑酷游戏

展示 finish_all * 方块跑酷 1.教程链接 翻墙&#xff1a;https://www.youtube.com/watch?v9ZEu_I-ido4&listPLPV2KyIb3jR53Jce9hP7G5xC4O9AgnOuL&index3 2.基础制作 最终成果 2.1 基本场景 1.创建Cube作为跑道 1&#xff09;记得把位置Reset&#xff1b; 2&#…...

bp前端验证码绕过及token绕过

前端验证码绕过及token绕过 原文参考&#xff1a;xiu 文章目录 前端验证码绕过及token绕过原文参考&#xff1a;[xiu](http://www.xiusafe.com/2023/10/25/%E9%AA%8C%E8%AF%81%E7%A0%81%E7%BB%95%E8%BF%87/)1 验证码爆破1. 登录Pikachu&#xff0c;先获取登录的api接口2 验证码…...

Jmeter(十四):跨线程组传递jmeter变量及cookie的处理详解

setUp线程组 setUp thread group 一种特殊类型的线程组&#xff0c;用于在执行常规线程组之前执行一些必要的操作。 在 setup线程组下提到的线程行为与普通线程组完全相同。不同的是执行顺序--- 它会在普通线程组执行之前被触发&#xff1b; 应用场景举例&#xff1a; A、测…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...