diff --git a/myproject/myapp/payments.py b/myproject/myapp/payments.py index 8a0e543c19f36c1327352dd859ebbffd1d1517d5..b103fa59dfa3c8b737d37a947fe3ea9fa958463d 100644 --- a/myproject/myapp/payments.py +++ b/myproject/myapp/payments.py @@ -3,10 +3,14 @@ from django.conf import settings from django.http import JsonResponse from django.shortcuts import redirect, render from django.urls import reverse +from django.shortcuts import redirect, render +from django.urls import reverse +# Create a payment that can be made via the PayPal API # Create a payment that can be made via the PayPal API def create_payment(request): + # Configure PayPal SDK paypalrestsdk.configure({ "mode": settings.PAYPAL_MODE, @@ -23,6 +27,8 @@ def create_payment(request): "redirect_urls": { "return_url": request.build_absolute_uri(reverse('execute_payment')), "cancel_url": request.build_absolute_uri(reverse('payment_cancelled')), + "return_url": request.build_absolute_uri(reverse('execute_payment')), + "cancel_url": request.build_absolute_uri(reverse('payment_cancelled')), }, "transactions" : [{ "item_list" : { @@ -104,15 +110,58 @@ def payment_success(request): ======= if payment.create(): print("Payment created successfully!") + # get url for payment approval for link in payment.links: if link.rel == "approval_url": + # turn link into text approval_url = str(link.href) - print("Redirect for approval: %s" % (approval_url)) - return JsonResponse({"approval_url": approval_url}) + # send on merry way + return redirect(approval_url) else: print(payment.error) - return JsonResponse({"error": "Payment creation failed"}) + +# Execute a successful payment def execute_payment(request): - pass ->>>>>>> d6d607c (Add create_payment) + # Get payment id and payer id + payment_id = request.GET.get('paymentId') + payer_id = request.GET.get('PayerID') + + #If neither ID, error, restart + if not payment_id or not payer_id: + print("no payment") + #TODO: Change this to a more appropriate path, maybe a generic error page that takes a string:Error to display in a template + return redirect('handler404') + + # configure API + paypalrestsdk.configure({ + "mode": settings.PAYPAL_MODE, + "client_id": settings.PAYPAL_CLIENT_ID, + "client_secret": settings.PAYPAL_CLIENT_SECRET + }) + + # Check we've got a successful payment + payment = paypalrestsdk.Payment.find(payment_id) + + # If it we do an the payer IDs match + if payment.execute({"payer_id": payer_id}): + print("Payment executed successfully!") + + # Allocate some tokens + user = request.user + tokens_purchased = 1 + + # increment user_tokens + # commit changes + + return redirect('success') + else: + #TODO: Change this to a more appropriate error message + print("exiting at the end of execute_payment()") + return redirect('handler404') + +def payment_cancelled(request): + return render(request, 'payment_cancelled.html') + +def payment_success(request): + return render(request,'payment_success.html') \ No newline at end of file diff --git a/myproject/myapp/urls.py b/myproject/myapp/urls.py index a71097f41cc2683adbc9d11b0fe64c0a514136f0..9e02e7020377f1738a53840a86e3b00692240a26 100644 --- a/myproject/myapp/urls.py +++ b/myproject/myapp/urls.py @@ -5,7 +5,6 @@ from .views import InstrumentDetectionView, index, users, maintenance, handler40 ======= from .views import InstrumentDetectionView, index, users, maintenance, handler404, handler500, register, user_login, terms_conditions, privacy_policy, handling_music_file, pricing, generate_pdf, admin_table from .payments import create_payment, execute_payment, payment_cancelled, payment_success ->>>>>>> 7991a04 (Add PayPal integration- need to link in new model for usertokens) from django.contrib.auth import views as auth_views # Authentication @@ -31,7 +30,11 @@ urlpatterns = [ path('instrument_detection/', InstrumentDetectionView.as_view(), name='instrument_detection'), path('password_change/', auth_views.PasswordChangeView.as_view(template_name='password_change_form.html'), name='password_change'), path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='password_change_done.html'), name='password_change_done'), - # path('user_logout/', auth_views.LogoutView.as_view(next_page='index'), name='user_logout') + # path('user_logout/', auth_views.LogoutView.as_view(next_page='index'), name='user_logout'), + path('payment/create/', create_payment, name='create_payment'), + path('payment/execute/', execute_payment, name='execute_payment'), + path('payment/cancel/', payment_cancelled, name='payment_cancelled'), + path('payment_success/', payment_success, name='success') # Authentication path('login/', CustomLoginView.as_view(), name='login'),