示例#1
0
    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.")
示例#2
0
    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
示例#3
0
    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(),
            }
        }
示例#4
0
    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'])
示例#5
0
    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(),
        }
示例#6
0
    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