Résolue

Erreur de valeur nulle pour 'customer'

# Résolution d'erreurs

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 !)

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.