87 lines
3.1 KiB
Python
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) |