diff --git a/djadyen/constants.py b/djadyen/constants.py new file mode 100644 index 0000000..b326941 --- /dev/null +++ b/djadyen/constants.py @@ -0,0 +1,2 @@ +LIVE_URL_PREFIX_ERROR = "Please provide the live_url_prefix. " +"https://docs.adyen.com/development-resources/live-endpoints#live-url-prefix" diff --git a/djadyen/management/commands/sync_payment_methods.py b/djadyen/management/commands/sync_payment_methods.py index 891f3d3..413cbe0 100644 --- a/djadyen/management/commands/sync_payment_methods.py +++ b/djadyen/management/commands/sync_payment_methods.py @@ -4,6 +4,7 @@ from djadyen import settings +from ...constants import LIVE_URL_PREFIX_ERROR from ...models import AdyenIssuer, AdyenPaymentOption @@ -38,17 +39,27 @@ class Command(BaseCommand): def handle(self, *args, **options): ady = Adyen.Adyen() + if not settings.DJADYEN_ENVIRONMENT: + assert False, "Please provide an environment." + + if ( + settings.DJADYEN_ENVIRONMENT == "live" + and not settings.DJADYEN_LIVE_URL_PREFIX + ): + assert False, LIVE_URL_PREFIX_ERROR + # Setting global values ady.payment.client.platform = settings.DJADYEN_ENVIRONMENT ady.payment.client.xapikey = settings.DJADYEN_SERVER_KEY ady.payment.client.app_name = settings.DJADYEN_APPNAME + ady.payment.client.live_endpoint_prefix = settings.DJADYEN_LIVE_URL_PREFIX # Setting request data. request = { "merchantAccount": settings.DJADYEN_MERCHANT_ACCOUNT, } # Starting the checkout. - result = ady.checkout.payment_methods(request) + result = ady.checkout.payments_api.payment_methods(request) payment_methods = result.message.get("paymentMethods") for payment_method in payment_methods: diff --git a/djadyen/settings.py b/djadyen/settings.py index c2ecc3a..eab0e8f 100644 --- a/djadyen/settings.py +++ b/djadyen/settings.py @@ -2,7 +2,7 @@ DJADYEN_SERVER_KEY = getattr(dj_settings, "DJADYEN_SERVER_KEY") DJADYEN_CLIENT_KEY = getattr(dj_settings, "DJADYEN_CLIENT_KEY") -DJADYEN_ENVIRONMENT = getattr(dj_settings, "DJADYEN_ENVIRONMENT", "test") +DJADYEN_ENVIRONMENT = getattr(dj_settings, "DJADYEN_ENVIRONMENT") DJADYEN_APPNAME = getattr(dj_settings, "DJADYEN_APPNAME", "Djadyen Payment") DJADYEN_MERCHANT_ACCOUNT = getattr(dj_settings, "DJADYEN_MERCHANT_ACCOUNT") DJADYEN_CURRENCYCODE = getattr(dj_settings, "DJADYEN_CURRENCYCODE", "EUR") @@ -15,3 +15,4 @@ DJADYEN_DEFAULT_COUNTRY_CODE = getattr( dj_settings, "DJADYEN_DEFAULT_COUNTRY_CODE", "nl" ) +DJADYEN_LIVE_URL_PREFIX = getattr(dj_settings, "DJADYEN_LIVE_URL_PREFIX", None) diff --git a/djadyen/templatetags/adyen_tags.py b/djadyen/templatetags/adyen_tags.py index 97967ec..ad9e07d 100644 --- a/djadyen/templatetags/adyen_tags.py +++ b/djadyen/templatetags/adyen_tags.py @@ -1,4 +1,5 @@ import logging + from django import template from django.utils.translation import get_language @@ -6,6 +7,7 @@ from djadyen import settings from djadyen.choices import Status +from djadyen.constants import LIVE_URL_PREFIX_ERROR register = template.Library() logger = logging.getLogger("adyen") @@ -24,10 +26,18 @@ def adyen_payment_component( logger.info("Start new payment for {}".format(str(order.reference))) ady = Adyen.Adyen() + if not settings.DJADYEN_ENVIRONMENT: + assert False, "Please provide an environment." + + if settings.DJADYEN_ENVIRONMENT == "live" and not settings.DJADYEN_LIVE_URL_PREFIX: + assert False, LIVE_URL_PREFIX_ERROR + # Setting global values ady.payment.client.platform = settings.DJADYEN_ENVIRONMENT ady.payment.client.xapikey = settings.DJADYEN_SERVER_KEY ady.payment.client.app_name = settings.DJADYEN_APPNAME + ady.payment.client.live_endpoint_prefix = settings.DJADYEN_LIVE_URL_PREFIX + # Setting request data. request = { "amount": { @@ -38,13 +48,20 @@ def adyen_payment_component( "merchantAccount": merchant_account, "returnUrl": order.get_return_url(), "shopperLocale": language.lower(), - "countryCode": country_code.lower() - if country_code - else settings.DJADYEN_DEFAULT_COUNTRY_CODE, + "countryCode": ( + country_code.lower() + if country_code + else settings.DJADYEN_DEFAULT_COUNTRY_CODE + ), } + try: + request["shopperEmail"] = order.email + except Exception: + pass + logger.info(request) # Starting the checkout. - result = ady.checkout.sessions(request) + result = ady.checkout.payments_api.sessions(request) if result.status_code == 201: return { @@ -54,9 +71,9 @@ def adyen_payment_component( "environment": settings.DJADYEN_ENVIRONMENT, "redirect_url": order.get_return_url, "language": get_language(), - "payment_type": order.payment_option.adyen_name - if order.payment_option - else "", + "payment_type": ( + order.payment_option.adyen_name if order.payment_option else "" + ), "issuer": order.issuer.adyen_id if order.issuer else "", } return {} diff --git a/djadyen/views.py b/djadyen/views.py index 7d2ad7b..ab1762d 100644 --- a/djadyen/views.py +++ b/djadyen/views.py @@ -1,12 +1,13 @@ import logging -from django.http import JsonResponse, HttpResponseRedirect +from django.http import HttpResponseRedirect, JsonResponse from django.views.generic.detail import DetailView import Adyen from djadyen import settings from djadyen.choices import Status +from djadyen.constants import LIVE_URL_PREFIX_ERROR logger = logging.getLogger("adyen") @@ -41,10 +42,22 @@ def get(self, request, *args, **kwargs): resultRedirect = request.GET.get("redirectResult") if resultRedirect: ady = Adyen.Adyen() + + if not settings.DJADYEN_ENVIRONMENT: + assert False, "Please provide an environment." + + if ( + settings.DJADYEN_ENVIRONMENT == "live" + and not settings.DJADYEN_LIVE_URL_PREFIX + ): + assert False, LIVE_URL_PREFIX_ERROR + # Setting global values ady.payment.client.platform = settings.DJADYEN_ENVIRONMENT ady.payment.client.xapikey = settings.DJADYEN_SERVER_KEY ady.payment.client.app_name = settings.DJADYEN_APPNAME + ady.payment.client.live_endpoint_prefix = settings.DJADYEN_LIVE_URL_PREFIX + # Setting request data. request = { "details": { @@ -52,14 +65,21 @@ def get(self, request, *args, **kwargs): }, } # Requesting the status. - result = ady.checkout.payments_details(request) - if result.message.get("resultCode") == "Authorised": + result = ady.checkout.payments_api.payments_details(request) + result_code = result.message.get("resultCode") + if result_code == "Authorised": self.handle_authorised(self.object) + elif result_code != "Pending": + self.handle_error(self.object) return super(AdyenResponseView, self).get(request, *args, **kwargs) def handle_authorised(self, order): raise NotImplementedError() + def handle_error(self, order): + order.status = Status.Error + order.save() + class AdyenOrderStatusView(DetailView): slug_field = "reference" diff --git a/javascript/djadyen.js b/javascript/djadyen.js index 93ff341..b4c353c 100644 --- a/javascript/djadyen.js +++ b/javascript/djadyen.js @@ -20,10 +20,6 @@ document.addEventListener("DOMContentLoaded", async () => { sessionData: config.dataset.sessionData, }, onPaymentCompleted: (result) => { - console.log("onPaymentCompleted", "result", result); - console.log("onPaymentCompleted", "checkout", checkout); - console.log("onPaymentCompleted", "component", component); - window.location = config.dataset.redirectUrl; }, onError: (error, component) => { diff --git a/setup.cfg b/setup.cfg index 7875cf8..bbc80cf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,7 @@ # see http://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files [metadata] name = djadyen -version = 2.0.4 +version = 2.0.6 description = Django adyen payment integration long_description = file: README.rst url = https://github.com/maykinmedia/djadyen @@ -31,7 +31,7 @@ zip_safe = False include_package_data = True packages = find: install_requires = - Adyen>=6.0.0<7.0.0 + Adyen>=10.0.0 django>=1.10 django-choices requests diff --git a/testapp/settings.py b/testapp/settings.py index d551c76..d0e9a91 100644 --- a/testapp/settings.py +++ b/testapp/settings.py @@ -69,9 +69,12 @@ ] # New settings +DJADYEN_ENVIRONMENT = "test" DJADYEN_SERVER_KEY = "test_server_key" DJADYEN_CLIENT_KEY = "test_client_key" DJADYEN_APPNAME = "Djadyen testapp" DJADYEN_MERCHANT_ACCOUNT = "Djadyen_merchant_account" DJADYEN_ORDER_MODELS = ["testapp.Order"] -DJADYEN_NOTIFICATION_KEY = "3424242342353453422435626342654643645624564526436435643542364365" +DJADYEN_NOTIFICATION_KEY = ( + "3424242342353453422435626342654643645624564526436435643542364365" +) diff --git a/testapp/urls.py b/testapp/urls.py index fb0ee96..782959b 100644 --- a/testapp/urls.py +++ b/testapp/urls.py @@ -1,5 +1,5 @@ try: - from django.urls import path, include + from django.urls import include, path except Exception: from django.conf.urls import url as path, include diff --git a/testapp/views.py b/testapp/views.py index 9966c5e..323b7da 100644 --- a/testapp/views.py +++ b/testapp/views.py @@ -1,5 +1,3 @@ -from django.views.generic import TemplateView - from djadyen.choices import Status from djadyen.views import AdyenResponseView diff --git a/tests/factories.py b/tests/factories.py index 1075548..d4baa90 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -2,7 +2,6 @@ from djadyen.choices import Status from djadyen.models import AdyenIssuer, AdyenNotification, AdyenPaymentOption - from testapp.models import Order diff --git a/tests/test_management_command.py b/tests/test_management_command.py index c243ae4..ad4100f 100644 --- a/tests/test_management_command.py +++ b/tests/test_management_command.py @@ -20,7 +20,7 @@ class SyncPaymentMethods(TestFileMixin, TestCase): @requests_mock.mock() def test_on_empty_database_mock(self, mock): mock.post( - "https://checkout-test.adyen.com/v69/paymentMethods", + "https://checkout-test.adyen.com/v71/paymentMethods", [ { "content": self._get_test_file("payment_methods.json").read(), @@ -37,7 +37,7 @@ def test_on_empty_database_mock(self, mock): @requests_mock.mock() def test_on_existing_database_mock(self, mock): mock.post( - "https://checkout-test.adyen.com/v69/paymentMethods", + "https://checkout-test.adyen.com/v71/paymentMethods", [ { "content": self._get_test_file("payment_methods.json").read(), diff --git a/tests/test_notification_views.py b/tests/test_notification_views.py index fcf3917..13ae949 100644 --- a/tests/test_notification_views.py +++ b/tests/test_notification_views.py @@ -1,4 +1,5 @@ import json + from django.urls import reverse from django_webtest import WebTest