diff --git a/payment_redsys_preauth/README.rst b/payment_redsys_preauth/README.rst new file mode 100644 index 0000000..8adcc75 --- /dev/null +++ b/payment_redsys_preauth/README.rst @@ -0,0 +1,133 @@ +=========================================== +Pasarela de pago Redsys con preautorización +=========================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1eb9535d052a619aa545a383869076ca1dc1fade22746cb3fe13afa726c3e3a3 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-Criptomart%2Ffoodcoopbcn-lightgray.png?logo=github + :target: https://github.com/Criptomart/foodcoopbcn/tree/12.0/payment_redsys_preauth + :alt: Criptomart/foodcoopbcn + +|badge1| |badge2| |badge3| + +Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Parámetros +~~~~~~~~~~ + +* **Nombre del comercio**: Indicaremos el nombre del comercio. + +* **Número de comercio (FUC)**: Indicaremos el número de comercio que + nuestra entidad nos ha comunicado. + +* **Clave secreta de encriptación**: Indicaremos la clave de encriptación + que tiene el comercio. + +* **Número de terminal**: Indicaremos el terminal del TPV. + +* **Tipo de firma**: Seleccionaremos el tipo de firma del comercio. + +* **Tipo de moneda**: Seleccionaremos la moneda de nuestro terminal TPV + (Normalmente EUR - Euros). + +* **Tipo de transacción**: Indicaremos el tipo de transacción, 1. + +* **Idioma TPV**: Indicaremos el idioma en el TPV. + +* **Método de pago**: Indicaremos que tipo de pago se debe aceptar, pago con + tarjeta, Bizum u otro de los disponibles. + +* **URL_OK/URL_KO**: Durante el proceso del pago, y una vez que + se muestra al cliente la pantalla con el resultado del mismo, es + posible redirigir su navegador a una URL para las transacciones + autorizadas y a otra si la transacción ha sido denegada. A éstas + se las denomina URL_OK y URL_KO, respectivamente. Se trata + de dos URLs que pueden ser proporcionadas por el comercio. + +* **Porcentaje de pago**: Indicar el porcentaje de pago que se permite, si + se deja a 0.0 se entiende 100%. + +Nota +~~~~ + +Se tiene que verificar la configuración del comercio en el +módulo de administración de Redsys, donde la opción “Parámetros en las +URLs” debe tener el valor “SI”. + +En caso de que exista más de una base de datos en la instalación, cuando la +pasarela de pago envía el formulario a "/payment/redsys/return" odoo no sabe +con que base de datos procesar esta información, por lo que hay que establecer +los parametros **dbfilter** y **dbname** en el archivo de configuración. + +Para mostrar simultáneamente en el comercio electrónico varios de los métodos +de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo, +debemos duplicar el medio de pago y escoger en el campo método de pago el que +corresponda en cada caso. + +En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación. + + +Known issues / Roadmap +====================== + +De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido +resultante (``Ds_Order``) es de 12 caracteres. Este addon trunca dicho +dato en el comienzo de la transacción, con el resultado de que, aunque Redsys +la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará +un Error 500 a Redsys. +Para evitar esto, es recomendable seleccionar secuencias de pedido que se +ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la +referencia un número extendido a partir del pedido, que incluye un guion y un +número secuencial para posibles repeticiones de pago. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Criptomart + +Contributors +~~~~~~~~~~~~ + +* `Criptomart `_: + + * Santi Noreña + +Maintainers +~~~~~~~~~~~ + +This module is part of the `Criptomart/foodcoopbcn `_ project on GitHub. + +You are welcome to contribute. diff --git a/payment_redsys_preauth/__init__.py b/payment_redsys_preauth/__init__.py new file mode 100644 index 0000000..822e370 --- /dev/null +++ b/payment_redsys_preauth/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3 - See https://www.gnu.org/licenses/agpl-3.0.html + +from . import models +from . import controllers diff --git a/payment_redsys_preauth/__manifest__.py b/payment_redsys_preauth/__manifest__.py new file mode 100644 index 0000000..6b75ed6 --- /dev/null +++ b/payment_redsys_preauth/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2024 - 2025 Criptomart +{ + "name": "Pasarela de pago Redsys con preautorización", + "category": "Payment Acquirer", + "summary": "Payment Acquirer: Redsys Implementation with Preauthorization", + "version": "16.0.0.0.1", + "author": "Criptomart", + "website": "https://git.criptomart.net/foodcoopbcn", + "depends": ["payment_redsys","sale_order_invoice_amount"], + "data": [ + "data/payment_redsys.xml" + ], + "license": "AGPL-3", + "installable": True, +} diff --git a/payment_redsys_preauth/controllers/__init__.py b/payment_redsys_preauth/controllers/__init__.py new file mode 100644 index 0000000..8b6d05e --- /dev/null +++ b/payment_redsys_preauth/controllers/__init__.py @@ -0,0 +1,2 @@ + +from . import main diff --git a/payment_redsys_preauth/controllers/main.py b/payment_redsys_preauth/controllers/main.py new file mode 100644 index 0000000..63b03ee --- /dev/null +++ b/payment_redsys_preauth/controllers/main.py @@ -0,0 +1,29 @@ +# © 2024 - 2025 criptomart.net +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +import pprint + +from odoo import http +from odoo.http import request +from odoo.addons.payment_redsys.controllers.main import RedsysController + +_logger = logging.getLogger(__name__) + + + +class RedsysController(RedsysController): + _return_url = '/payment/redsys/return' + _cancel_url = '/payment/redsys/cancel' + _exception_url = '/payment/redsys/error' + _reject_url = '/payment/redsys/reject' + + + @http.route(['/payment/redsys/result/'], type='http', auth='public',methods=['GET'], website=True) + def redsys_result(self, page, **post): + _logger.info('________ Redsys return sync: %s -- %s', + pprint.pformat(post), page) + # double check + if post: + request.env['payment.transaction'].sudo()._handle_notification_data('redsys', post) + return request.redirect('/payment/status') diff --git a/payment_redsys_preauth/data/payment_redsys.xml b/payment_redsys_preauth/data/payment_redsys.xml new file mode 100644 index 0000000..e6b8db2 --- /dev/null +++ b/payment_redsys_preauth/data/payment_redsys.xml @@ -0,0 +1,26 @@ + + + + + + Redsys Preautorización + + redsys + + Bussines name + 8888888 + Bussines description + xxxxxxxxxxxx -- SHA256 + 001 + 1 + + You will be redirected to the Redsys payment gateway after clicking on the payment button.

]]>
+
+ + + Bizum + + + +
diff --git a/payment_redsys_preauth/models/__init__.py b/payment_redsys_preauth/models/__init__.py new file mode 100644 index 0000000..9afbccd --- /dev/null +++ b/payment_redsys_preauth/models/__init__.py @@ -0,0 +1,2 @@ +from . import payment_provider +from . import payment_transaction diff --git a/payment_redsys_preauth/models/payment_provider.py b/payment_redsys_preauth/models/payment_provider.py new file mode 100644 index 0000000..17ddf9f --- /dev/null +++ b/payment_redsys_preauth/models/payment_provider.py @@ -0,0 +1,135 @@ +# © 2024 - 2025 criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +import json +import pprint +import requests +import urllib + +from odoo import models, api, exceptions, fields +from odoo.addons.payment.models.payment_provider import ValidationError +from odoo.tools.float_utils import float_compare +from odoo.tools.translate import _ +import odoo.exceptions + +_logger = logging.getLogger(__name__) + + +class PaymentProvider(models.Model): + _inherit = 'payment.provider' + + @api.depends('code') + def _compute_feature_support_fields(self): + super()._compute_feature_support_fields() + self.update({ + 'support_manual_capture': 'partial', + }) + + def get_redsys_rest_urls(self, environment): + """ Redsys Rest URLs + """ + if environment == 'prod': + return { + 'redsys_rest_url': + 'https://sis.redsys.es/sis/rest/trataPeticionREST', + } + else: + # redsys no acepta preautorizaciones en test, pero puede que cambie... + return { + 'redsys_rest_url': + 'https://sis-t.redsys.es:25443/sis/rest/trataPeticionREST', + } + + def _prepare_merchant_parameters(self, tx_values): + base_url = self._get_website_url() + callback_url = "http://botiga.foodcoopbcn.cat" + values = { + "Ds_Sermepa_Url": self._redsys_get_api_url(), + "Ds_Merchant_Amount": str(int(round(tx_values["amount"] * 100))), + "Ds_Merchant_Currency": self.redsys_currency or "978", + "Ds_Merchant_Order": ( + tx_values["reference"] and tx_values["reference"][-12:] or False + ), + "Ds_Merchant_MerchantCode": ( + self.redsys_merchant_code and self.redsys_merchant_code[:9] + ), + "Ds_Merchant_Terminal": self.redsys_terminal or "1", + "Ds_Merchant_TransactionType": (self.redsys_transaction_type or "1"), + "Ds_Merchant_Titular": tx_values.get( + "billing_partner", self.env.user.partner_id + ).display_name[:60], + "Ds_Merchant_MerchantName": ( + self.redsys_merchant_name and self.redsys_merchant_name[:25] + ), + "Ds_Merchant_MerchantUrl": ( + "%s/payment/redsys/return" % (callback_url or base_url) + )[:250], + "Ds_Merchant_MerchantData": self.redsys_merchant_data or "", + "Ds_Merchant_ProductDescription": ( + self.redsys_merchant_description + and self.redsys_merchant_description[:125] + ), + "Ds_Merchant_ConsumerLanguage": (self.redsys_merchant_lang or "001"), + "Ds_Merchant_UrlOk": "%s/payment/redsys/result/redsys_result_ok" % base_url, + "Ds_Merchant_UrlKo": "%s/payment/redsys/result/redsys_result_ko" % base_url, + "Ds_Merchant_Paymethods": self.redsys_pay_method or "T", + } + return self._url_encode64(json.dumps(values)).decode("utf-8") + + def _prepare_s2s_merchant_parameters(self, tx_values): + values = { + 'Ds_Merchant_Amount': str(int(round(tx_values['amount'] * 100))), + 'Ds_Merchant_Currency': self.redsys_currency or '978', + 'Ds_Merchant_Order': ( + tx_values['reference'] and tx_values['reference'][-12:] or + False), + 'Ds_Merchant_MerchantCode': ( + self.redsys_merchant_code and + self.redsys_merchant_code[:9]), + 'Ds_Merchant_Terminal': self.redsys_terminal or '1', + } + if 'transaction_type' in tx_values: + values.update({'Ds_Merchant_TransactionType': tx_values['transaction_type']}) + else: + values.update({'Ds_Merchant_TransactionType': + (self.redsys_transaction_type or '2')}), + return self._url_encode64(json.dumps(values)) + + def redsys_s2s_create_transaction(self, values): + self.ensure_one() + redsys_values = dict() + merchant_parameters = self._prepare_s2s_merchant_parameters(values) + redsys_values.update({ + 'Ds_SignatureVersion': str(self.redsys_signature_version), + 'Ds_MerchantParameters': merchant_parameters, + 'Ds_Signature': self.sign_parameters( + self.redsys_secret_key, merchant_parameters), + }) + return redsys_values + + def redsys_send_s2s_msg(self, values): + toSend = self.redsys_s2s_create_transaction(values) + url = self.get_redsys_rest_urls('prod')['redsys_rest_url'] + _logger.info('Redsys: sending rest values:\n%s', pprint.pformat(toSend)) + try: + if toSend and url: + response = requests.post(url, data=toSend) + else: + raise exceptions.ValidationError('Error en los parámetros de la petición rest') + except requests.exceptions.RequestException as e: + _logger.error('Redsys: Error sending rest transaction %s:\n%s', values['reference'], str(e)) + return False + if response and response.status_code != 200: + _logger.error('Redsys: Error sending rest transaction %s: %s', values['reference'], response.status_code) + return False + _logger.info('Redsys: rest response:\n%s', pprint.pformat(response.text)) + try: + errorCheck = response.json() + if errorCheck.get('errorCode', ''): + _logger.error('Redsys: Error recibido tx %s: %s', values['reference'], errorCheck.get('errorCode')) + except json.JSONDecodeError: + _logger.error('Error al decodificar la respuesta JSON para la transacción %s', values['reference']) + return False + return errorCheck + diff --git a/payment_redsys_preauth/models/payment_transaction.py b/payment_redsys_preauth/models/payment_transaction.py new file mode 100644 index 0000000..d99c675 --- /dev/null +++ b/payment_redsys_preauth/models/payment_transaction.py @@ -0,0 +1,150 @@ +# © 2024 - 2025 criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +import json +import pprint +import requests + +from odoo import models, api, exceptions, fields +from odoo.addons.payment.models.payment_provider import ValidationError +from odoo.tools.float_utils import float_compare +from odoo.tools.translate import _ + + +_logger = logging.getLogger(__name__) + + +class TxRedsysPreAuth(models.Model): + _inherit = 'payment.transaction' + + def _get_specific_rendering_values(self, processing_values): + if self.provider_code != "redsys": + return super()._get_specific_rendering_values(processing_values) + redsys_values = dict(processing_values) + merchant_parameters = self.provider_id._prepare_merchant_parameters( + processing_values + ) + redsys_values.update( + { + "api_url": self.provider_id._redsys_get_api_url(), + "Ds_SignatureVersion": str(self.provider_id.redsys_signature_version), + "Ds_MerchantParameters": merchant_parameters, + "Ds_Signature": self.provider_id.sign_parameters( + self.provider_id.redsys_secret_key, merchant_parameters + ), + } + ) + return redsys_values + + # chequea que el usuario cancele el pago 9915. cambia el stado de done a authorized + @api.model + def _get_redsys_state(self, status_code): + if 0 <= status_code <= 100: + return "authorized" + elif status_code <= 203: + return "pending" + elif status_code == 400: + return "cancel" + elif status_code == 900: + return "done" + elif 912 <= status_code <= 9915: + return "cancel" + else: + return "error" + + def _process_notification_data(self, data): + if self.provider_code != "redsys": + return super()._process_notification_data(data) + params = self.merchant_params_json2dict(data) + status_code = int(params.get('Ds_Response', '29999')) + state = self._get_redsys_state(status_code) + vals = { + 'state': state, + 'redsys_txnid': params.get('Ds_AuthorisationCode'), + } + state_message = "" + feedback_error = False + if state == 'done': + vals['state_message'] = _('Ok: %s') % params.get('Ds_Response') + self._set_done() + self._finalize_post_processing() + if state == 'authorized': + vals['state_message'] = _('Auth Ok: %s') % params.get('Ds_Response') + self._set_authorized() + self._finalize_post_processing() + elif state == 'pending': # 'Payment error: code: %s.' + state_message = _("Redsys: feedback error: %s" %(status_code)) + self._set_pending() + elif state == 'cancel': # 'Payment error: bank unavailable.' + state_message = _("Redsys: feedback error: %s" %(status_code)) + self._set_canceled() + else: + state_message = _("Redsys: feedback error: %s" %(status_code)) + self._set_error(state_message) + feedback_error = True + if state_message: + vals['state_message'] = state_message % { + "status_code": params.get("Ds_Response"), + "error_code": params.get("Ds_ErrorCode"), + } + if state == 'error': + _logger.warning(vals['state_message']) + self.write(vals) + + def _send_capture_request(self, amount_to_capture=None): + self.ensure_one() + self._ensure_provider_is_not_disabled() + _logger.info('Redsys: Capturing transaction %s -- %s', self.reference, amount_to_capture) + try: + if amount_to_capture: + values = {'amount': amount_to_capture} + else: + values = {'amount': sum(order.invoiced_amount for order in self.sale_order_ids)} + values.update({'reference': self.reference}) + values.update({'transaction_type': '2'}) + response = self.provider_id.redsys_send_s2s_msg(values) + if not response: + raise exceptions.ValidationError('Error mandando mensaje rest'); + if response.get('errorCode', ''): + raise exceptions.ValidationError('Ref %s: Error Code %s' %(self.reference, response.get('errorCode'))) + params = self.merchant_params_json2dict(response) + _logger.info('Redsys: parameters received:\n%s', pprint.pformat(params)) + if params['Ds_Response'] == '0900' and params['Ds_Order'] == self.reference: + self.provider_reference = params['Ds_AuthorisationCode'] + self._set_done() + _logger.info('Confirmacion de preautorizacion realizada con exito para la transaccion %s', self.reference) + message = ('Preautorizacion confirmada') + self.sale_order_ids.message_post(body=message) + else: + raise exceptions.ValidationError('Error en confirmacion de preautorizacion tx: %s - %s', self.reference, params['Ds_Response']) + except Exception as e: + _logger.exception('Redsys: Error capturando preautorización transacción %s:\n%s', self.reference, str(e)) + raise exceptions.UserError(_('Error capturing preauthorization for transaction %s:\n%s') % (self.reference, str(e))) + + def _send_void_request(self, amount_to_void=None): + self.ensure_one() + self._ensure_provider_is_not_disabled() + _logger.info('Redsys: Preauthorization cancel for transaction %s', self.reference) + try: + if amount_to_void: + values = {'amount': amount_to_void} + else: + values = {'amount': self.amount} + values.update({'reference': self.reference}) + values.update({'transaction_type': '9'}) + response = self.provider_id.redsys_send_s2s_msg(values) + if not response: + raise exceptions.ValidationError(_('error redsys_s2s_msg')) + if response.get('errorCode', ''): + raise exceptions.ValidationError('Ref %s: Error Code %s' % (self.reference, response.get('errorCode'))) + params = self.merchant_params_json2dict(response) + _logger.info('Redsys: parameters received):\n%s', pprint.pformat(params)) + if params['Ds_Response'] == '0400' and params['Ds_Order'] == self.reference: + self._set_canceled() + _logger.info('Preautorización cancelada con éxito para la transacción %s', self.reference) + else: + raise exceptions.ValidationError('No se pudo cancelar la preautorización para la transacción %s - %s', self.reference, params['Ds_Response']) + except Exception as e: + _logger.exception('Redsys Error cancelando preautorización tx %s:\n%s', self.reference, str(e)) + raise exceptions.UserError(_('Error cancelling preauthorization for transaction %s:\n%s') % (self.reference, str(e))) diff --git a/payment_redsys_preauth/readme/CONFIGURE.rst b/payment_redsys_preauth/readme/CONFIGURE.rst new file mode 100644 index 0000000..f23c184 --- /dev/null +++ b/payment_redsys_preauth/readme/CONFIGURE.rst @@ -0,0 +1,54 @@ +Parámetros +~~~~~~~~~~ + +* **Nombre del comercio**: Indicaremos el nombre del comercio. + +* **Número de comercio (FUC)**: Indicaremos el número de comercio que + nuestra entidad nos ha comunicado. + +* **Clave secreta de encriptación**: Indicaremos la clave de encriptación + que tiene el comercio. + +* **Número de terminal**: Indicaremos el terminal del TPV. + +* **Tipo de firma**: Seleccionaremos el tipo de firma del comercio. + +* **Tipo de moneda**: Seleccionaremos la moneda de nuestro terminal TPV + (Normalmente EUR - Euros). + +* **Tipo de transacción**: Indicaremos el tipo de transacción, 1. + +* **Idioma TPV**: Indicaremos el idioma en el TPV. + +* **Método de pago**: Indicaremos que tipo de pago se debe aceptar, pago con + tarjeta, Bizum u otro de los disponibles. + +* **URL_OK/URL_KO**: Durante el proceso del pago, y una vez que + se muestra al cliente la pantalla con el resultado del mismo, es + posible redirigir su navegador a una URL para las transacciones + autorizadas y a otra si la transacción ha sido denegada. A éstas + se las denomina URL_OK y URL_KO, respectivamente. Se trata + de dos URLs que pueden ser proporcionadas por el comercio. + +* **Porcentaje de pago**: Indicar el porcentaje de pago que se permite, si + se deja a 0.0 se entiende 100%. + +Nota +~~~~ + +Se tiene que verificar la configuración del comercio en el +módulo de administración de Redsys, donde la opción “Parámetros en las +URLs” debe tener el valor “SI”. + +En caso de que exista más de una base de datos en la instalación, cuando la +pasarela de pago envía el formulario a "/payment/redsys/return" odoo no sabe +con que base de datos procesar esta información, por lo que hay que establecer +los parametros **dbfilter** y **dbname** en el archivo de configuración. + +Para mostrar simultáneamente en el comercio electrónico varios de los métodos +de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo, +debemos duplicar el medio de pago y escoger en el campo método de pago el que +corresponda en cada caso. + +En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación. + diff --git a/payment_redsys_preauth/readme/CONTRIBUTORS.rst b/payment_redsys_preauth/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..e466f95 --- /dev/null +++ b/payment_redsys_preauth/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Criptomart `_: + + * Santi Noreña diff --git a/payment_redsys_preauth/readme/DESCRIPTION.rst b/payment_redsys_preauth/readme/DESCRIPTION.rst new file mode 100644 index 0000000..2604a50 --- /dev/null +++ b/payment_redsys_preauth/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria. diff --git a/payment_redsys_preauth/readme/INSTALL.rst b/payment_redsys_preauth/readme/INSTALL.rst new file mode 100644 index 0000000..e69de29 diff --git a/payment_redsys_preauth/readme/ROADMAP.rst b/payment_redsys_preauth/readme/ROADMAP.rst new file mode 100644 index 0000000..78f45e5 --- /dev/null +++ b/payment_redsys_preauth/readme/ROADMAP.rst @@ -0,0 +1,9 @@ +De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido +resultante (``Ds_Order``) es de 12 caracteres. Este addon trunca dicho +dato en el comienzo de la transacción, con el resultado de que, aunque Redsys +la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará +un Error 500 a Redsys. +Para evitar esto, es recomendable seleccionar secuencias de pedido que se +ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la +referencia un número extendido a partir del pedido, que incluye un guion y un +número secuencial para posibles repeticiones de pago. diff --git a/payment_redsys_preauth/static/description/icon.png b/payment_redsys_preauth/static/description/icon.png new file mode 100644 index 0000000..b25df9b Binary files /dev/null and b/payment_redsys_preauth/static/description/icon.png differ diff --git a/payment_redsys_preauth/static/description/index.html b/payment_redsys_preauth/static/description/index.html new file mode 100644 index 0000000..f67caf6 --- /dev/null +++ b/payment_redsys_preauth/static/description/index.html @@ -0,0 +1,480 @@ + + + + + +Pasarela de pago Redsys con preautorización + + + +
+

Pasarela de pago Redsys con preautorización

+ + +

Beta License: AGPL-3 Criptomart/foodcoopbcn

+

Este módulo añade la opción de pago a través de la pasarela de Redsys con preautorización con tarjeta bancaria.

+

Table of contents

+ +
+

Configuration

+
+

Parámetros

+
    +
  • Nombre del comercio: Indicaremos el nombre del comercio.
  • +
  • Número de comercio (FUC): Indicaremos el número de comercio que +nuestra entidad nos ha comunicado.
  • +
  • Clave secreta de encriptación: Indicaremos la clave de encriptación +que tiene el comercio.
  • +
  • Número de terminal: Indicaremos el terminal del TPV.
  • +
  • Tipo de firma: Seleccionaremos el tipo de firma del comercio.
  • +
  • Tipo de moneda: Seleccionaremos la moneda de nuestro terminal TPV +(Normalmente EUR - Euros).
  • +
  • Tipo de transacción: Indicaremos el tipo de transacción, 1.
  • +
  • Idioma TPV: Indicaremos el idioma en el TPV.
  • +
  • Método de pago: Indicaremos que tipo de pago se debe aceptar, pago con +tarjeta, Bizum u otro de los disponibles.
  • +
  • URL_OK/URL_KO: Durante el proceso del pago, y una vez que +se muestra al cliente la pantalla con el resultado del mismo, es +posible redirigir su navegador a una URL para las transacciones +autorizadas y a otra si la transacción ha sido denegada. A éstas +se las denomina URL_OK y URL_KO, respectivamente. Se trata +de dos URLs que pueden ser proporcionadas por el comercio.
  • +
  • Porcentaje de pago: Indicar el porcentaje de pago que se permite, si +se deja a 0.0 se entiende 100%.
  • +
+
+
+

Nota

+

Se tiene que verificar la configuración del comercio en el +módulo de administración de Redsys, donde la opción “Parámetros en las +URLs” debe tener el valor “SI”.

+

En caso de que exista más de una base de datos en la instalación, cuando la +pasarela de pago envía el formulario a “/payment/redsys/return” odoo no sabe +con que base de datos procesar esta información, por lo que hay que establecer +los parametros dbfilter y dbname en el archivo de configuración.

+

Para mostrar simultáneamente en el comercio electrónico varios de los métodos +de pago que proporciona Redsys, como pago con tarjeta y Bizum por ejemplo, +debemos duplicar el medio de pago y escoger en el campo método de pago el que +corresponda en cada caso.

+

En los pagos con preautorización, el titular del TPV deberá solicitar al banco su activación.

+
+
+
+

Known issues / Roadmap

+

De acuerdo a los requisitos de Redsys, el tamaño máximo del número de pedido +resultante (Ds_Order) es de 12 caracteres. Este addon trunca dicho +dato en el comienzo de la transacción, con el resultado de que, aunque Redsys +la aceptará, no se finalizará el pedido pedido en Odoo al retornar y entregará +un Error 500 a Redsys. +Para evitar esto, es recomendable seleccionar secuencias de pedido que se +ajusten a esta limitación, en particular de 10 o menos caracteres, al ser la +referencia un número extendido a partir del pedido, que incluye un guion y un +número secuencial para posibles repeticiones de pago.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Criptomart
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the Criptomart/foodcoopbcn project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/payment_redsys_preauth/static/img/bizum.png b/payment_redsys_preauth/static/img/bizum.png new file mode 100644 index 0000000..8af46a7 Binary files /dev/null and b/payment_redsys_preauth/static/img/bizum.png differ diff --git a/payment_redsys_preauth/static/src/img/redsys_icon.png b/payment_redsys_preauth/static/src/img/redsys_icon.png new file mode 100644 index 0000000..e9ddbae Binary files /dev/null and b/payment_redsys_preauth/static/src/img/redsys_icon.png differ