Payment ID: 1L942492VB111070T, Payer ID: FVXL22PYEGX8J Payment not found:
Failed. Response status: 404. Response message: Not Found. Error message:
{"name":"INVALID_RESOURCE_ID","message":"Requested resource ID was not
found.","information_link":"
https://developer.paypal.com/docs/api/payments/#errors","debug_id":"56e42beeb4a02"}
[14/Jul/2024 17:17:05] "GET
/payment-done/?paymentId=1L942492VB111070T&PayerID=FVXL22PYEGX8J HTTP/1.1"
302 0

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CANN1LxORNTPeSN83oafvv6cnTX1gbTKvJQM2kUX9ePKyjaCNZw%40mail.gmail.com.
<script>
        document.addEventListener("DOMContentLoaded", function() {
            const totalAmount = "{{ total|escapejs }}"; // Assurez-vous que 
'total' est passé dans le contexte du template
        
            function setupPayPalButton() {
                paypal.Buttons({
                    createOrder: function(data, actions) {
                        return actions.order.create({
                            purchase_units: [{
                                amount: {
                                    value: totalAmount
                                }
                            }]
                        }).then(function(orderID) {
                            console.log("Order ID: ", orderID);
                            return orderID;
                        });
                    },
                    onApprove: function(data, actions) {
                        return actions.order.capture().then(function(details) {
                            console.log("Order details: ", details);
                            const orderID = data.orderID; // Order ID
                            const payerID = details.payer.payer_id; // Payer ID
        
                            // Redirection vers la vue payment_done avec les 
bons paramètres
                            window.location.href = "{% url 'payment_done' 
%}?paymentId=" + orderID + "&PayerID=" + payerID;
                        });
                    },
                    onError: function(err) {
                        console.error('Erreur lors du paiement PayPal:', err);
                        alert('Erreur lors du paiement PayPal. Veuillez 
réessayer.');
                    }
                }).render('#payment-buttons-container');
            }
        
            function setupCardButton() {
                paypal.Buttons({
                    style: {
                        label: 'pay',
                        layout: 'horizontal',
                        fundingicons: true,
                        tagline: false
                    },
                    createOrder: function(data, actions) {
                        return actions.order.create({
                            purchase_units: [{
                                amount: {
                                    value: totalAmount
                                }
                            }]
                        });
                    },
                    onApprove: function(data, actions) {
                        return actions.order.capture().then(function(details) {
                            alert('Paiement par carte bancaire effectué avec 
succès: ' + details.payer.name.given_name);
                            window.location.href = "{% url 'payment_done' 
%}?paymentId=" + data.orderID + "&PayerID=" + details.payer.payer_id;
                        });
                    },
                    onError: function(err) {
                        console.error('Erreur lors du paiement par carte 
bancaire:', err);
                        alert('Erreur lors du paiement par carte bancaire. 
Veuillez réessayer.');
                    }
                }).render('#payment-buttons-container');
            }
        
            setupPayPalButton();
        });
        </script>
def execute_payment(request):
    payment_id = request.GET.get('paymentId')
    payer_id = request.GET.get('PayerID')

    payment = paypalrestsdk.Payment.find(payment_id)

    if payment.execute({"payer_id": payer_id}):
        return redirect(reverse('payment_done') + 
f'?paymentId={payment_id}&PayerID={payer_id}')
    else:
        return redirect('payment_cancelled')
    
@csrf_exempt
def create_payment(request, panier_id):
    panier = get_object_or_404(Panier, id=panier_id)
    
    payment = paypalrestsdk.Payment({
        "intent": "sale",
        "payer": {
            "payment_method": "paypal"
        },
        "redirect_urls": {
            "return_url": request.build_absolute_uri(reverse('payment_done')),
            "cancel_url": 
request.build_absolute_uri(reverse('payment_cancelled'))
        },
        "transactions": [{
            "item_list": {
                "items": [{
                    "name": "Panier",
                    "sku": "panier",
                    "price": str(panier.get_total()),
                    "currency": "USD",
                    "quantity": 1
                }]
            },
            "amount": {
                "total": str(panier.get_total()),
                "currency": "USD"
            },
            "description": f"Paiement pour le panier {panier.id}"
        }]
    })

    if payment.create():
        for link in payment.links:
            if link.rel == "approval_url":
                approval_url = link.href
                return JsonResponse({'approval_url': approval_url})
    else:
        return JsonResponse({'error': payment.error}, status=500)

def payment_view(request):
    panier = Panier.objects.get(client=request.user)
    total = panier.get_total()
    
    payment = paypalrestsdk.Payment({
        "intent": "sale",
        "payer": {
            "payment_method": "paypal"},
        "redirect_urls": {
            "return_url": request.build_absolute_uri(reverse('payment_done')),
            "cancel_url": 
request.build_absolute_uri(reverse('payment_cancelled'))},
        "transactions": [{
            "item_list": {
                "items": [{
                    "name": "Total Order",
                    "sku": "001",
                    "price": str(total),
                    "currency": "USD",
                    "quantity": 1}]},
            "amount": {
                "total": str(total),
                "currency": "USD"},
            "description": "Payment for order"}]})
    
    if payment.create():
        for link in payment.links:
            if link.method == "REDIRECT":
                redirect_url = link.href
                return redirect(redirect_url)
    else:
        print(payment.error)
        return redirect('payment_cancelled')

@login_required
def payment_done(request):
    payment_id = request.GET.get('paymentId')
    payer_id = request.GET.get('PayerID')

    print(f"Payment ID: {payment_id}, Payer ID: {payer_id}")

    if not payment_id or not payer_id:
        return redirect('payment_cancelled')

    try:
        payment = paypalrestsdk.Payment.find(payment_id)
        print(f"Payment found: {payment}")

        if payment.execute({"payer_id": payer_id}):
            panier = Panier.objects.get(client=request.user, status='en cours')
            panier.Commander = True
            panier.status = 'completé'
            panier.save()
            for commande in panier.commandes.all():
                commande.commander = True
                commande.save()

            adresse_facturation = 
AdresseFacturation.objects.filter(client=request.user).last()

            context = {
                'payment': payment,
                'adresse_facturation': adresse_facturation,
                'commandes': panier.commandes.all(),
                'total': panier.get_total()
            }

            return render(request, 'payment_done.html', context)
        else:
            print("Payment execution failed")
            print(f"Payment error: {payment.error}")
            return redirect('payment_cancelled')
    except paypalrestsdk.ResourceNotFound as error:
        print(f"Payment not found: {error}")
        return redirect('payment_cancelled')
    except Exception as e:
        print(f"Unexpected error: {e}")
        return redirect('payment_cancelled')




def payment_cancelled(request):
    return render(request, 'e_commerce/payment_cancelled.html')
class Commande(models.Model):
    """
    Modèle représentant une commande passée par un utilisateur.
    """
    client = models.ForeignKey(Client, on_delete=models.CASCADE, null=True, 
blank=True)
    visitor_id = models.CharField(max_length=36, null=True, blank=True)
    produit = models.ForeignKey(Produit, on_delete=models.CASCADE)
    quantite = models.IntegerField(default=1)
    sous_total = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    taille = models.CharField(max_length=20, choices=Produit.CHOIX_TAILLE, 
null=True, blank=True)
    couleurs = models.ForeignKey(Couleur, on_delete=models.SET_NULL, 
related_name='commandes', blank=True, null=True)
    commander = models.BooleanField(default=False)
    created_de_creation = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self) -> str:
        return f'{self.produit.nom} ({self.quantite})'

    def save(self, *args, **kwargs):
        self.sous_total = self.produit.prix * self.quantite
        super().save(*args, **kwargs)

class AdresseFacturation(models.Model):
    client = models.ForeignKey(Client, on_delete=models.SET_NULL, blank=True, 
null=True)
    commande = models.ForeignKey(Commande, on_delete=models.SET_NULL, 
blank=True, null=True)
    addresse = models.CharField(max_length=100, null=True)
    ville = models.CharField(max_length=100, null=True)
    zipcode = models.CharField(max_length=100, null=True)
    date_ajout =  models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.addresse

class Panier(models.Model):
    """
    Modèle représentant le panier d'un utilisateur.
    """
    STATUS_CHOICES = [
        ('en cours', 'En cours'),
        ('completé', 'Completé'),
        ('annulé', 'Annulé'),
    ]

    visitor_id = models.CharField(max_length=36, null=True, blank=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE, null=True, 
blank=True)
    commandes = models.ManyToManyField(Commande)
    total = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    Commander = models.BooleanField(default=False)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, 
default='en cours')
    created_de_creation = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        if self.client:
            return f"{self.client.nom} Panier"
        else:
            return f"Panier {self.visitor_id}"
        
    def get_total(self):
        total = sum(commande.sous_total for commande in self.commandes.all())
        return total

Reply via email to