Agregando links de pagos de Mercadopago a los mails

17 de octubre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Días atrás tuve que agregar links de pago de Mercadopago a los mails enviados por un cliente. Resulto ser mucho más facil de lo que esperaba, así que les comparto mi experiencia.

Antes que nada se debe obtener el API Key de la página de developers de Mercadopago donde debemos crear una aplicación para obtener el API key. Paso seguido, para trabajar con Mercadopago vamos a necesitar exponer unos endpoints en nuestro Odoo. Para ello creamos los controllers necesarios:

class MercadoPagoController(http.Controller):

@http.route('/mercadopago/success', type='http', auth='public', csrf=False)
def mp_success(self, **kwargs):
_logger.info(" MercadoPago SUCCESS: %s", kwargs)
return "Payment Successful"

@http.route('/mercadopago/failure', type='http', auth='public', csrf=False)
def mp_failure(self, **kwargs):
_logger.warning(" MercadoPago FAILURE: %s", kwargs)
return "Payment Failed"

@http.route('/mercadopago/pending', type='http', auth='public', csrf=False)
def mp_pending(self, **kwargs):
_logger.info(" MercadoPago PENDING: %s", kwargs)
return "Payment Pending"

Luego lo que hay que hacer es utilizar el SDK de mercadopago, el cual actua como un wrapper del API de mercadopago, abstrayendolo del montón de llamadas que haríamos con requests.

import mercadopago

Después para crear un link de mercadopago vamos a crear un método que crea el link. Luego dicho método podrá ser invocado al momento de clickear un botón, con una acción de servidor, o al confirmar la factura.

    def mercadopago_create_preference(self):
# preference api description
# https://www.mercadopago.com.ar/developers/es/reference/preferences/_checkout_preferences/post/
# to-do: add suport to back_urls expires
#mercadopago_client = self.env['ir.config_parameter'].get_param(
# 'mercadopago_client', default=False)
self.ensure_one()
if self.move_type != 'out_invoice':
self.message_post(body='No se puede generar link debido a que el doc no es factura')
return False
if self.state != 'posted' or self.amount_residual_signed == 0:
self.message_post(body='No se puede generar link debido a que el doc no es factura')
return False
if not self.partner_id or not self.partner_id.email:
self.message_post(body='No se puede generar link debido a que el doc no tiene email')
return False
mercadopago_key = self.env['ir.config_parameter'].get_param(
'mercadopago_key', default=False)

if mercadopago_key:
#mp = mercadopago.MP(mercadopago_client, mercadopago_key)
sdk = mercadopago.SDK(mercadopago_key)

Como pueden ver, obtenemos el KEY del API de un parámetro que tenemos almacenado en los parámetros de Odoo. Paso seguido, creamos un objeto SDK para interactuar con el sdk. 

Para crear un link de pago debemos crear una preferencia con la información de la factura que queremos que nos paguen:

         for obj in self:
mercadopago_items = [
{
'title': '%s'%(self.display_name),
'quantity': 1,
'currency_id': 'ARS',
'unit_price': self.amount_residual_signed
},
]
​preference_data = {
'external_reference': 'account.move-%s' % (self.id),
'payer': {"email": self.partner_id.email},
'auto_return': 'approved',
#'shipments': obj.mercadopago_shipments_dict(),
#'payment_methods': obj.mercadopago_payment_methods_dict(),
#'notification_url': obj.mercadopago_notification_url(),
'items': mercadopago_items,
'expires': True,
'expiration_date_from': str(date.today()),
'expiration_date_to': str(date.today() + timedelta(days=30)),
'payment_methods': {
"excluded_payment_types": [
{"id": "credit_card"},
{"id": "ticket"} # remove this if you want cash methods like PagoFacil/Rapipago
],
"excluded_payment_methods": [
# You can exclude specific methods like Visa, Master, etc.
# {"id": "visa"},
# {"id": "master"}
],
"default_payment_method_id": None
},
"back_urls": {
"success": "https://gustavo.com.ar/mercadopago/success",
"failure": "https://gustavo.com.ar/mercadopago/failure",
"pending": "https://gustavo.com.ar/mercadopago/pending"
},
}

Como pueden ver, en esta estructura tenemos no solo el monto que deseamos que nos paguen (en items) sino además los métodos de pago con los que queremos que nos paguen. Tambien indicamos las URLs de los controllers que definimos anteriormente. Noten la variable external reference, es el identificador externo que vamos a usar en Mercadopago para identificar el objeto que está creando el link. Esto nos permitirá conciliar la factura al momento de recibir el pago.

Por último, solo tenemos que crear la preferencia con el SDK para obtener el link de pago

preference_response = sdk.preference().create(preference_data)
preference = preference_response["response"]
self.mercadopago_link = preference.get('init_point')

El cual almacenamos en un atributo del modelo account.move. Mucho más sencillo que lo que teníamos que hacer años atrás. Podemos automatizar la creación de estos atributos extendiendo el método action_post para que cree los links al momento de validarse la factura. 

Por último, en el próximo post voy a mostrar como crear el pago de manera automática así recibimos el pago de Mercadopago, lo creamos y conciliamos con la factura.


Gustavo Orrillo 17 de octubre de 2025
Compartir
Categorías
Archivar
Identificarse dejar un comentario