# -*- coding: utf-8 -*- # This module and its content is copyright of Technaureus Info Solutions Pvt. Ltd. # - © Technaureus Info Solutions Pvt. Ltd 2020. All rights reserved. import json import logging import random from urllib.parse import urljoin import requests from odoo.exceptions import UserError from odoo import api, fields, models, _ from odoo.http import request _logger = logging.getLogger(__name__) class AcquirerApplepay(models.Model): _inherit = 'payment.acquirer' provider = fields.Selection(selection_add=[('applepay', 'applepay')], ondelete={'applepay': 'set default'}) applepay_entity_id = fields.Char(string='Merchant ID/Entity Id', required_if_provider='applepay', groups='base.group_user') applepay_authorization_bearer = fields.Char(string='Authorization Bearer', required_if_provider='applepay', groups='base.group_user') apple_pay_server_auth_file = fields.Binary("Server Authentication file") def _partner_split_name(self, partner_name): if partner_name: return [' '.join(partner_name.split()[:-1]), ' '.join(partner_name.split()[-1:])] else: return ['', ''] def _get_authenticate_apple_pay(self, values): url = "https://eu-test.oppwa.com/v1/checkouts" if self.state == 'test' else "https://oppwa.com/v1/checkouts" authorization_bearer = "Bearer " + self.applepay_authorization_bearer partner = self.env['res.partner'].sudo().browse(values['partner_id']).sudo() tx_id = self.env['payment.transaction'].sudo().search([('id', '=', values.get('tx_id', 0))]) order_no = values.get('reference', '').split('-', 1) partner_name = partner.name or '' partner_mobile = partner.mobile or '' if order_no: order_id = request.env['sale.order'].sudo().search([('name', '=', order_no[0])], limit=1).sudo() if order_id: partner_mobile = order_id.order_mobile_number partner_name = order_id.order_name last_name = self._partner_split_name(partner_name)[-1] if partner_name else '' _logger.info(">>%s" % (authorization_bearer)) data = { 'entityId': self.applepay_entity_id, 'amount': str(format(values['amount'], '.2f')), 'currency': 'SAR', 'paymentType': 'DB', 'merchantTransactionId': values.get('reference'), 'customer.email': '{seq}@ensan.sa'.format(seq=random.randint(0, 10000)), 'customer.givenName': partner_name or 'guest', 'customer.companyName': partner.company_id.name, 'billing.street1': partner.street or 'Riyadh', 'billing.state': partner.state_id.name or 'Riyadh', 'billing.country': partner.country_id.code or 'SA', 'billing.postcode': partner.zip, 'customer.surname': last_name or 'guest' } try: headers = {'Authorization': authorization_bearer} response = requests.post( url, headers=headers, data=data ) response = json.loads(response.text) _logger.info("Info From Authorization = %s ", response) if tx_id: tx_id.applepay_checkout_id = response.get('id') return response.get('id') except Exception as e: raise UserError(_(e)) def applepay_form_generate_values(self, values): currency = self.env['res.currency'].browse(values['currency_id']) base_url = self.get_base_url() check_out_id = self._get_authenticate_apple_pay(values) _logger.info(">>%s" % (self.applepay_authorization_bearer)) authorization_bearer = "Bearer " + self.applepay_authorization_bearer applepay_tx_values = dict(values) applepay_tx_values.update({ 'entityId': self.applepay_entity_id, 'check_out_id': check_out_id, 'Authorization': authorization_bearer, 'amount': str(format(values['amount'], '.2f')), 'currency': currency.id and currency.name or '', 'paymentBrand': 'APPLEPAY', 'paymentType': 'DB', 'merchantTransactionId': values.get('reference'), 'shopperResultUrl': '%s' % urljoin(base_url, '/shop/applepay/payment/'), 'applepay_return': '%s' % urljoin(base_url, '/payment/applepay/return'), 'custom': json.dumps({'return_url': '%s' % applepay_tx_values.pop('return_url')}) if applepay_tx_values.get( 'return_url') else False, }) return applepay_tx_values @api.model def _get_authorize_urls_apple_pay(self, environment): """ applepay URLS """ if environment == 'prod': return {'applepay_form_url': 'https://oppwa.com/v1/checkouts'} else: return {'applepay_form_url': 'https://test.oppwa.com/v1/checkouts'} def applepay_get_form_action_url(self): self.ensure_one() environment = 'prod' if self.state == 'enabled' else 'test' return self._get_authorize_urls_apple_pay(environment)['applepay_form_url']