114 lines
5.2 KiB
Python
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']
|