Django / Stripe - Webhook не найден

Я пытаюсь установить веб-хук с stripe. (первый раз)

Однако, похоже, путь к вебхуку не найден.

В надежде, что кто-нибудь сможет принести пару свежих глаз и сказать мне, что я делаю не так.

В моем urls.py (уровень проекта)

urlpatterns = [

    path('my_app/', include('my_app.urls')),
    ...
]

В urls.py уровень приложения:

urlpatterns = [
    ..
    path('stripe_webhook/', views.stripe_webhook, name='stripe_webhook')
]

В моем файле views.py (уровень my_app):

@csrf_exempt
def stripe_webhook(request):
    print("enter webhook")
    stripe.api_key = settings.STRIPE_SECRET_KEY_TEST
   
    payload = request.body
    signature_header = request.META.get('HTTP_STRIPE_SIGNATURE')
    webhook_secret = settings.STRIPE_WEBHOOK_SECRET_TEST
    ...

В полосе, в местных слушателях я зарегистрировал:

localhost:8000/stripe_webhook/

Если я запускаю stripe trigger customer.created. я получаю следующее сообщение:

A newer version of the Stripe CLI is available, please update to: v1.22.0
Setting up fixture for: customer
Running fixture for: customer
Trigger succeeded! Check dashboard for event details.

Однако, запуская одновременно stripe listen --forward-to localhost:8000/stripe_webhook/, я также получаю следующие журналы:

> Ready! You are using Stripe API Version [2024-09-30.acacia]. Your webhook signing secret is XXXXX (^C to quit)
2024-12-05 22:27:54   --> customer.created [xxx]
2024-12-05 22:27:54  <--  [404] POST http://localhost:8000/stripe_webhook/ [xx]

и журналы моего сервера также вернутся (будь то производственный или локальный): Not Found: /stripe_webhook/.

Это заставляет меня думать, что путь к моему вебхуку настроен неправильно, но я не вижу ничего, что я мог бы упустить. Может быть, я что-то забыл в платформе Stripe?

Примечание: все мои ключи (STRIPE_PUBLIC_KEY_TEST, STRIPE_SECRET_KEY_TEST и STRIPE_WEBHOOK_SECRET_TEST) в моем .env файле совпадают с ключами, предоставленными на платформе Stripe.

Есть мысли?

Мне кажется, что вы предваряете URL-адреса ваших приложений символом my_app/, поэтому я ожидал бы, что он будет указан в конечном URL-адресе. У меня давняя (3 с лишним года) интеграция Django со Stripe, и когда я проверяю свой корневой файл urls.py, то вижу, что URL моего основного приложения указан так

path('', include('payments.urls')),

Это позволяет избежать необходимости включать префикс приложения, поэтому localhost:8000/webhooks/ работает для меня.

Поскольку вы указали my_app/, вам следует попробовать localhost:8000/my_app/stripe_webhook. Вы можете использовать CLI для запуска событий webhook, чтобы проверить, работает ли это.

Другой подход, который мне нравится использовать, - это добавить проверку метода API в мою функцию webhook и отвечать на GET-запрос чем-то вроде <h1>Hello Webhook!</h1>. Что-то вроде этого:

@csrf_exempt
def stripe_webhook(request):
   if request.method == "GET":
      # Respond with webpage indicating success
   else:
      # Do webhook-y stuff here

Таким образом, вы сможете легко проверить, работает ли маршрут, введя URL в веб-браузер.

Вернуться на верх