Résolue

Le stripe_id ne fonctionne pas..

# Stripe # Django

j'ai cette erreur

django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_shopper.stripe_id
[06/Feb/2024 23:07:50] "POST /stripe-webhook/ HTTP/1.1" 500 178178.

de ce que je comprends chaque client doit avoir un stripe_id comme on peut le voir ici

class Shopper(AbstractUser):
username = None
email = models.EmailField(max_length=240, unique=True)
stripe_id = models.CharField(max_length=90, blank=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomeUserManager()

le probleme ici est que le serveur n'arrive pas a recuperer le strip id. le stripe id est un identifiant cree par Stripe lors de la creation d'un nouveau client ce qui veut dire que je dois cree un nouveau client sur la db et ensuite creer un client sur Sprite , avec l'identifiant disponible , je le met sur la db avec localhost/admin en remplissant "stripe_id" sur le nouveau client cree . j'ai fais tout cela mais donc avec cette erreur j'ai l'impression d'avoir mal fait quelque chose . je met en plus mes 2 fonctions du webhook (qui sont exactement pareil que sur la video)

@csrf_exempt
def stripe_webhook(request):
payload = request.body
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
endpoint_secret = "" #bien sur ce n est pas vide
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)

# Handle the checkout.session.completed event
if event['type'] == 'checkout.session.completed':
    data = event['data']['object']
    pprint(data)
    try:
        user = get_object_or_404(Shopper, email=data["customer_details"]["email"])
    except KeyError:
        return HttpResponse("Invalid email user", status=404)

    complete_order(data=data, user=user)
    save_shipping_address(data=data, user=user)

    return HttpResponse(status=200)

    # send_mail(
    #     subject="Here is your product",
    #     message=f"Thanks for your purchase. Here is the product you ordered. ",
    #     recipient_list=[customer_email],
    #     from_email="[email protected]"
    # )

return HttpResponse(status=200)

Thibault houdon

Mentor

Salut :)

L'erreur que tu as (django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_shopper.stripe_id) signifie que Django essaye d'enregistrer un objet Shopper dans la base de données sans un stripe_id, alors que ce champ n'est pas défini comme pouvant être NULL (donc None en Python).

Dans la définition de ton modèle, tu as mis stripe_id = models.CharField(max_length=90, blank=True). Ça veut dire que ton champ stripe_id n'est pas obligatoire lors de la création d'une instance. Par défaut les valeurs nulles des champs CharField sont stockés comme des chaînes vides.

Je ne vois pas dans le code que tu as partagé l'endroit où tu crées le Shopper. Mais mon intuition c'est que tu essaies de mettre l'objet None dans le stripe_id, ce qui cause cette erreur.

Parce que si tu souhaites mettre None dans un champ CharField, il faut que tu spécifies null=True également (ce qu'on évite de faire pour les champs CharField).

Il faudrait que je vois ton code dans lequel tu crées le Shopper du coup, est-ce que si le stripe_id n'existe pas dans le webhook tu fais quelque chose du genre :

event.get("stripe_id", None)

Si oui, tu pourrais remplacer par event.get("stripe_id", "")

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.