如何在Python Django中集成Stripe或支付宝实现第三方支付对接?

夜芳君_8672

夜芳君_8672

2026-08-27

423人浏览

原创

不能直接在django视图里调用stripe或支付宝支付接口,因为前端需生成支付凭证(如client_secret或pay_order),而敏感操作必须由服务端完成且密钥绝不能暴露给浏览器;正确做法是后端生成一次性凭据供前端消费,密钥须从环境变量读取,webhook验证须使用原始body字节流并严格校验签名。

如何在python django中集成stripe或支付宝实现第三方支付对接?

为什么不能直接在Django视图里调用Stripe或支付宝的支付接口

因为前端需要生成支付凭证(如Stripe的client_secret或支付宝的pay_order),而这些敏感操作必须在服务端完成,但又不能把密钥暴露给浏览器。常见错误是把stripe.api_key或支付宝的app_private_key写在JS里,结果被爬虫一键提取——这等于把银行卡密码贴在玻璃门上。

正确做法是:Django后端只负责生成一次性支付凭据,前端用Stripe.js或alipay-sdk-js消费它。后端不处理跳转、不渲染支付页、不接收异步通知(那是Webhook的事)。

  • Stripe:用stripe.PaymentIntent.create()生成client_secret,返回给前端调用stripe.confirmCardPayment()
  • 支付宝:用alipay.api_alipay_trade_page_pay()生成跳转URL,或用alipay.api_alipay_trade_precreate()生成二维码(扫码支付场景)
  • 密钥必须从环境变量读取:os.getenv('STRIPE_SECRET_KEY'),绝不能硬编码

Django中处理Stripe Webhook时400错误的三个原因

Stripe Webhook endpoint返回400,90%不是代码逻辑错,而是签名验证失败。Django默认会解析request.body为JSON,但Stripe签名基于原始字节流,一旦被解析就破坏了哈希值。

  • 必须用request.body原始二进制数据做签名验证,不能先json.loads(request.body)
  • 确保STRIPE_WEBHOOK_SECRET和Stripe后台配置完全一致(注意末尾换行符)
  • View必须用@csrf_exempt,且Content-Type头必须是application/json(Stripe固定发送这个)

示例验证逻辑:

temporal-python-testing
temporal-python-testing

使用 pytest、时间跳转和模拟策略测试 Temporal 工作流。涵盖单元测试、集成测试、回放测试以及本地开发服务器。

下载
payload = request.body
sig_header = request.META.get('HTTP_STRIPE_SIGNATURE')
try:
    event = stripe.Webhook.construct_event(payload, sig_header, settings.STRIPE_WEBHOOK_SECRET)
except ValueError:
    return HttpResponse(status=400)
except stripe.error.SignatureVerificationError:
    return HttpResponse(status=400)

支付宝同步回调(return_url)和异步回调(notify_url)的区别与陷阱

支付宝文档里这两个URL都叫“回调”,但行为完全不同:return_url是用户付款后浏览器跳转回的地址,可能被用户手动刷新、F5重发;notify_url是支付宝服务器POST推送,只发一次,且要求200响应,否则持续重试。

  • return_url仅用于展示成功页,**不能更新订单状态**(用户关掉页面就丢失了)
  • notify_url才是唯一可信的支付结果来源,必须校验sign参数,且只处理trade_status为TRADE_SUCCESS或TRADE_FINISHED的请求
  • Django接收notify_url时要用request.POST.dict()而非request.POST,因为支付宝POST的是表单编码(application/x-www-form-urlencoded),不是JSON

本地调试Webhook最省事的方法

Stripe和支付宝都不允许localhost地址注册Webhook,但你不需要部署到公网就能测通。Stripe官方推荐用stripe-cli,支付宝可用ngrok,但更轻量的做法是临时改Django路由。

  • Stripe:运行stripe listen --forward-to http://localhost:8000/webhook/,它会把事件转发到你的本地URL,并自动注入签名头
  • 支付宝:用ngrok http 8000获取临时域名,填入沙箱后台;测试完立刻删掉,避免密钥泄露
  • 关键点:本地Webhook View开头加if settings.DEBUG:绕过部分签名校验(仅限开发),但正式环境必须严格校验

别信“用Postman模拟Webhook请求”这种说法——少了原始body、少了正确header、少了时间戳防重放,模拟了也白模拟。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26857

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习