furry/paypal_integration/views.py

87 lines
3.1 KiB
Python

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)