Skip to content

Commit e27fb35

Browse files
Merge pull request #9 from pruebasepayco/13.0
13.0
2 parents e439ff7 + 9ef0888 commit e27fb35

File tree

7 files changed

+176
-17
lines changed

7 files changed

+176
-17
lines changed

payment_epayco/README.rst

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Installation
3131

3232
Para instalar este modulo necesita:
3333

34-
1. Agregar el directorio clonado de este repositorio a la ruta de addons de la instancia de Odoo.
34+
1. Agregar el directorio clonado de este repositorio a la ruta de addons de la instancia de Odoo.
3535
2. Ir a la base de datos y actualizar la lista de aplicaciones.
3636
3. Instalar el modulo payment_epayco.
3737

@@ -43,17 +43,7 @@ Configuration
4343
* Ir al método de pago ePayco y presionar el botón "Activar".
4444
* En la tab de "Credenciales" colocar los datos correspondientes a los campos P_CUST_ID_CLIENTE, P_KEY y PUBLIC_KEY, los cuales los puede conseguir en su dashboard de ePayco en el menú de Integraciones / Llaves API en la seccion "LLaves secretas".
4545

46-
*En la tab "Configuración" establecer lo siguiente:*
47-
48-
* Diario de pago.
49-
50-
* Por defecto el método de pago estará disponible solo para usuarios que estén ubicados en Colombia, si este no es el caso déjelo abierto para todos los países en el campo "Países".  * Tipo de Checkout: Por defecto sera Onpage Checkout. Revisar en la documentación los dos posibles modos de checkout que ofrece ePayco https://docs.epayco.co/payments/checkout.
51-
52-
* Franquicias: por defecto el modulo carga las franquicias actuales que soporta ePayco pero si en algún momento cambia alguna de estas, se puede configurar en esta sección. Tomar en cuenta que el valor del campo código debe ser exactamente igual al código que tenga la franquicia en ePayco. Para mayor detalle mirar la tabla de franquicias en el siguiente link https://docs.epayco.co/payments/checkout.
53-
5446
* Estados de transacción: Por defecto el modulo hace una asociación entre los distintos estados de transacciones de ePayco y los estados de transacciones de Odoo. Revisar si este mapeo inicial se adapta a su lógica de negocio debido a que dependiendo del estado de la transacción Odoo manejara el flujo del pedido de venta, para mas detalle consultar: https://www.odoo.com/documentation/user/12.0/ecommerce/shopper_experience/payment_acquirer.html. Para mas detalles sobre los códigos de estados de transacción de ePayco mirar la tabla "Códigos de respuesta" en el siguiente link https://docs.epayco.co/payments/checkout.
55-
56-
* Tipos de documento: Al igual que con los estados de transacción esta es una asociación entre los tipos de documentos de ePayco y los tipos de documentos cargados por el modulo de la localización. Revisar los tipos de documentos de ePayco en la tabla "Tipos de documento" en el siguiente link https://docs.epayco.co/payments/checkout. Para mayor detalle sobre los tipos de documentos en Odoo mirar el siguiente link https://github.com/odoo/odoo/blob/1c3d51283edfbe9b7339690515189f2b06cc82dc/addons/l10n_co/models/res_partner.py#L9.
5747

5848
* Para hacer el método de pago disponible en el ecommerce, pulsar el botón Publicar.
5949

@@ -85,15 +75,11 @@ Authors
8575
Contributors
8676
~~~~~~~~~~~~
8777

88-
* Manuel Marquez <buzondemam@gmail.com>
78+
* Ricardo Saldarriaga <ricardo.saldarriaga@payco.co>
8979

9080
Other credits
9181
~~~~~~~~~~~~~
9282

93-
Functional QA:
94-
95-
* Alfredo Marino <amarino@gsiconsultoria.com>
96-
9783
Maintainers
9884
~~~~~~~~~~~
9985

payment_epayco/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
from . import models
55
from . import controllers
6+
from odoo.addons.payment.models.payment_acquirer import (
7+
create_missing_journal_for_acquirers,
8+
)
9+
610
from odoo.addons.payment.models.payment_acquirer import create_missing_journal_for_acquirers
711
from odoo.addons.payment import reset_payment_provider
812

payment_epayco/__manifest__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
# -*- coding: utf-8 -*-
2+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
3+
# -*- coding: utf-8 -*-
4+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
25

36
{
47
'name': 'Epayco Payment Acquirer',
58
'category': 'Accounting/Payment',
9+
'summary': 'Payment Acquirer: Epayco Implementation',
10+
'description': """
11+
Epayco Payment Acquirer for India.
12+
Epayco payment gateway supports only INR currency.
13+
""",
614
'sequence': 365,
715
'summary': 'Payment Acquirer: Epayco Implementation',
816
'version': '1.0',
@@ -13,6 +21,7 @@
1321
'views/payment_epayco_templates.xml',
1422
'data/payment_acquirer_data.xml',
1523
],
24+
'post_init_hook': 'create_missing_journal_for_acquirers',
1625
'installable': True,
1726
'application': True,
1827
'post_init_hook': 'create_missing_journal_for_acquirers',
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" ?>
2+
<odoo>
3+
<template id="mail_template_epayco_invite_user_to_configure">
4+
<div>
5+
<p>
6+
Hello,
7+
<br/><br/>
8+
You have received a payment through PayPal.<br/>
9+
Kindly follow the instructions given by PayPal to create your account.<br/>
10+
Then, help us complete your Paypal credentials in Odoo.<br/><br/>
11+
</p>
12+
<a t-attf-href="/web#id=#{acquirer.id}&amp;model=payment.acquirer&amp;view_type=form" style="background-color: #875A7B; padding: 10px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 12px;">Set Paypal credentials</a>
13+
<p>
14+
<br/><br/>
15+
Thanks,<br/>
16+
<b>The Odoo Team</b>
17+
</p>
18+
</div>
19+
</template>
20+
</odoo>

payment_epayco/models/payment.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# -*- coding: utf-8 -*-
2+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
3+
4+
import hashlib
5+
import uuid
6+
17
# coding: utf-8
28

39
import json
@@ -9,6 +15,18 @@
915

1016
from odoo import api, fields, models, _
1117
from odoo.addons.payment.models.payment_acquirer import ValidationError
18+
from odoo.tools.float_utils import float_compare
19+
20+
21+
import logging
22+
23+
_logger = logging.getLogger(__name__)
24+
25+
26+
class PaymentAcquirerEpayco(models.Model):
27+
_inherit = 'payment.acquirer'
28+
provider = fields.Selection(selection_add=[('epayco', 'Epayco')])
29+
1230
from odoo.addons.payment_epayco.controllers.main import EpaycoController
1331
from odoo.tools.float_utils import float_compare
1432

@@ -77,11 +95,45 @@ def epayco_get_form_action_url(self):
7795
return '/payment/epayco/checkout/'
7896

7997

98+
def _epayco_generate_sign(self, values):
99+
""" Generate the shasign for incoming or outgoing communications.
100+
:param self: the self browse record. It should have a shakey in shakey out
101+
:param string inout: 'in' (odoo contacting epayco) or 'out' (epayco
102+
contacting odoo).
103+
:param dict values: transaction values
104+
105+
:return string: shasign
106+
"""
107+
self.ensure_one()
108+
p_cust_id_client = self.epayco_merchant_id
109+
p_key = self.epayco_p_key
110+
x_ref_payco = values.get('x_ref_payco')
111+
x_transaction_id = values.get('x_transaction_id')
112+
x_amount = values.get('x_amount')
113+
x_currency_code = values.get('x_currency_code')
114+
hash_str_bytes = bytes('%s^%s^%s^%s^%s^%s' % (
115+
self.p_cust_id_cliente,
116+
p_key,
117+
x_ref_payco,
118+
x_transaction_id,
119+
x_amount,
120+
x_currency_code), 'utf-8')
121+
hash_object = hashlib.sha256(hash_str_bytes)
122+
hash = hash_object.hexdigest()
123+
return hash
124+
125+
80126
class PaymentTransactionEpayco(models.Model):
81127
_inherit = 'payment.transaction'
82128

83129
@api.model
84130
def _epayco_form_get_tx_from_data(self, data):
131+
""" Given a data dict coming from epayco, verify it and find the related
132+
transaction record. """
133+
reference = data.get('x_extra1')
134+
signature = data.get('x_signature')
135+
if not reference or not reference or not signature:
136+
raise ValidationError(_('Epayco: received data with missing reference (%s) or signature (%s)') % (reference, signature))
85137
reference = data.get('x_extra1')
86138
signature = data.get('x_signature')
87139
if not reference or not reference or not signature:
@@ -102,20 +154,25 @@ def _epayco_form_get_tx_from_data(self, data):
102154
signature = data.get('x_signature')
103155
shasign_check = transaction.acquirer_id._epayco_generate_sign(data)
104156
if shasign_check != signature:
157+
raise ValidationError(_('Epayco: invalid signature, received %s, computed %s, for data %s') % (signature, shasign_check, data))
105158
raise ValidationError(_('Epayco: invalid signature, received %s, computed %s, for data %s') % (
106159
signature, shasign_check, data))
107160
return transaction
108161

109162
def _epayco_form_get_invalid_parameters(self, data):
110163
invalid_parameters = []
164+
if self.acquirer_reference and data.get('x_transaction_id') != self.acquirer_reference:
165+
invalid_parameters.append(
166+
('Transaction Id', data.get('x_transaction_id'), self.acquirer_reference))
167+
#check what is buyed
168+
if int(self.acquirer_id.epayco_merchant_id) != int(data.get('x_cust_id_cliente')):
111169
if self.acquirer_reference and data.get('x_transaction_id') != self.acquirer_reference:
112170
invalid_parameters.append(
113171
('Transaction Id', data.get('x_transaction_id'), self.acquirer_reference))
114172
# check what is buyed
115173
if int(self.acquirer_id.epayco_merchant_id) != int(data.get('x_cust_id_cliente')):
116174
invalid_parameters.append(
117175
('Customer ID', data.get('x_cust_id_cliente'), self.acquirer_id.epayco_merchant_id))
118-
119176
return invalid_parameters
120177

121178
def _epayco_form_validate(self, data):

payment_epayco/views/payment_epayco_templates.xml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,68 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<odoo>
3+
<template id="epayco_form">
4+
<input type="hidden" name="data_set" t-att-data-action-url="tx_url" data-remove-me=""/>
5+
<input type="hidden" name="public_key" t-att-value='public_key' />
6+
<input type="hidden" name="txnid" t-att-value='txnid' />
7+
<input type="hidden" name="amount" t-att-value='amount' />
8+
<input type="hidden" name="productinfo" t-att-value='productinfo' />
9+
<input type="hidden" name="firstname" t-att-value='firstname' />
10+
<input type="hidden" name="email" t-att-value='email' />
11+
<input type="hidden" name="phone" t-att-value='phone'/>
12+
<input type="hidden" name="currency_code" t-att-value='currency_code'/>
13+
<input type="hidden" name="country_code" t-att-value='country_code'/>
14+
<input type="hidden" name="epayco_checkout_external" t-att-value='epayco_checkout_external'/>
15+
<input type="hidden" name="epayco_env_test" t-att-value='epayco_env_test'/>
16+
<input type="hidden" name="epayco_lang" t-att-value='epayco_lang'/>
17+
<input type="hidden" name="response_url" t-att-value='response_url'/>
18+
<input type="hidden" name="url_confirmation" t-att-value='url_confirmation'/>
19+
<input type="hidden" name="extra1" t-att-value='extra1'/>
20+
<input type="hidden" name="extra2" t-att-value='extra2'/>
21+
</template>
22+
23+
<template id="checkout">
24+
<t t-call="website.layout">
25+
<div id="wrap">
26+
<div class="oe_structure oe_empty">
27+
<div class="container">
28+
<p style="margin-top: 10px;">Cargando medios de pago de ePayco...</p>
29+
<p>Si no se cargan automáticamente, de clic en el botón "Pagar con ePayco".</p>
30+
<div class="loader">
31+
<span class="sr-only">Loading...</span>
32+
</div>
33+
<div id="form-button-container">
34+
<form>
35+
<script
36+
src="https://checkout.epayco.co/checkout.js"
37+
class="epayco-button"
38+
t-att-data-epayco-key="public_key"
39+
t-att-data-epayco-amount="amount"
40+
t-att-data-epayco-tax="amount_tax"
41+
t-att-data-epayco-tax-base="amount_untaxed"
42+
t-att-data-epayco-name="txnid"
43+
t-att-data-epayco-description="txnid"
44+
t-att-data-epayco-invoice="txnid"
45+
t-att-data-epayco-extra1="extra1"
46+
t-att-data-epayco-extra3="currency_code"
47+
t-att-data-epayco-currency="currency_code"
48+
t-att-data-epayco-country="country_code"
49+
t-att-data-epayco-external="epayco_checkout_external"
50+
t-att-data-epayco-test="epayco_env_test"
51+
t-att-data-epayco-lang="epayco_lang"
52+
t-att-data-epayco-email-billing="email"
53+
t-att-data-epayco-name-billing="firstname"
54+
t-att-data-epayco-response="response_url"
55+
t-att-data-epayco-confirmation="url_confirmation"
56+
t-att-data-epayco-extra2="productinfo"
57+
>
58+
</script>
59+
</form>
60+
</div>
61+
</div>
62+
</div>
63+
</div>
64+
</t>
65+
</template>
366
<data noupdate="1">
467
<template id="epayco_form">
568
<input type="hidden" name="data_set" t-att-data-action-url="tx_url" data-remove-me=""/>

payment_epayco/views/payment_views.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<odoo>
3+
<record id="payment_acquirer_form_epayco" model="ir.ui.view">
4+
<field name="name">payment.acquirer.form.inherit</field>
5+
<field name="model">payment.acquirer</field>
6+
<field name="inherit_id" ref="payment.acquirer_form"/>
7+
<field name="arch" type="xml">
8+
9+
<xpath expr="//group[@name='acquirer']" position='after'>
10+
<group string="Credentials ePayco" attrs="{'invisible': [('provider', '!=', 'epayco')]}">
11+
<field name="epayco_p_cust_id"/>
12+
<field name="epayco_p_key"/>
13+
<field name="epayco_public_key"/>
14+
</group>
15+
</xpath>
16+
17+
<xpath expr="//group[@name='acquirer_config']" position="inside">
18+
<field name="epayco_checkout_type" attrs="{'invisible': [('provider', '!=', 'epayco')]}"/>
19+
</xpath>
20+
21+
</field>
22+
</record>
323
<data>
424
<record id="acquirer_form_epayco" model="ir.ui.view">
525
<field name="name">acquirer.form.epayco</field>

0 commit comments

Comments
 (0)