diff --git a/odex25_donation/payment_hyperpay_tokenization/controllers/main.py b/odex25_donation/payment_hyperpay_tokenization/controllers/main.py index cad46702d..98f18d92a 100644 --- a/odex25_donation/payment_hyperpay_tokenization/controllers/main.py +++ b/odex25_donation/payment_hyperpay_tokenization/controllers/main.py @@ -1,6 +1,8 @@ import requests import re import logging +import pprint +import traceback from odoo import _ from odoo.http import route, request, Controller 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}" } _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) - 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) resp.update({'tx_id': transaction_id.id}) @@ -211,42 +231,47 @@ class HyperPayTokenization(Controller): return {'state': False, 'message': 'Registration ID not found in response'} acquirer_id = transaction_id.acquirer_id + partner_id = request.env.user.partner_id existing_token = request.env['payment.token'].sudo().search([ ('acquirer_ref', '=', registration_id), ('acquirer_id', '=', acquirer_id.id) ], limit=1) if existing_token: - _logger.warning('Token already exists for registration %s, returning existing token' % registration_id) - reference_id = int(data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_id', 0)) - reference_model = data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_model', '') - if reference_id and reference_model and reference_model in request.env: - record_id = request.env[reference_model].sudo().search([('id', '=', reference_id)]) - if record_id and hasattr(record_id, '_post_process_card_tokenization'): - record_id._post_process_card_tokenization(existing_token) - return {'state': True, 'message': 'Token already exists for registration %s, returning existing token' % registration_id} + _logger.warning('Token already exists for registration %s, using existing token' % registration_id) + token_id = existing_token + else: + payment_icon_id = request.env['payment.icon'].sudo().search([('name', 'ilike', data.get('paymentBrand', '')), ('acquirer_ids', 'in', acquirer_id.ids)], limit=1) + + card_vals = { + 'name': f"{card.get('bin', '')} **** **** **** {card.get('last4Digits', '')}", + '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: transaction_id.hyperpay_s2s_do_refund() except Exception as 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_model = data.get('customParameters', {}).get('SHOPPER_hyperpay_token_reference_model', '') 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'): record_id._post_process_card_tokenization(token_id) - return {'state': True, 'message': 'Token created successfully'} \ No newline at end of file + return {'state': True, 'message': 'Token processed successfully'} \ No newline at end of file