- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
- Formations
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- Articles
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- Communauté
- groups La communauté
- forum Questions
- live_tv Mentorats
- science Projets mensuels
Deviens membre Premium magic_button
Débloque cette session en devenant Membre Premium 🚀
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compte personlive_helpToutes les questions
Gabriel Trouvé
16 mars 2023 - 16 mars 2023 à 13:55
checkConversation résolue
2 réponses
Est-ce que j'ai bien fait ?
Bonsoir,Je pense que j'ai bien fait car j'ai le même résultat que dans ta vidéo.En fait les modèles Cart et Order ne sont pas les mêmes quand la vidéo "compléter …
Christian Aucane
14 janvier 2023 - 14 janvier 2023 à 11:43
checkConversation résolue
1 réponse
envoyer l'email a stripe
Comment faire pour envoyer dirrectement l'email a stripe pour éviter que l'utilisateur ne rentre une autre adresse ?
Thibaut44300
23 janvier 2023 - 23 janvier 2023 à 23:32
checkConversation résolue
10 réponses
Status 404 dans le webhook de stripe
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 …
00:00:00 :Maintenant qu'on a rajouté le webhook de Stripe dans notre fichier views.py,avec toutes les notions de sécurité pour s'assurer qu'on est bien en présence d'un événement envoyé par Stripe,on va pouvoir, après ce try except ici, qui nous assure que l'événement est correctement récupéré dans cette variable,on va pouvoir faire une vérification, vérifier le type d'événement qu'on a récupéré,
00:00:24 :et en fonction du type d'événement, le traiter d'une façon ou d'une autre.Nous, ce qu'on va vouloir récupérer comme événement, c'est l'événement checkout.session.completed,qui indique qu'une session de checkout de Stripe est arrivée à son terme,que le client a été créé, que le paiement a été accepté, etc.
00:00:42 :On va vérifier si event, qui est tout simplement un dictionnaire,et dans ce dictionnaire on va avoir type, donc la clé type,qui va correspondre au type d'événement qu'on va récupérer.
00:00:55 :Donc si le type d'événement c'est checkout.session.completed,on va tout simplement compléter le panier de l'utilisateur,donc on va faire une fonction ici qu'on va appeler par exemple completeOrder,et on va récupérer dans cette fonction l'élément qu'on va récupérer de notre objet event.
00:01:10 :Donc dans event, on a un objet qui va contenir par exemple l'adresse mail de l'utilisateur,les produits qu'il a acheté, etc.Et donc ça c'est dans event, et on a une clé data,et dans cette clé data, on a une clé object.
00:01:23 :Donc je vais mettre tout ça dans une variable que je vais appeler data, tout simplement,et on va retourner l'appel à notre fonction,donc on va faire notre fonction completeOrder,et on va lui passer cet objet data.
00:01:34 :Donc je vais mettre un paramètre ici que je vais également appeler data,et à l'intérieur de cette fonction, on va traiter en fait ces données,donc on va récupérer l'utilisateur sur notre site,donc l'objet utilisateur, récupérer son panier,et tout simplement dire que le panier a été correctement complété,
00:01:50 :puisque sur notre modèle de panier, si je retourne, je crois que c'est dans models ici,si on va voir notre modèle de panier,on a un booléen order qui va indiquer si le panier a été commandé ou non,et order date qui va indiquer la date à laquelle la commande a été passée.
00:02:04 :Donc on va pouvoir modifier ces deux éléments pour dire que le panier a été ordered,donc on va passer ce booléen à true,et on va également prendre la date au moment où l'événement est envoyé,pour le mettre dans ce champ.
00:02:15 :Donc je vais revenir dans views ici,pour l'instant on va juste faire ici un pprint de data,donc je vais importer pprint puisque c'est un module qui n'est pas importé de base,donc pprint c'est juste en fait une façon de faire un print qui va être un peu plus sympathique à l'écran,
00:02:30 :donc qu'est-ce que je veux dire par sympathique,c'est tout simplement qu'un print normal ça va tout mettre sur la même ligne,alors que pprint, là vu qu'on va avoir un objet assez important,donc un dictionnaire,et bien pprint ça va l'afficher d'une façon un peu plus lisible.
00:02:42 :Donc c'est un module qu'il faut importer,qui est disponible dans la bibliothèque standard de Python,donc il suffit juste de l'importer,et donc on va pouvoir afficher ces données,dans le cas où on a un checkout session completed.
00:02:52 :Et pour m'assurer que tout est bon,je vais quand même relancer le webbook,donc je l'ai arrêté, je le relance,juste pour m'assurer que tout est bien comme il faut avec le token ici,donc je vais le recopier,comme ça on est sûr qu'on n'a pas de problème,je vais le remettre ici,
00:03:07 :on va voir si c'est le même ou pas,et là vous voyez donc c'est le même endpoint secret,donc normalement vous ne devrez pas avoir à le changer à chaque fois,mais voilà je préfère arrêter,et être sûr ici que je n'ai pas les anciens événements,comme ça on verra bien les événements qui sont récupérés par le webbook.
00:03:21 :Alors je devais refaire un cycle d'achat sur le site,donc je vais me connecter avec mon utilisateur,on va aller voir dans le panier,et on va procéder au paiement.
00:03:31 :Donc on va être redirigé vers Stripe Checkout,on va rentrer les informations de notre compte,on va passer les informations de la carte par défaut,et le titulaire de la carte,et le pays,France,et on procède au paiement.
00:03:47 :On va retourner voir ici,on voit bien qu'on a différents événements qui ont été récupérés,et on a le Checkout Session Completed ici,qui a une erreur de 500,donc c'est normal parce qu'en fait on n'a rien retourné,alors on va retourner voir dans le terminal ici,et vous voyez en fait que le problème c'est que,
00:04:04 :cette fonction ici Complete Order,elle ne retourne pas un objet de type HTTP,un objet de type HTTP Response.Contrairement à tous les autres,vous voyez ici soit on retournait un code d'erreur 400,si la requête n'était pas valide,soit ici on retournait un statut 200.
00:04:19 :Donc ça c'était pour tous les autres types d'événements,ça permet de bien voir que,dans le cas d'un autre type d'événement que Checkout Session Completed,et bien on ne passait pas dans cette structure conditionnelle,et on retournait tout simplement,un HTTP Response statut 200.
00:04:31 :Quand on a un Checkout Session Completed,ici on faisait juste un pprint de data,et on ne retournait pas de HTTP Response,et c'est ça qui fait qu'on a cette erreur 500 ici.
00:04:39 :Nous ce qui nous intéressait,c'était juste de voir les données qui nous sont envoyées,et là vous voyez qu'on a pas mal de choses,donc c'est ça l'intérêt comme je vous disais du pprint,quand on doit afficher ce genre d'informations.
00:04:48 :Donc on voit par exemple le total qui a été payé,on voit le Console URL,donc il y a pas mal de choses ici.On a également l'identifiant unique du Customer,donc Customer c'est le client du côté de Stripe,et on a les détails du Customer,donc avec l'email hello.docstring.fr.
00:05:04 :Alors dans notre cas,ce qui va nous intéresser c'est l'email ici,donc on va devoir accéder à cette clé Customer Detail,et à cette clé Email,à l'intérieur de ce nouveau dictionnaire,et c'est ça qui va nous permettrede récupérer l'utilisateur sur notre site.
00:05:16 :Alors dans ce cas-ci,ce n'est pas forcément la bonne façon de faire,ce que je veux dire par là,c'est qu'en fait,si vous l'avez remarqué,quand je vais dans le panier et que je procède au paiement,on me demande de rentrer mon adresse Email.
00:05:26 :Alors cette adresse Email,on pourrait la passer quand on fait la vue de Checkout,quand on va dans notre vue ici,si je remonte dans Session Create,ici on pourrait passer déjà une adresse Email,comme ça,l'utilisateur n'aurait pas à rempliret à utiliser une adresse Emailqui pourrait être différente,
00:05:41 :parce que là le problème dans ce cas-ci,c'est que quelqu'un pourrait mettreune autre adresse Emailque celle qu'il a utilisée pour son compte.Et dans ce cas-ci,ce qu'on va faire tout de suiteen récupérant l'adresse Email,ça ne fonctionnerait pas.
00:05:51 :Donc là, il y a plein de façons de faire différentes,ce qui serait intéressant de faire,notamment,ce serait de récupérer cet événement Customer Created,pour pouvoir,quand un client est créé du côté de Stripe,le récupérer,donc récupérer cet identifiant ici,et le lier à notre modèle d'utilisateur.
00:06:05 :Donc dans notre modèle d'utilisateur,de la même façon qu'on avait créé un champpour récupérer le Product ID de Stripesur notre modèle de produit,eh bien,on pourrait créer un champdans notre modèle d'utilisateurqui ferait le lienentre le client sur Stripeet l'utilisateur sur notre site.
00:06:20 :Comme ça,on ne serait pas dépendantde l'adresse Emailqui peut être différentesi on utilise une autre adresse Emailau moment du paiement.Eh bien là,on n'aurait en fait pas de problème.
00:06:28 :Donc dans ce cas-ci,c'est vraiment juste pour vous montrerle webbooket vous montrer qu'on va donctout simplement récupérerl'utilisateur par rapportà son adresse Email.
00:06:35 :Et après, bien sûr,chaque cas de figure est différenten fonction de votre site.Si vous vous passezpar des adresses Email,par des pseudos,si vous avez d'autres informationsdont vous avez besoin,eh bien là,il va falloir passer ces informations,donc les récupérerd'un côté ou de l'autre.
00:06:47 :Donc,chaque cas de figure est différent.Là,je veux juste vous montrer vraimentce processus de webbook.Donc,ce qu'on va faire ici,c'est récupérer à partirde cette clé Data,comme je vous le disais,les deux clés,donc la clé Customer Detailet la clé Email.
00:07:00 :Donc ici,on va essayer de récupérerl'email de l'utilisateur.Donc,la première clé,c'était Customer Detailet la deuxième clé,c'était Email.Donc là,je fais un bloc Try Exceptparce quesi jamais,en fait,on a des donnéesqui ne sont pas validespour une raison ou une autre,
00:07:17 :on pourrait avoirà la fin de cette,dans cette fonction ici,on pourrait avoir un objetqui n'est pas forcément,qui ne contient pas forcémentles mêmes données.
00:07:24 :Donc là,ça pourrait être la même chose ici.Vous voyez qu'on a récupéréData Object,donc quand on fait des cléscomme ça directement,si ces clés n'existent pas,je n'ai pas fait de Try Except.
00:07:32 :Là encore,c'est plus de la gestion d'erreurque du Webhook,donc je ne vais pas passertrop de temps là-dessus,mais je veux juste vous montrer,voilà,qu'il faut des fois,quand même,mettre un minimum.
00:07:42 :Par exemple,ici,donc je vais essayer de récupérerces deux clés ici,Customer Detail et Email.Et si jamais,on a un Key Error,donc ça veut dire queles clés n'ont pas été trouvéesdans le dictionnaire,eh bien,on va retournerun HTTP Responseen disant,par exemple,
00:07:57 :Invalid User Emailet on va mettre un statutde 404 dans ce cas-ci.Par contre,le User Email,on va pouvoir récupérerl'utilisateur sur notre siteavec la fonctionGetObjectOr404.
00:08:06 :Donc,on va,à partir de notre classe Shopperqu'on n'a pas importé,donc Shopper,c'est le modèlede notre utilisateur.Si je retournedans Accounts ici,dans les Models,on a notre classe Shopperqui correspondau modèle d'utilisateur.
00:08:19 :Donc,je vais l'importeravec PyCharm,ImportAccounts.Model,voilà,et on va lui passeren Email,le User Email.Ensuite,on va récupérer le panieravec User.Cart,
00:08:30 :on va changerce champ Orderpour lui direqu'il est égal à True,ce qui signifieque la commande a été passéesur ce panieret on va aussi modifierle deuxième champque je vous avais montrédans Store.Model ici
00:08:41 :qui est OrderDate.Lui,on va devoir lui donnerun DateTimeFieldet pour ça,on va utiliserun module de Djangoqui s'appelle TimeZone.Là encore,on va devoir l'importer,ImportThisNameet ce module,c'est Django.Utils.TimeZone
00:08:54 :et TimeZone,on a une méthode Nowet ça,ça va nous permettretout simplementde récupérer la dateet l'heureau moment où on utilisecette ligne de codepour pouvoir l'injecterdans le champ OrderDate.
00:09:05 :On va direOrderDateégale TimeZone.Nowet ensuite,on sauve le paniertout simplementUser.Cart.Saveet pour finir,on va retournerun HTTP Responseavec un statut de 200.
00:09:16 :Comme ça,on aura bien renvoyé icinon pas un 500comme on avaitmais on vaindiquerque le paiementa été correctement processéde notre côtésur notre site web.
00:09:26 :On va retester tout ça,on va refaire une bouclede paiement,je vais revenir sur le site,on va cliquer survoir le panieret on va tout de suiteégalement rajouterpour s'assurerque ça fonctionne biendans mon modèle.
00:09:37 :Ce n'est pas dans le cart,ça doit être dans le modèlede base.Je vais rouvrirdans Shopou dans Template.Ici,on a le base.html
00:09:45 :et dans ce fichier ici,vous voyez qu'on affiches'il y a un panier,on affichele boutonvoir le panier.Je vais rajouterif User.Cart
00:09:53 :and cartand notUser.CartUser.Cart.OrderedÇa veut direqu'on ne va afficherici cet élémentque si l'utilisateura un panieret s'il n'a pas déjàété commandé.
00:10:05 :Et si par contrele panier a déjà été commandé,on n'affichera pas ce lien.Ça va nous permettrede vérifierque le processusse déroule correctementet que quand on arriveà la fin du processusde paiement,quand on revientsur notre site,le panier a bien étéenregistré
00:10:19 :et qu'on ne voit plusce bouton.Je vais cliquer icisur voir le panier.On va procéder au paiementen cliquant surprocéder au paiement ici.
00:10:26 :Si je reviensdans l'interfaced'administration,si je veux voirle panier en question,pour l'instant vous voyezque Ordered n'est pascoché et qu'on n'aaucune datepour le OrderDate.
00:10:36 :Donc on va procéderau paiement.Je vais remettrele mail ici.Donc comme je vous disais,la seule contrainte,c'est qu'on est obligéici d'utiliserla même adresse emailque celle qu'on aenregistréepour le modèle utilisateurpour que l'utilisateursoit bien récupéréet qu'on puissevalider son panier.
00:10:52 :Donc je faistoutes les opérations ici.Ça marcheraitde la même façonet on va mettrepayer.Et donc normalementsi tout se déroulecorrectement,je vais retournervoir ici.
00:11:04 :On a bien leChargeSucceeded,CheckoutSessionCompleted.Donc on a bienle statut de 200.Je reviens sur le siteet là vous voyezqu'on n'a plusce boutonqui indiquaitvoir le panier.
00:11:15 :Si je retournedans la vued'administration,là vous voyezque tout a bienété enregistré.Donc on a le OrderDatequi s'est mis à jouret vous voyez d'ailleurspar la même occasionà l'heure où j'enregistrecette vidéo,il est 10h30le 6 novembre.
00:11:29 :Donc moi je suis à Montréalau moment où j'enregistrecette vidéoet on a une petite noteici qui ditvotre heure précèdel'heure du serveurde 4 heures.
00:11:37 :Donc en fait icion a une datequi est enregistréeau format UTC.Donc UTCc'est le temps universel.Donc en faitça c'est la bonne façonde faire.
00:11:46 :Vous allez stockertoutes les datesdans votre base de donnéesavec une heurequi va être en UTCdonc qui n'est pas dépendantede l'utilisateur.
00:11:53 :Et bien làvous avez des fonctionsnotamment des filtresque vous pouvez utiliserdans le fichier HTMLqui vont vous permettred'ajusterle fuseau horairede l'utilisateur.
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.