Merge pull request #6084 from expsa/store_hyperpay_response
[IMP][FIX] payment_hyperpay_tokenization: refund without paymentBrand & improve error handeling & logging
This commit is contained in:
commit
d1af56a965
|
|
@ -1,6 +1,8 @@
|
||||||
import requests
|
import requests
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
|
import pprint
|
||||||
|
import traceback
|
||||||
from odoo import _
|
from odoo import _
|
||||||
from odoo.http import route, request, Controller
|
from odoo.http import route, request, Controller
|
||||||
from odoo.addons.payment_hyperpay.data.payment_icon import payment_icon
|
from odoo.addons.payment_hyperpay.data.payment_icon import payment_icon
|
||||||
|
|
@ -168,9 +170,27 @@ class HyperPayTokenization(Controller):
|
||||||
"Authorization": f"Bearer {acquirer_id.hyperpay_authorization}"
|
"Authorization": f"Bearer {acquirer_id.hyperpay_authorization}"
|
||||||
}
|
}
|
||||||
_logger.info('Hyperpay Token Status Request: %s' % url)
|
_logger.info('Hyperpay Token Status Request: %s' % url)
|
||||||
response_data = requests.get(url=url, headers=headers)
|
try:
|
||||||
|
response_data = requests.get(url=url, headers=headers)
|
||||||
|
except Exception as e:
|
||||||
|
_logger.error('Failed to get Hyperpay Token Status: %s' % e)
|
||||||
|
transaction_id.write({
|
||||||
|
'state_message': traceback.format_exc(),
|
||||||
|
})
|
||||||
|
return request.make_response('Payment validation failed. Please try again or contact support.', headers=[('Content-Type', 'text/html')])
|
||||||
|
|
||||||
_logger.info('Hyperpay Token Status Response Text: %s' % response_data.text)
|
_logger.info('Hyperpay Token Status Response Text: %s' % response_data.text)
|
||||||
resp = response_data.json()
|
|
||||||
|
try:
|
||||||
|
resp = response_data.json()
|
||||||
|
except Exception as e:
|
||||||
|
_logger.error('Failed to parse JSON response: %s' % e)
|
||||||
|
transaction_id.write({
|
||||||
|
'state_message': traceback.format_exc(),
|
||||||
|
'hyperpay_response_payload': response_data.text,
|
||||||
|
})
|
||||||
|
return request.make_response('Payment validation failed. Please try again or contact support.', headers=[('Content-Type', 'text/html')])
|
||||||
|
|
||||||
_logger.info('Hyperpay Token Status Response JSON: %s' % resp)
|
_logger.info('Hyperpay Token Status Response JSON: %s' % resp)
|
||||||
|
|
||||||
resp.update({'tx_id': transaction_id.id})
|
resp.update({'tx_id': transaction_id.id})
|
||||||
|
|
@ -211,42 +231,47 @@ class HyperPayTokenization(Controller):
|
||||||
return {'state': False, 'message': 'Registration ID not found in response'}
|
return {'state': False, 'message': 'Registration ID not found in response'}
|
||||||
|
|
||||||
acquirer_id = transaction_id.acquirer_id
|
acquirer_id = transaction_id.acquirer_id
|
||||||
|
partner_id = request.env.user.partner_id
|
||||||
existing_token = request.env['payment.token'].sudo().search([
|
existing_token = request.env['payment.token'].sudo().search([
|
||||||
('acquirer_ref', '=', registration_id),
|
('acquirer_ref', '=', registration_id),
|
||||||
('acquirer_id', '=', acquirer_id.id)
|
('acquirer_id', '=', acquirer_id.id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
|
|
||||||
if existing_token:
|
if existing_token:
|
||||||
_logger.warning('Token already exists for registration %s, returning existing token' % registration_id)
|
_logger.warning('Token already exists for registration %s, using existing token' % registration_id)
|
||||||
reference_id = int(data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_id', 0))
|
token_id = existing_token
|
||||||
reference_model = data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_model', '')
|
else:
|
||||||
if reference_id and reference_model and reference_model in request.env:
|
payment_icon_id = request.env['payment.icon'].sudo().search([('name', 'ilike', data.get('paymentBrand', '')), ('acquirer_ids', 'in', acquirer_id.ids)], limit=1)
|
||||||
record_id = request.env[reference_model].sudo().search([('id', '=', reference_id)])
|
|
||||||
if record_id and hasattr(record_id, '_post_process_card_tokenization'):
|
card_vals = {
|
||||||
record_id._post_process_card_tokenization(existing_token)
|
'name': f"{card.get('bin', '')} **** **** **** {card.get('last4Digits', '')}",
|
||||||
return {'state': True, 'message': 'Token already exists for registration %s, returning existing token' % registration_id}
|
'partner_id': partner_id.id,
|
||||||
|
'acquirer_id': acquirer_id.id,
|
||||||
|
'acquirer_ref': registration_id,
|
||||||
|
'hyperpay_payment_brand': data.get('paymentBrand'),
|
||||||
|
'hyperpay_initial_transaction_id': initial_tx_id,
|
||||||
|
'verified': True,
|
||||||
|
'payment_icon_id': payment_icon_id.id,
|
||||||
|
}
|
||||||
|
|
||||||
|
token_id = request.env['payment.token'].sudo().create(card_vals)
|
||||||
|
_logger.info('Created payment token %s for partner %s' % (token_id.id, partner_id.id))
|
||||||
|
|
||||||
|
result = data.get('result', {})
|
||||||
|
res = {
|
||||||
|
'acquirer_reference': data.get('id'),
|
||||||
|
'state_message': f"{result.get('description', '')}\n{','.join([str(s) for s in data.get('parameterErrors', [])])}",
|
||||||
|
'payment_token_id': token_id.id,
|
||||||
|
'hyperpay_response_payload': pprint.pformat(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
transaction_id.write(res)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
transaction_id.hyperpay_s2s_do_refund()
|
transaction_id.hyperpay_s2s_do_refund()
|
||||||
except Exception as er:
|
except Exception as er:
|
||||||
_logger.error('Hyperpay Token Return Transaction refund failed: %s' % er)
|
_logger.error('Hyperpay Token Return Transaction refund failed: %s' % er)
|
||||||
|
|
||||||
payment_icon_id = request.env['payment.icon'].sudo().search([('name', 'ilike', data.get('paymentBrand', '')), ('acquirer_ids', 'in', [acquirer_id.id])], limit=1)
|
|
||||||
|
|
||||||
card_vals = {
|
|
||||||
'name': f"{card.get('bin', '')} **** **** **** {card.get('last4Digits', '')}",
|
|
||||||
'partner_id': request.env.user.partner_id.id,
|
|
||||||
'acquirer_id': acquirer_id.id,
|
|
||||||
'acquirer_ref': registration_id,
|
|
||||||
'hyperpay_payment_brand': data.get('paymentBrand'),
|
|
||||||
'hyperpay_initial_transaction_id': initial_tx_id,
|
|
||||||
'verified': True,
|
|
||||||
'payment_icon_id': payment_icon_id.id,
|
|
||||||
}
|
|
||||||
|
|
||||||
token_id = request.env['payment.token'].sudo().create(card_vals)
|
|
||||||
_logger.info('Created payment token %s for partner %s' % (token_id.id, request.env.user.partner_id.id))
|
|
||||||
|
|
||||||
reference_id = int(data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_id', 0))
|
reference_id = int(data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_id', 0))
|
||||||
reference_model = data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_model', '')
|
reference_model = data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_model', '')
|
||||||
if reference_id and reference_model and reference_model in request.env:
|
if reference_id and reference_model and reference_model in request.env:
|
||||||
|
|
@ -254,4 +279,4 @@ class HyperPayTokenization(Controller):
|
||||||
if record_id and hasattr(record_id, '_post_process_card_tokenization'):
|
if record_id and hasattr(record_id, '_post_process_card_tokenization'):
|
||||||
record_id._post_process_card_tokenization(token_id)
|
record_id._post_process_card_tokenization(token_id)
|
||||||
|
|
||||||
return {'state': True, 'message': 'Token created successfully'}
|
return {'state': True, 'message': 'Token processed successfully'}
|
||||||
Loading…
Reference in New Issue