【问题标题】:Using django-stripe's built-in webhook support使用 django-stripe 的内置 webhook 支持
【发布时间】:2021-02-04 20:45:52
【问题描述】:

我正在使用 Django 3.0、dj-stripe 2.0 和 Stripe CLI。 dj-stripe 为 Stripe webhook 提供原生支持,他们的文档说在我的 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/', include("djstripe.urls", namespace="djstripe")),
    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/ 端点进行侦听时,webhook 工作正常。

再次感谢您的宝贵时间。

【问题讨论】:

    标签: python django webhooks stripe-payments


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,巴勃罗。按照文档,我导入了装饰器并将其应用于我的处理程序函数,但我得到了 403,因为它正在寻找 csrf_token。添加 csrf_exempt 装饰器使其再次工作,但我怎么知道 webhbooks.handler 正在实现呢?
    • 此外,即使我触发的 webhook 是针对不同对象的,也会调用处理程序。即使装饰器指定了“客户”,当我运行 stripe trigger product.created 时它仍然会被调用,这让我认为装饰器没有任何效果。
    • 您是使用DJSTRIPE_WEBHOOK_URLDJSTRIPE_WEBHOOK_VALIDATION 的默认值还是修改了它们?你不需要 csrf_exempt 因为ProcessWebhookView 视图已经为你做了。此外,stripe listen --forward-to localhost:8000/stripe/webhook/ 是您必须运行的正确条带命令。
    • 我没有修改这些默认值,没有。我在原始问题中添加了更多信息来解释现在发生了什么。再次感谢您的宝贵时间,@Pablo Castellano。
    • @NathanMagyar 你碰巧也设置了STRIPE_SECRET_KEY 吗?
    猜你喜欢
    • 2020-09-08
    • 2013-04-14
    • 2013-08-13
    • 2016-05-04
    • 2019-03-07
    • 2012-03-11
    • 2015-04-18
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多