0

0

Python Django怎么接支付_支付宝及微信支付第三方后端非对称加密回调处理实战

P粉602998670

P粉602998670

发布时间:2026-03-17 04:43:33

|

300人浏览过

|

来源于php中文网

原创

支付宝验签须用verify_v2并传request.POST.dict()剔除sign/sign_type,公钥为PEM格式沙箱密钥;微信需按字典序拼接非sign字段含空值+key,解析XML为小写key字典;Django回调要@csrf_exempt、select_for_update锁行、幂等校验、异步耗时操作。

python django怎么接支付_支付宝及微信支付第三方后端非对称加密回调处理实战

支付宝回调验签失败:verify_v2 用错函数或没传对参数

支付宝官方 SDK 的 AlipayTradeService 类里,验签必须用 verify_v2,不是 verify(老版本)也不是 verify_and_return_data(不存在)。很多人卡在这一步,返回 False 却以为是密钥错了。

关键点在于:verify_v2 要求传入原始回调请求的 request.POST.dict()(Django 中),且必须剔除 signsign_type 字段;同时要确保传的是支付宝公钥(alipay_public_key),不是你自己的私钥。

  • request.POST.dict() 得先转成普通 dict,不能直接传 QueryDict
  • 手动 pop 掉 'sign''sign_type',否则验签必过不了
  • 公钥格式必须是 PEM,开头为 -----BEGIN PUBLIC KEY-----,且不能有换行符或空格混入(读文件时用 .replace('\n', '').replace(' ', '') 不安全,建议用 textwrap.dedent + strip
  • 如果用了沙箱环境,公钥必须是沙箱版的——生产环境密钥在沙箱回调里一定失败

微信支付回调验签报 invalid signature:没按规范拼接原始字符串

微信不提供现成验签函数,得自己算。错误几乎都出在「待签名字符串」拼接逻辑上:字段必须按字典序排序、只取 key != 'sign' 的项、值为空也得参与拼接、末尾加 &key=xxx——漏任一环节就 invalid signature

特别注意:微信回调 body 是 XML,但验签用的是解析后的 dict,不是原始 XML 字符串。Django 默认不会自动解析 XML POST body,得手动用 xml.etree.ElementTree 解析,再转成 dict(别用第三方库自动转,字段名大小写/下划线习惯容易错)。

立即学习Python免费学习笔记(深入)”;

  • 排序前先确保所有 key 都是小写(微信文档里字段如 appidmch_id 全小写,别写成 AppId
  • sign 字段必须排除,但其他空值字段(比如 attach 为空)仍要参与拼接
  • key 是你微信商户平台设置的 API 密钥,不是证书密码,也不是 APIv3 的 secret
  • 签名算法固定是 HMAC-SHA256,别用 MD5 或 RSA

Django 视图处理异步回调:不能用 @csrf_exempt 就完事

支付宝/微信回调是服务器直连,没有浏览器上下文,所以 @csrf_exempt 必须加,但这只是起点。更大的坑在并发和幂等性上——同一个通知可能重试多次,而 Django 视图默认不保证原子性。

Loomi
Loomi

全球首个AI社媒内容多智能体系统

下载

典型错误是:收到回调 → 查订单 → 更新状态 → 发货 → 返回 success。一旦中间步骤失败(比如库存扣减异常),下次重试就会重复发货。

  • 必须在更新数据库前,用 select_for_update() 锁住订单记录(需数据库支持事务)
  • 验签通过后,立刻查一遍该订单是否已处理成功(根据 out_trade_notransaction_id),已存在则直接返回 success
  • 不要在视图里调用耗时操作(如发邮件、调外部 API),改用 Celery 异步任务,但任务体里仍要加幂等判断
  • 微信回调要求 5 秒内响应,超时会反复推送;支付宝是 200ms 内,所以验签+DB 查询必须极快,索引要建在 out_trade_no

证书与密钥管理:别把 apiclient_cert.pem 直接丢进代码里

微信 APIv3 回调虽不用证书验签,但如果你用证书调用查询订单等接口,apiclient_cert.pemapiclient_key.pem 就必须安全加载。常见错误是路径硬编码、权限设成 777、或用 open().read() 读取后明文拼进请求头。

更隐蔽的问题是:Django 多进程下,证书内容被反复读取甚至缓存,导致 OpenSSL 报 SSL routines:ssl3_read_bytes:sslv3 alert bad certificate

  • 证书路径用 os.path.join(BASE_DIR, 'certs', 'apiclient_cert.pem'),别用相对路径
  • 读取后用 ssl.SSLContext.load_cert_chain() 加载,不要手动拼 cert + key 字符串
  • 密钥文件权限必须是 600,部署时用 Ansible 或 shell 脚本强制修正
  • 本地开发用沙箱密钥,生产环境密钥绝不能提交到 Git,走环境变量或 secrets 后端(如 HashiCorp Vault)

非对称加密本身不难,难的是每家支付平台对「原始数据」的定义、字段过滤规则、重试策略、时间窗口容忍度都不一样。一个字段排序错、一个换行符多、一次没锁行,就可能引发资损。做支付回调,本质是写分布式系统里的临界区代码,不是调个 SDK 那么简单。

相关文章

支付宝
支付宝

支付宝,全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付服务,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

169

2026.02.04

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

433

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

252

2023.10.07

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1950

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1176

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号