diff --git a/addons/payment_adyen/controllers/main.py b/addons/payment_adyen/controllers/main.py index 535b0b1e42a..ddc4f008474 100644 --- a/addons/payment_adyen/controllers/main.py +++ b/addons/payment_adyen/controllers/main.py @@ -59,10 +59,7 @@ class AdyenController(http.Controller): 'channel': 'Web', } response_content = provider_sudo._adyen_make_request( - url_field_name='adyen_checkout_api_url', - endpoint='/paymentMethods', - payload=data, - method='POST' + endpoint='/paymentMethods', payload=data, method='POST' ) _logger.info("paymentMethods request response:\n%s", pprint.pformat(response_content)) return response_content @@ -139,10 +136,7 @@ class AdyenController(http.Controller): # Make the payment request to Adyen response_content = provider_sudo._adyen_make_request( - url_field_name='adyen_checkout_api_url', - endpoint='/payments', - payload=data, - method='POST' + endpoint='/payments', payload=data, method='POST' ) # Handle the payment request response @@ -171,10 +165,7 @@ class AdyenController(http.Controller): # Make the payment details request to Adyen provider_sudo = request.env['payment.provider'].browse(provider_id).sudo() response_content = provider_sudo._adyen_make_request( - url_field_name='adyen_checkout_api_url', - endpoint='/payments/details', - payload=payment_details, - method='POST' + endpoint='/payments/details', payload=payment_details, method='POST' ) # Handle the payment details request response diff --git a/addons/payment_adyen/models/payment_provider.py b/addons/payment_adyen/models/payment_provider.py index 15f94ccbd3b..b788b8509d5 100644 --- a/addons/payment_adyen/models/payment_provider.py +++ b/addons/payment_adyen/models/payment_provider.py @@ -31,35 +31,35 @@ class PaymentProvider(models.Model): adyen_hmac_key = fields.Char( string="HMAC Key", help="The HMAC key of the webhook", required_if_provider='adyen', groups='base.group_system') - adyen_checkout_api_url = fields.Char( - string="Checkout API URL", help="The base URL for the Checkout API endpoints", - required_if_provider='adyen') - adyen_recurring_api_url = fields.Char( - string="Recurring API URL", help="The base URL for the Recurring API endpoints", - required_if_provider='adyen') + adyen_api_url_prefix = fields.Char( + string="API URL Prefix", + help="The base URL for the API endpoints", + required_if_provider='adyen', + ) #=== CRUD METHODS ===# @api.model_create_multi def create(self, values_list): for values in values_list: - self._adyen_trim_api_urls(values) + self._adyen_extract_prefix_from_api_url(values) return super().create(values_list) def write(self, values): - self._adyen_trim_api_urls(values) + self._adyen_extract_prefix_from_api_url(values) return super().write(values) @api.model - def _adyen_trim_api_urls(self, values): - """ Remove the version and the endpoint from the url of Adyen API fields. + def _adyen_extract_prefix_from_api_url(self, values): + """ Update the create or write values with the prefix extracted from the API URL. - :param dict values: The create or write values + :param dict values: The create or write values. :return: None """ - for field_name in ('adyen_checkout_api_url', 'adyen_recurring_api_url'): - if values.get(field_name): # Test the value in case we're duplicating a provider - values[field_name] = re.sub(r'[vV]\d+(/.*)?', '', values[field_name]) + if values.get('adyen_api_url_prefix'): # Test if we're duplicating a provider. + values['adyen_api_url_prefix'] = re.sub( + r'(?:https://)?(\w+-\w+).*', r'\1', values['adyen_api_url_prefix'] + ) #=== COMPUTE METHODS ===# @@ -74,14 +74,11 @@ class PaymentProvider(models.Model): #=== BUSINESS METHODS - PAYMENT FLOW ===# - def _adyen_make_request( - self, url_field_name, endpoint, endpoint_param=None, payload=None, method='POST' - ): + def _adyen_make_request(self, endpoint, endpoint_param=None, payload=None, method='POST'): """ Make a request to Adyen API at the specified endpoint. Note: self.ensure_one() - :param str url_field_name: The name of the field holding the base URL for the request :param str endpoint: The endpoint to be reached by the request :param str endpoint_param: A variable required by some endpoints which are interpolated with it if provided. For example, the provider reference of the source @@ -93,27 +90,28 @@ class PaymentProvider(models.Model): :raise: ValidationError if an HTTP error occurs """ - def _build_url(_base_url, _version, _endpoint): + def _build_url(prefix_, version_, endpoint_): """ Build an API URL by appending the version and endpoint to a base URL. The final URL follows this pattern: `<_base>/V<_version>/<_endpoint>`. - :param str _base_url: The base of the url prefixed with `https://` - :param int _version: The version of the endpoint - :param str _endpoint: The endpoint of the URL. - :return: The final URL + :param str prefix_: The API URL prefix of the account. + :param int version_: The version of the endpoint. + :param str endpoint_: The endpoint of the URL. + :return: The final URL. :rtype: str """ - _base = _base_url.rstrip('/') # Remove potential trailing slash - _endpoint = _endpoint.lstrip('/') # Remove potential leading slash - return f'{_base}/V{_version}/{_endpoint}' + prefix_ = prefix_.rstrip('/') # Remove potential trailing slash + endpoint_ = endpoint_.lstrip('/') # Remove potential leading slash + test_mode_ = self.state == 'test' + prefix_ = f'{prefix_}.adyen' if test_mode_ else f'{prefix_}-checkout-live.adyenpayments' + return f'https://{prefix_}.com/checkout/V{version_}/{endpoint_}' self.ensure_one() - base_url = self[url_field_name] # Restrict request URL to the stored API URL fields version = const.API_ENDPOINT_VERSIONS[endpoint] endpoint = endpoint if not endpoint_param else endpoint.format(endpoint_param) - url = _build_url(base_url, version, endpoint) + url = _build_url(self.adyen_api_url_prefix, version, endpoint) headers = {'X-API-Key': self.adyen_api_key} try: response = requests.request(method, url, json=payload, headers=headers, timeout=60) diff --git a/addons/payment_adyen/models/payment_transaction.py b/addons/payment_adyen/models/payment_transaction.py index 9cedd253d8e..15360240671 100644 --- a/addons/payment_adyen/models/payment_transaction.py +++ b/addons/payment_adyen/models/payment_transaction.py @@ -96,10 +96,7 @@ class PaymentTransaction(models.Model): # Make the payment request to Adyen try: response_content = self.provider_id._adyen_make_request( - url_field_name='adyen_checkout_api_url', - endpoint='/payments', - payload=data, - method='POST', + endpoint='/payments', payload=data, method='POST' ) except ValidationError as e: if self.operation == 'offline': @@ -143,7 +140,6 @@ class PaymentTransaction(models.Model): 'reference': refund_tx.reference, } response_content = refund_tx.provider_id._adyen_make_request( - url_field_name='adyen_checkout_api_url', endpoint='/payments/{}/refunds', endpoint_param=self.provider_reference, payload=data, @@ -183,7 +179,6 @@ class PaymentTransaction(models.Model): 'reference': self.reference, } response_content = self.provider_id._adyen_make_request( - url_field_name='adyen_checkout_api_url', endpoint='/payments/{}/captures', endpoint_param=self.provider_reference, payload=data, @@ -219,7 +214,6 @@ class PaymentTransaction(models.Model): 'reference': self.reference, } response_content = self.provider_id._adyen_make_request( - url_field_name='adyen_checkout_api_url', endpoint='/payments/{}/cancels', endpoint_param=self.provider_reference, payload=data, diff --git a/addons/payment_adyen/tests/common.py b/addons/payment_adyen/tests/common.py index 6704ba7cd08..4e671f8d3b8 100644 --- a/addons/payment_adyen/tests/common.py +++ b/addons/payment_adyen/tests/common.py @@ -14,8 +14,7 @@ class AdyenCommon(PaymentCommon): 'adyen_api_key': 'dummy', 'adyen_client_key': 'dummy', 'adyen_hmac_key': '12345678', - 'adyen_checkout_api_url': 'https://this.is.an.url', - 'adyen_recurring_api_url': 'https://this.is.an.url', + 'adyen_api_url_prefix': 'prefix', }) # Override default values diff --git a/addons/payment_adyen/views/payment_provider_views.xml b/addons/payment_adyen/views/payment_provider_views.xml index fb63dc8c613..decb1257c8d 100644 --- a/addons/payment_adyen/views/payment_provider_views.xml +++ b/addons/payment_adyen/views/payment_provider_views.xml @@ -12,8 +12,7 @@ - - +