odex25_standard/odex25_donation/payment_applepay/models/payment.py

114 lines
5.2 KiB
Python

# -*- 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']