def test_redirect_form_values(self): tx = self.create_transaction(flow='redirect') with mute_logger('odoo.addons.payment.models.payment_transaction'): processing_values = tx._get_processing_values() form_info = self._extract_values_from_html_form( processing_values['redirect_form_html']) first_name, last_name = payment_utils.split_partner_name( self.partner.name) return_url = self._build_url(PayUMoneyController._return_url) expected_values = { 'key': self.payumoney.payumoney_merchant_key, 'txnid': self.reference, 'amount': str(self.amount), 'productinfo': self.reference, 'firstname': first_name, 'lastname': last_name, 'email': self.partner.email, 'phone': self.partner.phone, 'surl': return_url, 'furl': return_url, 'service_provider': 'payu_paisa', } expected_values['hash'] = self.payumoney._payumoney_generate_sign( expected_values, incoming=False, ) self.assertEqual(form_info['action'], 'https://sandboxsecure.payu.in/_payment') self.assertDictEqual( form_info['inputs'], expected_values, "PayUMoney: invalid inputs specified in the redirect form.")
def _get_specific_rendering_values(self, processing_values): """ Override of payment to return Payumoney-specific rendering values. Note: self.ensure_one() from `_get_processing_values` :param dict processing_values: The generic and specific processing values of the transaction :return: The dict of acquirer-specific processing values :rtype: dict """ res = super()._get_specific_rendering_values(processing_values) if self.provider != 'payumoney': return res first_name, last_name = payment_utils.split_partner_name(self.partner_id.name) api_url = 'https://secure.payu.in/_payment' if self.acquirer_id.state == 'enabled' \ else 'https://sandboxsecure.payu.in/_payment' payumoney_values = { 'key': self.acquirer_id.payumoney_merchant_key, 'txnid': self.reference, 'amount': self.amount, 'productinfo': self.reference, 'firstname': first_name, 'lastname': last_name, 'email': self.partner_email, 'phone': self.partner_phone, 'return_url': urls.url_join(self.get_base_url(), PayUMoneyController._return_url), 'api_url': api_url, } payumoney_values['hash'] = self.acquirer_id._payumoney_generate_sign( payumoney_values, incoming=False, ) return payumoney_values
def _prepare_authorization_transaction_request(self, transaction_type, tx_data, tx): # The billTo parameter is required for new ACH transactions (transactions without a payment.token), # but is not allowed for transactions with a payment.token. bill_to = {} if 'profile' not in tx_data: split_name = payment_utils.split_partner_name(tx.partner_name) partner_name = (tx.partner_name or "")[:50] # max length defined by the Authorize API bill_to = { 'billTo': { 'firstName': '' if tx.partner_id.is_company else split_name[0], 'lastName': split_name[1], # lastName is always required 'company': partner_name if tx.partner_id.is_company else '', 'address': tx.partner_address, 'city': tx.partner_city, 'state': tx.partner_state_id.name or '', 'zip': tx.partner_zip, 'country': tx.partner_country_id.name or '', } } # These keys have to be in the order defined in # https://apitest.authorize.net/xml/v1/schema/AnetApiSchema.xsd return { 'transactionRequest': { 'transactionType': transaction_type, 'amount': str(tx.amount), **tx_data, 'order': { 'invoiceNumber': tx.reference[:20], 'description': tx.reference[:255], }, 'customer': { 'email': tx.partner_email or '', }, **bill_to, 'customerIP': payment_utils.get_customer_ip_address(), } }
def _send_payment_request(self): """ Override of payment to send a payment request to Flutterwave. Note: self.ensure_one() :return: None :raise UserError: If the transaction is not linked to a token. """ super()._send_payment_request() if self.provider != 'flutterwave': return # Prepare the payment request to Flutterwave. if not self.token_id: raise UserError("Flutterwave: " + _("The transaction is not linked to a token.")) first_name, last_name = payment_utils.split_partner_name( self.partner_name) data = { 'token': self.token_id.acquirer_ref, 'email': self.token_id.flutterwave_customer_email, 'amount': self.amount, 'currency': self.currency_id.name, 'country': self.company_id.country_id.code, 'tx_ref': self.reference, 'first_name': first_name, 'last_name': last_name, 'ip': payment_utils.get_customer_ip_address(), } # Make the payment request to Flutterwave. response_content = self.acquirer_id._flutterwave_make_request( 'tokenized-charges', payload=data) # Handle the payment request response. _logger.info( "payment request response for transaction with reference %s:\n%s", self.reference, pprint.pformat(response_content)) self._handle_notification_data('flutterwave', response_content['data'])
def _get_specific_rendering_values(self, processing_values): """ Override of payment to return Paypal-specific rendering values. Note: self.ensure_one() from `_get_processing_values` :param dict processing_values: The generic and specific processing values of the transaction :return: The dict of acquirer-specific processing values :rtype: dict """ res = super()._get_specific_rendering_values(processing_values) if self.provider != 'paypal': return res base_url = self.acquirer_id.get_base_url() partner_first_name, partner_last_name = payment_utils.split_partner_name( self.partner_name) notify_url = self.acquirer_id.paypal_use_ipn \ and urls.url_join(base_url, PaypalController._notify_url) return { 'address1': self.partner_address, 'amount': self.amount, 'business': self.acquirer_id.paypal_email_account, 'city': self.partner_city, 'country': self.partner_country_id.code, 'currency_code': self.currency_id.name, 'email': self.partner_email, 'first_name': partner_first_name, 'handling': self.fees, 'item_name': f"{self.company_id.name}: {self.reference}", 'item_number': self.reference, 'last_name': partner_last_name, 'lc': self.partner_lang, 'notify_url': notify_url, 'return_url': urls.url_join(base_url, PaypalController._return_url), 'state': self.partner_state_id.name, 'zip_code': self.partner_zip, 'api_url': self.acquirer_id._paypal_get_api_url(), }
def _get_specific_rendering_values(self, processing_values): """ Override of payment to return Lyra-specific rendering values.""" res = super()._get_specific_rendering_values(processing_values) if self.provider not in ['lyra', 'lyramulti']: return res values = self.acquirer_id.lyra_form_generate_values(processing_values) for key in values.keys(): if key.startswith('vads_') and values[key] != '': values[key] = values[key].decode('utf-8') partner_first_name, partner_last_name = payment_utils.split_partner_name( self.partner_name) partner_shipping_id = self.sale_order_ids[0].partner_shipping_id partner_shipping_first_name, partner_shipping_last_name = payment_utils.split_partner_name( partner_shipping_id.name) if partner_shipping_id else ('', '') values.update({ 'vads_cust_id': str(self.partner_id.id) or '', 'vads_cust_first_name': partner_first_name or '', 'vads_cust_last_name': partner_last_name or '', 'vads_cust_address': self.partner_address or '', 'vads_cust_zip': self.partner_zip or '', 'vads_cust_city': self.partner_city or '', 'vads_cust_state': self.partner_state_id.name or '', 'vads_cust_country': self.partner_country_id.code or '', 'vads_cust_email': self.partner_email or '', 'vads_cust_phone': self.partner_phone or '', # Shipping info. 'vads_ship_to_first_name': partner_shipping_first_name if partner_shipping_id else '', 'vads_ship_to_last_name': partner_shipping_last_name if partner_shipping_id else '', 'vads_ship_to_street': partner_shipping_id.street if partner_shipping_id else '', 'vads_ship_to_zip': partner_shipping_id.zip if partner_shipping_id else '', 'vads_ship_to_city': partner_shipping_id.city if partner_shipping_id else '', 'vads_ship_to_state': partner_shipping_id.state_id.name if partner_shipping_id else '', 'vads_ship_to_country': partner_shipping_id.country_id.code if partner_shipping_id else '', 'vads_ship_to_phone_num': partner_shipping_id.phone if partner_shipping_id else '' }) values['lyra_signature'] = self.acquirer_id._lyra_generate_sign( self, values) values['api_url'] = self.acquirer_id.lyra_get_form_action_url() return values