Erreur de valeur nulle pour 'customer'
Hello dans lenvironnement de test je retrouve une erreur, car customer est toujours égal à null. Est ce normal? Merci
Salut,
Est-ce que tu pourrais donner un peu plus de précision ?
Tu veux dire que le stripe_id du customer est vide pour ton user django ?
Tu peux me montrer ton code ? On peut régler ça assez vite :)
Vérifications :
-
Ton stripe listen forward est-il bien activé et en success ?
-
Prépare bien ton checkout
def create_checkout_session(request):
# récupère le panier
cart = request.user.cart
# compréhension de liste avec un dictionnaire (id + qté)
line_items = [{"price": order.product.stripe_id,
"quantity": order.quantity} for order in cart.orders.all()]
checkout_data = {
"locale": "fr",
"line_items": line_items,
"mode": 'payment',
# voir ds la doc. On passe un dico avec une liste de pays autorisés
"shipping_address_collection": {"allowed_countries": ["FR", "BE"]},
# il faut une url absolue car je suis sur Stripe à ce moment-là
"success_url": request.build_absolute_uri(reverse('store:checkout-success')),
"cancel_url": 'http://127.0.0.1:8000',
}
# une condition pour savoir si on a déjà un stripe_id pour notre user
if request.user.stripe_id:
checkout_data["customer"] = request.user.stripe_id
else:
checkout_data["customer_email"] = request.user.email
# créer le client dans stripe la première fois
checkout_data["customer_creation"] = "always"
# tout ce que j'avais ici je l'ai passé à checkout_data en dictionnaire
# on va utiliser l'unpacking
session = stripe.checkout.Session.create(**checkout_data)
return redirect(session.url, code=303)
@csrf_exempt
def stripe_webhook(request):
payload = request.body
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
endpoint_secret = env("endpoint_secret")
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)
# on veut récupérer l'évènement checkout.session.completed, il s'agit d'un dico
if event['type'] == "checkout.session.completed":
# dans event on a un objet qui permet de récup mail user produits acheté etc ds data object
data = event['data']['object']
pprint(data)
try:
user = get_object_or_404(Shopper, email=data['customer_details']['email'])
# dans object (voir var data) on a l'email
except KeyError:
return HttpResponse("Invalid user email", status=404)
# deux fonctions du dessous
complete_order(data=data, user=user)
save_shipping_adress(data=data, user=user)
return HttpResponse(status=200)
# Passed signature verification
return HttpResponse(status=200)
# pas de requête ici on créer une fonction qui sera retournée dans la vue stripe_webhook
def complete_order(data, user):
user.stripe_id = data['customer']
user.cart.order_ok()
# faire un save pour le stripe_id
user.save()
# 200 pour indiquer que le paiement a été procéssé correctement
return HttpResponse(status=200)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte