Capturando pagos de Mercadopago

3 de noviembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Mercadopago se está transformando (si es que no lo es) en el medio de pago más común utilizado en Argentina. A nivel personal, lo utilizo todos los días y ya todos los comercios y empresas de una u otra manera procesan dichos pagos. Solo las empresas que trabajan en un entorno b2b no lo hacen, se manejan más con cheques y transferencias bancarias. Ahora, para el resto de los mortales que estamos felices viendo Masterchef, nos queda Mercadopago.

Bien, sabemos de la conveniencia de Mercadopago y también de sus costos. Ahora, como hacemos para capturar dichos pagos desde Odoo? No es complicado. Vamos a continuar el post de crear un link de pago con el botón de mercadopago para mostrar como capturar un pago utilizando la preferencia creada en el post anterior.

Lo primero que tenemos que hacer es importar el SDK de mercadopago (podríamos utilizar requests, pero para que reinventar la rueda? al fin y al cabo, a diferencia del SDK de mercadolibre este SDK aun está mantenido).

import mercadopago  

Luego, obtenemos de la tabla de parámetros el key de mercadopago (el cual obtenemos en la página de Desarrolladores de Mercadopago)

mercadopago_key = self.env['ir.config_parameter'].get_param(
'mercadopago_key', default=False)

Para luego establecer los filtros de búsqueda. En este caso utilizaremos el external reference creado en el botón de mercadopago. Pero los filtros pueden ser múltiples; por ejemplo con fecha desde y fecha hasta. Quiero aclarar que meli_oerp usa un método distinto; primero no utiliza el SDK (utiliza requests para obtener la información) y luego como ya tiene el ID del pago, obtiene mediante el endpoint payments la información del pago.

Bien, habiendo definido el filtro solo tenemos que hacer la búsqueda de los pagos, lo cual lo hacemos mediante el método search del SDK

response = sdk.payment().search(filters)
results = response["response"]["results"]

En la variable results tendremos la información de los pagos. Paso seguido, lo que podemos hacer es crear el pago (en un diario llamado Mercado Pago) y confirmarlo.

journal_id = self.env['account.journal'].search([('name','=','Mercado Pago')],limit=1)
if not journal_id:
raise ValidationError('No se encuentra el diario Mercado Pago')
if not journal_id.inbound_payment_method_line_ids:
raise ValidationError('Falta configurar el diario Mercado Pago')
payment_method_line_id = journal_id.inbound_payment_method_line_ids[0]
results = results[0]
external_reference = results.get('external_reference')
model,inv_id = external_reference.split('-')
inv_id = self.env['account.move'].browse(int(inv_id))
vals = {
'name': 'MP %s'%(results.get('external_reference')),
'journal_id': journal_id.id,
'payment_method_line_id': payment_method_line_id.id,
'amount': results.get('transaction_amount'),
'ref': results.get('external_reference'),
'partner_id': self.partner_id.id,
'partner_type': 'customer',
'payment_type': 'inbound',
'mp_invoice_id': inv_id.id,
'mercadopago_id': results.get('id'),
'mercadopago_result': str(results),
}
domain = [('mercadopago_id','=',results.get('id'))]
payment_id = self.env['account.payment'].search(domain)
if not payment_id:
payment_id = self.env['account.payment'].create(vals)
payment_id.action_post()

Como pueden ver, buscamos el diario de Mercado Pago y procedemos a crear el pago del cliente. Solo completamos un par de campos más creados para mercadopago, como el id de mercadopago (con el payment ID del pago) y el resultado, donde almacenamos el json retornado por Mercadopago. Tengamos en cuenta que el partner lo estoy tomando de la factura con link de Mercadopago. Si no contamos con la información del partner, el pago mismo trae una sección de payer_id con los datos del pagador (de donde podemos deducir quien es el partner)

"payer": {
"email": "gustavo.orrillo@gmail.com",
"entity_type": None,
"first_name": None,
"id": "36064836",
"identification": {"number": "20230080217", "type": "CUIT"},
"last_name": None,
"operator_id": None,
"phone": {"number": None, "extension": None, "area_code": None},
"type": None,
},

Por último se confirma el pago, y si queremos podemos conciliar el pago con la factura de pago correspondiente.


Gustavo Orrillo 3 de noviembre de 2025
Compartir
Categorías
Archivar
Identificarse dejar un comentario