Django中Stripe Webhook配置及分账方案咨询与代码审核
针对Stripe分账与Django Webhook的问题解答
1. 分账方式正确性判断(基于标准流程)
由于未提供你的具体实现代码,先给出Stripe多用户分账的标准正确流程,你可以自行对比:
- 前提:所有接收分账的用户必须拥有Stripe Connect账户(Standard/Express类型,Custom需额外配置)。
- 付款阶段:创建
PaymentIntent时,指定transfer_group参数(用于关联后续的转账操作),金额为买家支付的总金额。 - 分账阶段:监听
payment_intent.succeededWebhook事件,确认付款成功后,为每个接收分账的用户创建单独的Transfer对象,将对应金额从你的平台Stripe账户转账到用户的Connect账户。 - 注意事项:
- 若需自动扣除平台手续费,可在创建
Transfer时计算扣除后的金额。 - 确保分账总额不超过付款金额(扣除Stripe手续费后的净额)。
- 避免同步执行分账操作,必须通过Webhook异步处理,防止付款状态不一致导致错误。
- 若需自动扣除平台手续费,可在创建
2. Django中运行Stripe Webhook的步骤
- 安装依赖:
pip install stripe - 配置Stripe密钥:在
settings.py中添加:STRIPE_SECRET_KEY = "你的Stripe秘钥" STRIPE_WEBHOOK_SECRET = "你的Webhook签名秘钥(从Stripe控制台获取)" - 创建Webhook视图:编写视图处理POST请求,核心是验证Stripe签名,防止伪造请求:
from django.http import HttpResponse, HttpResponseBadRequest from django.views.decorators.csrf import csrf_exempt import stripe from django.conf import settings stripe.api_key = settings.STRIPE_SECRET_KEY @csrf_exempt def stripe_webhook(request): payload = request.body sig_header = request.META.get('HTTP_STRIPE_SIGNATURE') event = None try: event = stripe.Webhook.construct_event( payload, sig_header, settings.STRIPE_WEBHOOK_SECRET ) except ValueError as e: # 无效请求体 return HttpResponseBadRequest() except stripe.error.SignatureVerificationError as e: # 签名验证失败 return HttpResponseBadRequest() # 处理具体事件 if event['type'] == 'payment_intent.succeeded': payment_intent = event['data']['object'] # 这里添加你的分账逻辑 elif event['type'] == 'transfer.created': # 处理转账成功的后续逻辑 pass return HttpResponse(status=200) - 配置URL路由:在项目的
urls.py中添加:from django.urls import path from .views import stripe_webhook urlpatterns = [ # 其他路由 path('stripe-webhook/', stripe_webhook, name='stripe_webhook'), ] - 开发环境测试:使用ngrok暴露本地端口,比如:
然后将ngrok生成的URL(如ngrok http 8000https://xxxx.ngrok.io/stripe-webhook/)添加到Stripe控制台的Webhook端点中,选择需要监听的事件(如payment_intent.succeeded)。
3. 代码审核与Webhook正确配置
- 代码审核:你未提供
AuctionPayment视图和PaymentsWebhook代码,无法直接审核。请补充代码后,重点检查以下几点:AuctionPayment视图中是否正确创建PaymentIntent并设置transfer_group。- 是否在付款成功后通过Webhook异步执行分账,而非同步处理。
- Webhook视图是否严格验证Stripe签名,未跳过签名检查。
- 分账逻辑中是否处理了金额计算错误、Connect账户不存在等异常情况。
- Webhook正确配置要点:
- 必须禁用CSRF保护(因为Stripe的请求无法携带Django的CSRF令牌),使用
@csrf_exempt装饰器。 - 签名验证是强制步骤,绝不允许省略,否则会有安全风险。
- 生产环境中,确保Webhook端点使用HTTPS协议(Stripe仅向HTTPS地址发送事件)。
- 处理事件时,要保证幂等性:同一事件可能被Stripe重复发送,需通过
event.id判断是否已处理过该事件。 - 不要在Webhook视图中执行耗时操作,可将任务放入Celery等异步任务队列处理。
- 必须禁用CSRF保护(因为Stripe的请求无法携带Django的CSRF令牌),使用
内容的提问来源于stack exchange,提问作者Tejinder Singh
相关产品推荐
相关产品推荐

