Résolue

Status 404 dans le webhook de stripe

# Stripe # Django

Le web_hook me renvois un status de 404 sur tout mes évenements, alors que sur ma vue stripe_webhook il est bien spécifié qu'il me retourne un status 400 en cas d'une ValueError, et un status 200 pour un checkout.session.completed.


@csrf_exempt
def stripe_webhook(request):
    payload = request.body
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
    endpoint_secret = "whsec_de13345002dc7bc7b5b2eee23a56e5094d4bf744e6752c19280ec8d665649f35"
    event = None
try:
        event = stripe.Webhook.construct_event(
            payload, sig_header, endpoint_secret
        )
    except ValueError as e:
        # Invalid payload
return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        # Invalid signature
return HttpResponse(status=400)

    if event['type'] == 'checkout.session.completed':
        data = event['data']['object']
        return completed_order(data)

    # Passed signature verification
return HttpResponse(status=200)



(.env) MacBook-Pro-de-Thibaut:DocShop thibaut$ stripe listen --forward-to 127.0.0.1:8000/stripe-webhook/

A newer version of the Stripe CLI is available, please update to: v1.13.8

> Ready! You are using Stripe API Version [2022-11-15]. Your webhook signing secret is whsec_de13345002dc7bc7b5b2eee23a56e5094d4bf744e6752c19280ec8d665649f35 (^C to quit)

2023-01-12 16:52:22  --> checkout.session.expired [evt_1MPT4kFUn0aAiyLrOnt0tnTe]

2023-01-12 16:52:22 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_1MPT4kFUn0aAiyLrOnt0tnTe]

2023-01-12 16:53:21  --> charge.succeeded [evt_3MPT5fFUn0aAiyLr2hRo14j7]

2023-01-12 16:53:21 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MPT5fFUn0aAiyLr2hRo14j7]

2023-01-12 16:53:21  --> payment_intent.succeeded [evt_3MPT5fFUn0aAiyLr22Efq3Sn]

2023-01-12 16:53:21 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MPT5fFUn0aAiyLr22Efq3Sn]

2023-01-12 16:53:21  --> payment_intent.created [evt_3MPT5fFUn0aAiyLr2fFwD6KG]

2023-01-12 16:53:21  --> checkout.session.completed [evt_1MPT5hFUn0aAiyLrN4jdLBEp]

2023-01-12 16:53:21 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MPT5fFUn0aAiyLr2fFwD6KG]

2023-01-12 16:53:21 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_1MPT5hFUn0aAiyLrN4jdLBEp]


Est-ce normal?

Thibault houdon

Mentor

Salut Thibaut,


Si tu as une erreur 404 c'est que la page n'est pas du tout trouvée. As-tu bien ajouté l'url stripe-webhook dans ton fichier urls.py ?

Oui je l'ai ajouté :


urlpatterns = [
    path('', index, name='index'),
    path('admin/', admin.site.urls),
    path('signup/', signup, name="signup"),
    path('login/', login_user, name="login"),
    path('logout/', logout_user, name="logout"),
    path('stripe-webhook/', stripe_webhook, name="stripe-webhook"),
    path('cart/', cart, name="cart"),
    path('cart/create-checkout-session', create_checkout_session, name="create-checkout-session"),
    path('cart/checkout-success', checkout_success, name="checkout-success"),
    path('cart/delete/', delete_cart, name="delete-cart"),
    path('product/<str:slug>/', product_detail, name="product"),
    path('product/<str:slug>/add-to-cart/', add_to_cart, name="add-to-cart"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


Thibault houdon

Mentor

Ok, c'est bizarre. Quelques choses à vérifier :


Dans ton fichiers de settings, dans ALLOWED_HOSTS est-ce que tu as bien 127.0.0.1 ?


Si tu te rends manuellement sur 127.0.0.1:8000/stripe_webhook/ est-ce que ça fonctionne ? (tu devrais avoir une erreur 500 car tu n'auras pas la clé HTTP_STRIPE_SIGNATURE, mais tu ne devrais pas avoir d'erreur 404 en tout cas).


Si tu peux me confirmer ces deux points déjà et on va investiguer :)

Alors pour le ALLOWED_HOSTS du settings j'avais une liste vide j'ai donc ajouté "127.0.0.1".

Par contre lorsque j'essaie d'accéder à 127.0.0.1:8000/stripe_webhook/ j'ai une KeyError


KeyError at /stripe-webhook/

'HTTP_STRIPE_SIGNATURE'
Request Method:GETRequest URL:http://127.0.0.1:8000/stripe-webhook/Django Version:4.1.5Exception Type:KeyErrorException Value:'HTTP_STRIPE_SIGNATURE'
Exception Location:/Users/thibaut/DocShop/store/views.py, line 71, in stripe_webhookRaised during:store.views.stripe_webhookPython Executable:/Users/thibaut/DocShop/.env/bin/pythonPython Version:3.9.6Python Path:['/Users/thibaut/DocShop',
 '/Users/thibaut/DocShop',
 '/Users/thibaut/Documents/dossier_module',
 '/Users/thibaut/Docstring/Exercice/Module',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
 '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
 '/Users/thibaut/DocShop/.env/lib/python3.9/site-packages']

Server time:Fri, 13 Jan 2023 14:40:08 +0000

*127.0.0.1:8000/stripe-webhook/

Thibault houdon

Mentor

Pour le KeyError oui c'est normal car tu n'as pas la clé HTTP_STRIPE_SIGNATURE (qui est envoyée par Stripe lors d'une requête pour vérifier que la requête provient de Stripe).


Je voulais juste vérifier que tu n'avais pas une erreur 404 comme Stripe mais c'est normalement une erreur 500 que tu dois avoir (si tu regardes du côté du stripe listener).


As-tu réessayé avec 127.0.0.1 dans le ALLOWED_HOST de voir si tu as toujours l'erreur 404 ?

Oui le KeyError m'est renvoyé avec et sans le "127.0.0.1" dans le ALLOWED_HOST

Thibault houdon

Mentor

Si toi tu vas directement sur la page c'est normal, il n'y a que Stripe qui envoie la clé dans la requête.


As-tu essayé avec le 127.0.0.1 dans ALLOWED_HOST de refaire une requête avec stripe listen ?

J'ai retravaillé tout ça j'ai des status 200 pour quasiment tout mes évènements à part un mais je n'arrive pas à savoir à lequel (checkout.session.completed ou payment_intent.created), En tout cas le paiement est bien accepté lorsque je fais la procédure d'achat.

2023-01-23 16:58:11  --> charge.succeeded [evt_3MTSPNFUn0aAiyLr2JkJEc63]

2023-01-23 16:58:11 <-- [200] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MTSPNFUn0aAiyLr2JkJEc63]

2023-01-23 16:58:11  --> payment_intent.succeeded [evt_3MTSPNFUn0aAiyLr2qBBT8sh]

2023-01-23 16:58:11 <-- [200] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MTSPNFUn0aAiyLr2qBBT8sh]

2023-01-23 16:58:11  --> checkout.session.completed [evt_1MTSPPFUn0aAiyLrdlTt2O3g]

2023-01-23 16:58:11  --> payment_intent.created [evt_3MTSPNFUn0aAiyLr2QhcEqLB]

2023-01-23 16:58:11 <-- [200] POST http://127.0.0.1:8000/stripe-webhook/ [evt_3MTSPNFUn0aAiyLr2QhcEqLB]

2023-01-23 16:58:11 <-- [404] POST http://127.0.0.1:8000/stripe-webhook/ [evt_1MTSPPFUn0aAiyLrdlTt2O3g]

Salut Thibaut,

Tu n'as pas forcément besoin de traiter tous les événements, tu peux choisir sur Stripe les événements que tu veux recevoir par webhook.


Si un événement ne t'intéresse pas, tu peux l'enlever pour ne pas avoir des erreurs et éviter de tous les traiter dans ta vue :)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.