⌘K
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- groups La communauté
- forum Questions
- live_tv Mentorats
Formations
Articles
Communauté

La certification qualité a été délivrée pour la catégorie d'actions « Actions de formation ».
⌘K
- conversion_path Parcours & Formations
- science Projets
- data_object Exercices de code
- psychology Exercices IA
- quiz Quiz
- rss_feed Blog
- sort_by_alpha Glossaire
- menu_book Guides
- help_center FAQ
- media_link Ressources
- groups La communauté
- forum Questions
- live_tv Mentorats
Formations
Articles
Communauté

La certification qualité a été délivrée pour la catégorie d'actions « Actions de formation ».
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 person00:00:00 :Dans cette partie, on va voir comment, dans notre webbook ici, sauvegarder l'adresse de livraison de l'utilisateur.Donc quand on va passer une commande, si je clique sur « Acheter » ici, quand on est redirigé vers Stripe Checkout,vous voyez qu'ici on peut saisir une adresse et donc c'est cette adresse qu'on va vouloir récupérer.
00:00:16 :Elle va nous être envoyée par l'événement de Stripe et on va pouvoir la récupérer dans les datas qu'on récupère du webbook.Donc pour ne pas avoir à chaque fois à passer par le processus d'achat,on va utiliser Stripe CLI qui va nous permettre de simuler un événement « Checkout Session Completed ».
00:00:39 :Comme ça, ça va me permettre sur mon ordinateur d'écouter ces événements.Et ensuite, on va ouvrir un nouvel onglet et on va utiliser là encore Stripe CLI.
00:00:47 :Mais cette fois-ci, on va utiliser la commande « Trigger » qui va nous permettre de simuler un événement qui se passe sur Stripe.Donc l'événement en question, c'est « Checkout.Session.Completed » et c'est l'événement qu'on écoute dans notre code.
00:00:59 :Donc cet événement ici pour lequel on a une structure conditionnelle.Donc je vérifie que c'est bien comme il faut « Checkout.Session.Completed ». C'est exactement ça.
00:01:07 :Et on va pouvoir donc déclencher cet événement avec Stripe CLI.Donc on attend, là vous voyez, il va simuler en fait la page de paiement, le payment method, la confirmation, etc.
00:01:16 :Et on voit que tout a été correctement effectué.Et là, vous voyez qu'on a différents statuts. Donc on a des 200 et on a un 404 dans le « Checkout.Session.Completed ».
00:01:25 :Pourquoi on a un 404 ici ? Tout simplement parce qu'en fait, il va envoyer des données par défaut qui sont des données de test.Et donc cette valeur ici de « DataCustomerEmailEmail », ça va retourner un email d'un utilisateur qui n'est pas présent dans notre base de données.
00:01:39 :On va donc avoir une erreur 404 ici qui va nous être retournée.Moi ce que je veux, c'est juste afficher ici ce que va contenir l'objet « Data » pour voir sous quel format nous est retournée l'adresse de livraison.
00:01:56 :Donc je vais rouvrir le terminal et je vais relancer un événement.Donc en revenant ici, en refaisant « StripeTrigger.Checkout.Session.Completed ».Donc on va revenir ici dans notre « Listener » et on va voir qu'on aura les différents événements.
00:02:08 :On retrouve le 404 ici, donc c'est normal.Par contre si je reviens ici, maintenant j'ai bien fait le « PayPrint » et on va voir qu'on a effectivement une clé « Shipping » qui pour l'instant est à « None ».
00:02:23 :Alors on pourrait modifier le « StripeTrigger » pour lui passer une adresse, mais ça va devenir un peu plus long.Ça pourrait être bien si on voulait automatiser ces tests-là.
00:02:30 :Pour l'instant, moi je vais repasser par la boutique de Dockstring.Donc on va le faire à la main, mais je voulais juste vous montrer qu'il est possible également de déclencher ces événements avec Stripe CLI.
00:02:39 :Donc pour voir les informations pour avoir une adresse, on va revenir ici.On va cliquer sur « Acheter » pour passer à travers le processus nous-mêmes et passer une adresse de livraison directement ici.
00:02:57 :Et vous voyez, on a même cette suggestion automatiquement sur Stripe qui se met et on peut remplir automatiquement l'adresse.Donc 1 rue des Champs-Elysées à Toulouse en France et je vais mettre le code de carte de crédit de base,donc le code par défaut qui me permet de tester le checkout.
00:03:13 :Je clique sur « Payer ».Donc là on a bien rentré une adresse de livraison et on va aller regarder dans notre terminal ce que ça nous donne.
00:03:20 :Et on a effectivement ici donc cette fois-ci « Shipping » avec l'adresse.Donc je vais copier tout ça, on a l'adresse, on a le nom et c'est ce qu'on va vouloir récupérer dans cette fonction.
00:03:29 :Donc je vais mettre des commentaires juste pour garder ces informations.Et donc nous ce qu'on va vouloir faire ici c'est récupérer ces différents éléments.Donc on va déjà vouloir récupérer l'adresse ici, donc à partir de « Shipping address ».
00:03:49 :Donc ça, ça va nous retourner ce dictionnaire ici.Et ensuite sur ce dictionnaire on va récupérer la ville, le pays, la ligne 1, ligne 2, postal code et le state on l'avait pas mis.
00:03:58 :Donc ça, ça ne nous intéresse pas puisqu'on ne l'a pas dans notre modèle de notre côté.On va également récupérer le nom de l'adresse puisque ça on l'avait mis dans notre modèle.
00:04:05 :Si on retourne voir notre modèle ici, on avait bien un nom pour l'adresse.Donc je vais dupliquer cette ligne, je vais faire une variable « name » qui va être égale tout simplement à « Shipping » et cette fois-ci la clé qui s'appelle « name ».
00:04:16 :Donc « Shipping name » et ça va nous retourner cette valeur ici.Et ensuite donc on va avoir les différents éléments ici.Donc on va les récupérer à partir de « address ».
00:04:29 :Et ça va être pareil pour tous les autres.Donc je vais copier ces lignes ici.On va avoir le « country », donc « country » qui va être « country ».
00:04:36 :Le « line1 » qui va être égal à « line1 ».On va récupérer le « line2 » également qui va être égal à « line2 ».
00:04:43 :Le « city » on l'avait déjà.Il reste le « zip code » qui va être égal à « postal code » dans ce cas-ci.
00:04:50 :Donc on pourrait l'appeler « postal code » également.Là j'ai juste mis « zip code » puisque dans notre modèle on l'avait appelé comme ça.
00:04:55 :On pourrait mettre « address1 » et « address2 » aussi ici à la place de ces noms de variables.Là c'est vraiment juste pour récupérer les informations.
00:05:01 :Donc on va mettre tout ça dans un « try except » avec un « except » qui va cibler le « key error ».Et si on a un « key error » et bien ça veut dire qu'on n'a pas toutes les informations qu'il nous faut.
00:05:10 :On va retourner un « http response » avec un statut de 400.Si par contre on n'a pas de « key error » et bien ça veut dire qu'on a toutes les informations qu'il nous faut pour créer une adresse de livraison.
00:05:20 :Donc on va créer un « shipping address » et je vais importer cette classe en faisant « option entrée » pour l'importer automatiquement.Et on va faire un « object » et on va faire un « get or create » puisque potentiellement cette adresse de livraison pourrait déjà exister.
00:05:33 :Si l'utilisateur a déjà passé une commande avec cette adresse de livraison, on ne veut pas la créer de nouveau.On veut juste dans ce cas-ci la récupérer ou la créer.
00:05:40 :Donc si elle existe, on va juste la récupérer et on n'en fera rien.Et si elle n'existe pas, on va la créer.Donc on va dire que le « user » c'est égal à l'utilisateur que l'on passe à notre fonction.
00:05:51 :Et ensuite on va passer les différents éléments.Donc « name » qui est égal à « name ».On va avoir « city » qui est égal à « city ».
00:05:57 :« country » qui est égal à « country ».Et on va le mettre en « lower » puisque si je me souviens bien, si on va retourner voir,ici le « country » c'est en majuscule et dans notre modèle nous on l'avait mis en minuscule.
00:06:07 :Donc on va mettre « country.lower » pour ça.J'ai oublié la virgule ici donc je ne l'oublie pas.Ensuite on va avoir l'adresse 1 qui va être égal à « line1 »et l'adresse 2 qui va être égal à « line2 ».
00:06:21 :Et pour finir le zip code qui va être égal à « zipcode ».Donc on a tout ce qu'il faut normalement et si on arrive jusque là, ça veut dire que tout s'est déroulé correctementet on va retourner un HTTP response avec un statut de 200.
00:06:33 :Donc beaucoup de choses à écrire ici mais vous voyez qu'on fait juste récupérer les informationset les passer ici à la création de notre modèle pour pouvoir le créer s'il n'existe pas déjàet le récupérer s'il existe auquel cas on ne créera pas une nouvelle adresse de livraison identique.
00:06:48 :Donc on va tester si ça fonctionne.Je vais revenir sur mon site et je vais ajouter de nouveau des éléments dans le panieret on va repasser par le processus d'achat pour voir si on a bien cette adresse qui est enregistrée.
00:06:59 :Donc je clique sur « acheter ».Voilà, je vais me remettre en France.On va mettre « domicile ».On va remettre « 1 rue des Champs-Elysées ».
00:07:09 :Voilà, 1 rue des écoles, peu importe.Et on va mettre notre carte par défaut.Vous commencez à connaître et on clique sur « payer ».
00:07:18 :Et on va voir ce que ça donne.Donc si on retourne dans notre commande ici, donc à ce niveau-là,alors là vous voyez qu'on a une erreur 500.
00:07:25 :Alors ça, ça veut dire qu'il y a un problème assez important.Donc on va aller voir ce que ça donne dans notre terminal.Et si je descends tout en bas,donc on a « not null constrain failed account shipping address address 2 ».
00:07:36 :Alors on va essayer de débuguer tout ça ensemble.Je ne vais pas couper au montage, comme ça, ça va vous permettre de voir comment on peut débuguer ce genre de choses.
00:07:42 :Donc « not null constrain ».Donc là, le problème, c'est que, donc si je reviens dans mon modèle,c'est l'adresse 2 ici.On a mis « blank » égal à « true ».
00:07:53 :Et on n'a pas mis « null ».Donc si je réfléchis, mais je pense qu'en fait, on est arrivé jusque-là,puisqu'on n'a pas eu un « key error ».
00:08:02 :Si je reviens ici, vous voyez que là, l'erreur qu'on a, c'est une erreur sur la base de données.Donc « django db utils ».Ce n'est pas une erreur qui est sur la récupération de la clé.
00:08:12 :Donc ça veut dire qu'ici, on a bien réussi à passer à travers tout ça.On n'a pas une erreur 400, on a une erreur 500 sur la base de données.
00:08:18 :Donc là, l'erreur, ça veut dire qu'en fait, on a récupéré toutes ces informations ici.Sauf qu'après, moi, je pense que c'est en fait dans « line 2 » ici.
00:08:26 :On a quelque chose qui nous est envoyé, mais c'est une donnée vide.Et ça ne doit pas être une chaîne de caractère vide, mais ça doit être un objet « none ».
00:08:33 :Donc c'est ma supposition.Donc là, ce qu'on pourrait faire, c'est faire un « print » ou un « debug » de cet élément-là.Et moi, je pense qu'il est égal à « none ».
00:08:41 :Parce qu'en fait, quand on a fait le « checkout »,on n'a pas renseigné d'élément pour cette ligne d'adresse.Si vous vous souvenez, alors je ne sais pas si on ne le voit plus ici,mais quand on était passé par le « stripe checkout »,on avait mis un « rue des écoles » et on n'avait pas d'élément dans la deuxième ligne.
00:08:57 :Donc ça, à mon avis, « stripe », il le renvoie.Quand il n'y a rien, il ne doit pas renvoyer une chaîne de caractère vide,mais il doit renvoyer l'objet « none ».
00:09:03 :Et le problème, je pense, c'est qu'ici, on doit envoyer « none ».Et si on envoie « none », comme on a « blank » égal à « true »,mais on n'a pas « null » égal à « true »,eh bien, on a un problème.
00:09:14 :Parce que, par défaut, quand c'est un modèle de type « charField »,quand c'est un champ de charField,les objets qui ne contiennent rien, on va mettre une chaîne de caractère vide.
00:09:22 :Et si on veut, à la place d'une chaîne de caractère vide,mettre un objet « null », donc un objet « none »,eh bien, il faut spécifier ici « null » égal à « true ».
00:09:30 :Donc ça, c'est une erreur qui arrive assez régulièrementquand on récupère des informations et qu'elles ne sont pas du bon type,et je pense qu'ici, c'est ça qui arrive.
00:09:37 :Donc là, qu'est-ce qu'on peut faire ?Eh bien, en fait, ce qu'on va faire,moi, je pense que je vais tout simplement mettre « or » et une chaîne de caractère vide.
00:09:43 :Alors, qu'est-ce que ça fait ici, en fait ?C'est-à-dire que si on n'a rien dans cette variable,donc si on a « none »,eh bien, on va passer au deuxième élément,et ce deuxième élément, ça va être une chaîne de caractère vide.
00:09:56 :Donc ça, c'est une technique qu'on utilise assez souventpour faire cette opération très rapidement en une seule ligne.Si vous n'avez rien, en fait, ici,et que vous voulez mettre une valeur par défaut,plutôt que de faire une structure conditionnelle,on pourrait dire « if line2 or else » ceci.
00:10:14 :Donc ça, c'est quelque chose qui est possible aussi avec un opérateur ternaire.On dit qu'on met le line2 si on a quelque chose dans line2,sinon, on met une chaîne de caractère vide ou n'importe quoi d'autre.
00:10:24 :On pourrait mettre une valeur par défaut ici,comme des points de suspension ou ce que vous voulez.Mais la façon plus rapide de faire cette structure conditionnelle,c'est juste de mettre « or »,puisque si on n'a rien là-dedans,eh bien, on va utiliser le deuxième élément.
00:10:36 :Donc, ça rentre un petit peu dans le détail,mais je voulais débuguer cette erreur avec vous,plutôt que de la couper au montage,puisque c'est le genre d'erreur qu'on peut avoirquand on fait des manipulations comme ça.
00:10:46 :Donc, je pense que c'est ça.Je n'en suis pas sûr à 100%.On va faire un print ici de line2,pour voir si c'est bien ça qu'on a.
00:10:53 :Et on va refaire un check-out,pour vérifier si c'est bien ça ou pas,et si ça fonctionne.Donc, je reviens ici dans ma boutique.Donc là, si je reviens là,normalement, on n'a plus de panier.
00:11:04 :Les éléments ont bien été modifiés ici,puisque ça, ça se fait avant de sauver l'adresse.Donc, c'était dans une fonction séparéequ'on avait faite.Donc, cette fonction ici,la fonction complete order.
00:11:14 :Donc, tout ça, c'est bon.C'est juste le shipping addressqui n'a pas été correctement effectué.Je vais enlever également ce commentaire.Et on va réessayer tout ça.
00:11:21 :Donc, je reviens ici.Je vais rajouter.On va essayer avec les autres.Voilà.On va ajouter celle-ci dans le panier.Voir le panier.J'achète.On va remettre une adresse.
00:11:30 :Donc ici, domicile.On va remettre en France.On va mettre 1 rue des...On va mettre des magasins,cette fois-ci, à Strasbourg.Je remets la carte de test.
00:11:44 :Je paye.Et on va retourner voir dans le terminalce que ça nous affiche.Donc, vous voyez, c'est exactement ça.Donc, là, on a les datas qui sont affichéesparce qu'on avait dû laisser un printquelque part ici.
00:11:56 :Voilà, le pprint data.Donc, ça, on peut l'enlever.Ce serait peut-être mieux de passer par du debug.Là, je passe par des printspour pas rajouter une couche de complexité là-dessus.
00:12:03 :On fait juste un petit print.Et là, on voit bien qu'on annoneDonc, c'est exactement ça.En fait, on a bien réussi à récupérer cet élémentpuisqu'il existe, mais il ne retourne non.
00:12:11 :Donc, ça veut dire que la clé, ici,elle existe dans le dictionnaire,mais elle est égale à non.Et donc, là, normalement,je vais voir si ça a planté ou pas.
00:12:18 :Non, c'est ça.Là, on a bien des 200 partout.Ça, je pense que c'était celui d'avant,13h54, donc c'est ça.13h59, on a toute cette suite d'événementset ils sont tous en 200.
00:12:27 :Donc, ça fonctionne.Donc, si je retourne voir dans le shipping address,là, voilà, effectivement,on a bien notre adresse qui a été créée,1 rue des magasins.
00:12:35 :Vous voyez qu'ici, dans l'adresse 2, du coup,on a une chaîne de caractère vide,mais ça n'a pas planté.On a bien le country qui est à France,le zip code, Strasbourget le nom de l'adresseet également l'utilisateur associé.
00:12:46 :Donc, tout fonctionne.On a bien notre adresse.Et donc, si on essaye de repasser une commandeavec cette adresse,eh bien, cette fois-ci,elle ne serait pas recrééepuisqu'elle existe déjà.
00:12:55 :Donc, voilà pour cette partiequi était peut-être un petit peu plus longueque prévue à cause de cette erreur,mais ça vous permet de voircette résolution d'erreur.
00:13:01 :Donc, forcément, plus vous allez coder,plus vous allez avoir des erreursque vous allez déjà avoir vues.Moi, comme je manipule très souventles modèles,le coup du blank et du nullqui ne sont pas forcémenttoujours sétés sur les champset qui font qu'on a cette erreurnot null,