Stripe:未找到与使用 Django 的有效负载的预期签名匹配的签名

Fig*_*ode 5 python django stripe-payments

当 Stripe 调用定义的 Web 挂钩时,我收到以下错误

未找到与有效负载的预期签名匹配的签名

我正在关注这篇文章:https://stripe.com/docs/billing/subscriptions/checkout#provision-and-monitor

我有以下代码:

@csrf_exempt
def saaswebhookview(request):
    try:
        stripe.api_key = settings.STRIPE_SECRET_KEY
        webhook_secret = 'stripe_key'
        request_data = request.POST
        if webhook_secret:
            try:
                signature = request.headers.get('stripe-signature')
                # signature = request.META['stripe-signature']
                event = stripe.Webhook.construct_event(
                    payload=request.POST, sig_header=signature, secret=webhook_secret)
                data = event['data']
            except Exception as e:
                print(str(e))
                return JsonResponse({'status': 'error', 'error': str(e)})
            event_type = event['type']
        else:
            data = request_data['data']
            event_type = request_data['type']
        data_object = data['object']
        if event_type == 'checkout.session.completed':
            print(data)
        elif event_type == 'invoice.paid':
            print(data)
        elif event_type == 'invoice.payment_failed':
            print(data)
        else:
            print('Unhandled event type {}'.format(event_type))
        return JsonResponse({'status': 'success'}, safe=False)
    except Exception as e:
        return JsonResponse({'status': 'success', 'error': str(e)}, safe=False)
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,这给我带来了错误,不知道为什么?

Jus*_*ael 16

Stripe 库需要 Webhook 请求的原始正文才能进行签名验证。看来你正在供应request.POST,这是正文的修改版本。

如果您使用request.body它,它应该按预期工作。


小智 5

就我而言,为了解决我的问题,我解码了主体:

payload = request.body.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)