diff --git a/addons/payment_razorpay/models/payment_transaction.py b/addons/payment_razorpay/models/payment_transaction.py index 2ec0b3ca9402b..5cdc7ee548299 100644 --- a/addons/payment_razorpay/models/payment_transaction.py +++ b/addons/payment_razorpay/models/payment_transaction.py @@ -34,8 +34,10 @@ def _get_specific_processing_values(self, processing_values): if self.provider_code != 'razorpay': return res - customer_is_required = self.tokenize or self.operation in ('online_token', 'offline') - customer_id = customer_is_required and self._razorpay_create_customer()['id'] + if self.operation in ('online_token', 'offline'): + return {} + + customer_id = self._razorpay_create_customer()['id'] order_id = self._razorpay_create_order(customer_id)['id'] return { 'razorpay_key_id': self.provider_id.razorpay_key_id, @@ -53,7 +55,7 @@ def _razorpay_create_customer(self): payload = { 'name': self.partner_name, 'email': self.partner_email, - 'contact': self._validate_phone_number(self.partner_phone), + 'contact': self.partner_phone and self._validate_phone_number(self.partner_phone) or '', 'fail_existing': '0', # Don't throw an error if the customer already exists. } _logger.info( @@ -75,12 +77,12 @@ def _validate_phone_number(self, phone): :return str: The formatted phone number. :raise ValidationError: If the phone number is missing or incorrect. """ - if not phone: + if not phone and self.tokenize: raise ValidationError("Razorpay: " + _("The phone number is missing.")) try: phone = self._phone_format( - number=phone, country=self.partner_country_id, raise_exception=True + number=phone, country=self.partner_country_id, raise_exception=self.tokenize ) except Exception: raise ValidationError("Razorpay: " + _("The phone number is invalid.")) @@ -122,8 +124,7 @@ def _razorpay_prepare_order_payload(self, customer_id=None): **({'method': pm_code} if pm_code != 'wallets_india' else {}), } if self.operation in ['online_direct', 'validation']: - if customer_id: - payload['customer_id'] = customer_id # Required for only non-subsequent payments. + payload['customer_id'] = customer_id # Required for only non-subsequent payments. if self.tokenize: payload['token'] = { 'max_amount': payment_utils.to_minor_currency_units( @@ -404,7 +405,7 @@ def _process_notification_data(self, notification_data): if self.provider_id.capture_manually: self._set_authorized() elif entity_status in const.PAYMENT_STATUS_MAPPING['done']: - if self.tokenize: + if entity_data.get('token_id') and self.provider_id.allow_tokenization: self._razorpay_tokenize_from_notification_data(notification_data) self._set_done() diff --git a/addons/payment_razorpay/static/src/js/payment_form.js b/addons/payment_razorpay/static/src/js/payment_form.js index 6f1e625533844..5b55c938e1330 100644 --- a/addons/payment_razorpay/static/src/js/payment_form.js +++ b/addons/payment_razorpay/static/src/js/payment_form.js @@ -58,8 +58,9 @@ paymentForm.include({ * @return {object} */ _prepareRazorpayOptions(processingValues) { - const vals = Object.assign({}, processingValues, { + return Object.assign({}, processingValues, { 'key': processingValues['razorpay_key_id'], + 'customer_id': processingValues['razorpay_customer_id'], 'order_id': processingValues['razorpay_order_id'], 'description': processingValues['reference'], 'recurring': processingValues['is_tokenize_request'] ? '1': '0', @@ -78,10 +79,6 @@ paymentForm.include({ } }, }); - if (processingValues['razorpay_customer_id']) { - vals['customer_id'] = processingValues['razorpay_customer_id']; - } - return vals; }, }); diff --git a/addons/payment_razorpay/tests/common.py b/addons/payment_razorpay/tests/common.py index 4be7dcb86fe2e..071fcb39d60cf 100644 --- a/addons/payment_razorpay/tests/common.py +++ b/addons/payment_razorpay/tests/common.py @@ -15,6 +15,7 @@ def setUpClass(cls): 'razorpay_key_secret': 'Y63AyP9eL91', 'razorpay_webhook_secret': 'coincoin_motherducker', 'payment_method_ids': [Command.set([cls.env.ref('payment.payment_method_card').id])], + 'allow_tokenization': True, }) cls.razorpay_customer_id = 'cust_123'