Skip to content

Commit

Permalink
[ADD] payment_mercadopago: MercadoPago Redirect
Browse files Browse the repository at this point in the history
  • Loading branch information
bruno-zanotti committed Apr 5, 2021
1 parent 82960a9 commit c1000ff
Show file tree
Hide file tree
Showing 9 changed files with 298 additions and 25 deletions.
4 changes: 3 additions & 1 deletion payment_mercadopago/__manifest__.py
Expand Up @@ -2,8 +2,10 @@
{
'name': 'MercadoPago Payment Acquirer',
'category': 'Accounting/Payment',
'summary': 'Payment Acquirer: MercadoPago Implementation',
'summary': 'Payment Acquirer: MercadoPago',
'version': '13.0.1.0.0',
'author': 'ADHOC SA',
'website': 'www.adhoc.com.ar',
'description': """MercadoPago Payment Acquirer""",
'depends': ['payment'],
'external_dependencies': {
Expand Down
55 changes: 52 additions & 3 deletions payment_mercadopago/controllers/main.py
Expand Up @@ -3,19 +3,68 @@
# directory
##############################################################################

# import pprint
import logging

import pprint
import werkzeug
from odoo import http
from odoo.http import request
from odoo.tools.safe_eval import safe_eval
from odoo.addons.payment_mercadopago.models.mercadopago_request import MercadoPagoAPI
from urllib import parse

# TODO: remove
from ..static.sdkpython.mercadopago import mercadopago
_logger = logging.getLogger(__name__)


class MercadoPagoController(http.Controller):

# MercadoPago redirect controller
_success_url = '/payment/mercadopago/success/'
_pending_url = '/payment/mercadopago/pending/'
_failure_url = '/payment/mercadopago/failure/'
_create_preference_url = '/payment/mercadopago/create_preference'

@http.route(['/payment/mercadopago/create_preference'], type='http', auth="none", csrf=False)
def mercadopago_create_preference(self, **post):
# TODO podriamos pasar cada elemento por separado para no necesitar
# el literal eval
# mercadopago_data = safe_eval(post.get('mercadopago_data', {}))
acquirer = request.env['payment.acquirer'].browse(safe_eval(post.get('acquirer_id'))).sudo()
mercadopago_preference = safe_eval(post.get('mercadopago_preference'))

if not acquirer:
return werkzeug.utils.redirect("/")

# TODO: Remove this with sdk 1.2.0
if (not mercadopago_preference or not acquirer.mercadopago_secret_key or not acquirer.mercadopago_client_id):
_logger.warning('Missing parameters!')
return werkzeug.utils.redirect("/")

MP = mercadopago.MP(acquirer.mercadopago_client_id, acquirer.mercadopago_secret_key)
MP.sandbox_mode(True) if acquirer.state == "enabled" else MP.sandbox_mode(False)
resp = MP.post("/checkout/preferences", mercadopago_preference)
linkpay = resp['response']['init_point'] if acquirer.state == "enabled" else resp['response']['sandbox_init_point']
# TODO: We should do this with skd 1.2.0
# MP = MercadoPagoAPI(acquirer)
# linkpay = MP.create_preference(mercadopago_preference)
return werkzeug.utils.redirect(linkpay)

@http.route([
'/payment/mercadopago/success',
'/payment/mercadopago/pending',
'/payment/mercadopago/failure'
], type='http', auth="none")
def mercadopago_back_no_return(self, **post):
"""
Odoo, si usas el boton de pago desde una sale order o email, no manda
una return url, desde website si y la almacena en un valor que vuelve
desde el agente de pago. Como no podemos mandar esta "return_url" para
que vuelva, directamente usamos dos distintas y vovemos con una u otra
"""
_logger.info('Mercadopago: entering mecadopago_back with post data %s', pprint.pformat(post))
request.env['payment.transaction'].sudo().form_feedback(post, 'mercadopago')
return werkzeug.utils.redirect("/payment/process")

@http.route(['/payment/mercadopago/s2s/create_json_3ds'], type='json', auth='public', csrf=False)
def mercadopago_s2s_create_json_3ds(self, verify_validity=False, **kwargs):
if not kwargs.get('partner_id'):
Expand Down
17 changes: 7 additions & 10 deletions payment_mercadopago/data/payment_acquirer_data.xml
Expand Up @@ -3,21 +3,21 @@

<record id="payment_acquirer_mercadopago" model="payment.acquirer">
<field name="name">MercadoPago</field>
<field name="display_as">Credit Card (powered by MercadoPago)</field>
<field name="provider">mercadopago</field>
<field name="company_id" ref="base.main_company"/>
<!-- <field name="sequence">3</field> -->
<field name="mercadopago_publishable_key">dummy</field>
<field name="mercadopago_access_token">dummy</field>
<field name="check_validity">True</field>
<field name="image_128" type="base64" file="payment_mercadopago/static/description/icon.png"/>
<field name="display_as">Credit Card (powered by MercadoPago)</field>
<field name="payment_icon_ids" eval='[(6, 0, [ref("payment.payment_icon_cc_american_express"),
ref("payment.payment_icon_cc_mastercard"),
ref("payment.payment_icon_cc_visa")])]'/>
<field name="payment_flow">s2s</field>
<field name="view_template_id" ref="mercadopago_form"/>
<field name="registration_view_template_id" ref="mercadopago_s2s_form"/>
<field name="image_128" type="base64" file="payment_mercadopago/static/description/icon.png"/>
<field name="check_validity">True</field>
<field name="module_id" ref="base.module_payment_mercadopago"/>
<field name="description" type="html">
<p>
A payment gateway to accept online payments via credit cards and e-checks.
A payment platform to accept online payments.
</p>
<ul class="list-inline">
<li class="list-inline-item"><i class="fa fa-check"/>Online Payment</li>
Expand All @@ -28,8 +28,5 @@
<li class="list-inline-item"><i class="fa fa-check"/>Embedded Credit Card Form</li>
</ul>
</field>
<field name="payment_icon_ids" eval='[(6, 0, [ref("payment.payment_icon_cc_american_express"),
ref("payment.payment_icon_cc_mastercard"),
ref("payment.payment_icon_cc_visa")])]'/>
</record>
</odoo>
27 changes: 27 additions & 0 deletions payment_mercadopago/demo/payment_acquirer_demo.xml
Expand Up @@ -6,4 +6,31 @@
<field name="mercadopago_access_token">TEST-2775253347293690-081210-4dede21e22738444d5fe2f092ee478f3__LC_LB__-113996959</field>
</record>

<record id="payment_acquirer_mercadopago_redirect" model="payment.acquirer">
<field name="name">MercadoPago Redirect</field>
<field name="provider">mercadopago</field>
<field name="company_id" ref="base.main_company"/>
<field name="image_128" type="base64" file="payment_mercadopago/static/description/icon.png"/>
<field name="mercadopago_client_id">2285999378925428</field>
<field name="mercadopago_secret_key">BRiYAPa3QAozapMpIFcT1JmilVAYOHNz</field>
<field name="display_as">MercadoPago (redirect)</field>
<field name="view_template_id" ref="mercadopago_form"/>
<field name="fees_active" eval="True"/>
<field name="description" type="html">
<p>
A payment platform to accept online payments.
</p>
<ul class="list-inline">
<li class="list-inline-item"><i class="fa fa-check"/>Online Payment</li>
<li class="list-inline-item"><i class="fa fa-check"/>Payment Status Tracking</li>
</ul>
</field>
<field name="pre_msg"><![CDATA[
<p>You will be redirected to the MercadoPago website after cliking on the payment button.</p>]]>
</field>
<field name="pending_msg"><![CDATA[
<p>Pendiente de acreditación. Su pago todavía no ha sido confirmado por Mercadopago, le informaremos cuando esto suceda y validaremos el pedido.</p>]]>
</field>
</record>

</odoo>
18 changes: 16 additions & 2 deletions payment_mercadopago/models/mercadopago_request.py
Expand Up @@ -19,7 +19,8 @@ class MercadoPagoAPI():

def __init__(self, acquirer):
self.mp = mercadopago.MP(acquirer.mercadopago_access_token)
self.mp.sandbox_mode(False) if acquirer.state == "prod" else self.mp.sandbox_mode(True)
self.mp.sandbox_mode(False) if acquirer.state == "enabled" else self.mp.sandbox_mode(True)
self.sandbox = not acquirer.state == "enabled"
self.mp.set_platform_id("BVH38T5N7QOK0PPDGC2G")

def check_response(self, resp):
Expand All @@ -41,6 +42,18 @@ def check_response(self, resp):
'err_msg': "Server Error"
}

# Preference
def create_preference(self, preference):
resp = self.mp.create_preference(preference)
if self.sandbox:
_logger.info('Preference Result:\n%s' % resp)
resp = self.check_response(resp)

if resp.get('err_code'):
raise UserError(_("MercadoPago Error:\nCode: %s\nMessage: %s" % (resp.get('err_code'), resp.get('err_msg'))))
else:
return resp['sandbox_init_point'] if self.sandbox else resp['init_point']

# Customers
def get_customer_profile(self, email):
resp = self.mp.get('/v1/customers/search?%s' % email)
Expand All @@ -64,7 +77,6 @@ def create_customer_profile(self, email):
# Cards
def get_customer_cards(self, customer_id):
resp = self.mp.get('/v1/customers/%s/cards' % customer_id)
import pdb; pdb.set_trace()
resp = self.check_response(resp)
if type(resp) != list and resp.get('err_code'):
raise UserError(_("MercadoPago Error:\nCode: %s\nMessage: %s" % (resp.get('err_code'), resp.get('err_msg'))))
Expand Down Expand Up @@ -123,6 +135,8 @@ def payment(self, acquirer, token, amount, capture=True, cvv_token=None):
values.update({"payer": {"type": 'customer', 'id': customer_id}})

resp = self.mp.post("/v1/payments", values)
if self.sandbox:
_logger.info('Payment Result:\n%s' % resp)
resp = self.check_response(resp)
if resp.get('err_code'):
raise UserError(_("MercadoPago Error:\nCode: %s\nMessage: %s" % (resp.get('err_code'), resp.get('err_msg'))))
Expand Down

0 comments on commit c1000ff

Please sign in to comment.