You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中Stripe Webhook配置及分账方案咨询与代码审核

针对Stripe分账与Django Webhook的问题解答

1. 分账方式正确性判断(基于标准流程)

由于未提供你的具体实现代码,先给出Stripe多用户分账的标准正确流程,你可以自行对比:

  • 前提:所有接收分账的用户必须拥有Stripe Connect账户(Standard/Express类型,Custom需额外配置)。
  • 付款阶段:创建PaymentIntent时,指定transfer_group参数(用于关联后续的转账操作),金额为买家支付的总金额。
  • 分账阶段:监听payment_intent.succeeded Webhook事件,确认付款成功后,为每个接收分账的用户创建单独的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 http 8000
    
    然后将ngrok生成的URL(如https://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等异步任务队列处理。

内容的提问来源于stack exchange,提问作者Tejinder Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:15:30