使用django-stripe的内置webhook支持

问题描述

我正在使用Django 3.0,dj-stripe 2.0和Stripe CLI。 dj-stripe为Stripe Webhooks提供了本机支持,其文档说在我的django项目的主urls.py文件包括以下内容,以公开webhook端点:

url(r"^stripe/",include("djstripe.urls",namespace="djstripe")),

我已经做到了,但是现在如何利用端点?

作为一个单独的实验,我创建了一个payments应用程序,设置了URL conf,并在通过Stripe CLI触发非dj-stripe webhook端点时成功调用了该视图。但是它不使用任何dj-stripe功能

# project urls.py

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/',admin.site.urls),path('stripe/',path('payments/',include("payments.urls",namespace="payments")),]
# payments/urls.py

from django.urls import path

from . import views

app_name="payments"

urlpatterns = [
    path("",views.my_handler,name="my-handler"),]
# payments/views.py

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_handler(request,**kwargs):
    print(request.body)
    return HttpResponse(status=200)

运行stripe listen --forward-to localhost:8000/payments/,然后在单独的窗口中,stripe trigger product.created返回一个200响应。

但是stripe listen --forward-to localhost:8000/stripe/webhook/stripe trigger product.created返回500

预先感谢您的帮助。

[更新]

我尚未修改认的DJSTRIPE_WEBHOOK_URLDJSTRIPE_WEBHOOK_VALIDATION设置。在settings.py中,我有

STRIPE_LIVE_PUBLIC_KEY = os.environ.get("STRIPE_LIVE_PUBLIC_KEY")
STRIPE_LIVE_SECRET_KEY = os.environ.get("STRIPE_LIVE_SECRET_KEY")
STRIPE_TEST_PUBLIC_KEY = os.environ.get("STRIPE_TEST_PUBLIC_KEY")
STRIPE_TEST_SECRET_KEY = os.environ.get("STRIPE_TEST_SECRET_KEY")
STRIPE_LIVE_MODE = os.environ.get("STRIPE_LIVE_MODE")
DJSTRIPE_WEBHOOK_SECRET = "*************************************"

测试键从env/bin/activate中拉出:

export STRIPE_LIVE_PUBLIC_KEY="pk_live_****...."
export STRIPE_LIVE_SECRET_KEY="sk_live_****...."
export STRIPE_TEST_PUBLIC_KEY="pk_test_****...."
export STRIPE_TEST_SECRET_KEY="sk_test_****...."
export STRIPE_LIVE_MODE="False"

当我运行stripe listen --forward-to localhost:8000/stripe/webhook/并触发stripe trigger customer.created时,出现以下500错误

stripe.error.InvalidRequestError: Request req_NTtzsTFS8uVdfL: No such customer; a similar object exists in test mode,but a live mode key was used to make this request.

但是我不知道我的按键如何混杂在一起,因为当我触发同一事件并通过/payments/端点进行侦听时,webhooks可以正常工作。

再次感谢您的时间。

解决方法

总而言之,您需要使用@webhooks.handler装饰器来装饰处理程序函数。

在dj-stripe文档的webhooks section中有一些示例。