from django.shortcuts import render, redirect from django.contrib import messages from django.contrib.auth.decorators import login_required from django.conf import settings import paypalrestsdk from .models import PayPalConfig from products.models import Order def setup_paypal(): config = PayPalConfig.objects.first() if config: paypalrestsdk.configure({ "mode": "sandbox" if config.is_sandbox else "live", "client_id": config.client_id, "client_secret": config.client_secret }) return True return False @login_required def process_payment(request, order_id): if not setup_paypal(): messages.error(request, 'PayPal ist nicht richtig konfiguriert. Bitte kontaktieren Sie den Administrator.') return redirect('order_detail', order_id=order_id) try: order = Order.objects.get(id=order_id, user=request.user) payment = paypalrestsdk.Payment({ "intent": "sale", "payer": { "payment_method": "paypal" }, "redirect_urls": { "return_url": request.build_absolute_uri(f'/paypal/execute/{order_id}/'), "cancel_url": request.build_absolute_uri(f'/paypal/cancel/{order_id}/') }, "transactions": [{ "amount": { "total": str(order.total_amount), "currency": "EUR" }, "description": f"Bestellung #{order.id}" }] }) if payment.create(): for link in payment.links: if link.method == "REDIRECT": return redirect(link.href) else: messages.error(request, 'Fehler bei der Erstellung der PayPal-Zahlung.') except Order.DoesNotExist: messages.error(request, 'Bestellung nicht gefunden.') except Exception as e: messages.error(request, f'Ein Fehler ist aufgetreten: {str(e)}') return redirect('order_detail', order_id=order_id) @login_required def execute_payment(request, order_id): payment_id = request.GET.get('paymentId') payer_id = request.GET.get('PayerID') try: payment = paypalrestsdk.Payment.find(payment_id) if payment.execute({"payer_id": payer_id}): order = Order.objects.get(id=order_id, user=request.user) order.status = 'paid' order.payment_method = 'paypal' order.payment_id = payment_id order.save() messages.success(request, 'Zahlung erfolgreich durchgeführt!') return redirect('payment_success', order_id=order_id) else: messages.error(request, 'Fehler bei der Ausführung der Zahlung.') except Exception as e: messages.error(request, f'Ein Fehler ist aufgetreten: {str(e)}') return redirect('payment_failed', order_id=order_id) @login_required def cancel_payment(request, order_id): messages.info(request, 'Die PayPal-Zahlung wurde abgebrochen.') return redirect('order_detail', order_id=order_id)