Excluir métodos y tipos de pagos en MercadoPago

Para ser sinceros, la documentación de MercadoPago siempre ha sido algo tediosa de leer y eso que la han ido actualizando poco a poco. No saben qué tanto he sufrido por encontrar la documentación correcta a las llamadas a su API y apuesto a que tu también.

Dentro de MercadoPago existen las preferencias y pagos, las cuales aceptan diferentes tipos y métodos de pago, un área muy importante para nuestros usuarios.

Pero en los requerimientos de tu desarrollo te piden que sólo cobres con tarjeta de débito y crédito, nada de efectivo ni OXXO usando MercadoPago.

¿Se podrá? Claro que sí. Es algo tedioso al principio si no sabes dónde buscar, bueno más bien, sería fácil si las documentaciones estuvieran bien explicadas y escritas.

Métodos de pago

https://api.mercadopago.com/v1/payment_methods?public_key=[PUBLIC_KEY]

Si te fijas bien, la URL acepta un parámetro llamado public_key, el cual lo obtienes en esta página de MercadoPago (en la sección de Checkout Personalizado).

Si no especificas la public_key, no tendrás una respuesta válida.

{
"id": "debvisa",
"name": "Visa Débito",
"payment_type_id": "debit_card",
"status": "active",
"secure_thumbnail": "https://www.mercadopago.com/org-img/MP3/API/logos/debvisa.gif",
"thumbnail": "http://img.mlstatic.com/org-img/MP3/API/logos/debvisa.gif",
"deferred_capture": "unsupported",
"settings": [...],
"additional_info_needed": [
"cardholder_name",
"issuer_id"
],
"min_allowed_amount": 5,
"max_allowed_amount": 200000,
"accreditation_time": 2880,
"financial_institutions": [],
"processing_modes": [
"aggregator"
]
}

Con la respuesta deberás encontrar información de los siguientes métodos de pago, al menos para México:

  • Visa Débito (debvisa)
  • Mastercard Débito (debmaster)
  • Tarjeta MercadoPago (mercadopagocard)
  • American Express (amex)
  • Visa (visa)
  • Mastercard (master)
  • Citibanamex (banamex)
  • Santander (serfin)
  • OXXO (oxxo)
  • BBVA Bancomer (bancomer)

¿Quieres realizar llamadas a la API de MercadoPago con WordPress? Mira la guía para peticiones externas con WordPress.

Tipos de pago

Los tipos de pago nos sirven para identificar si queremos hacer cobros con tarjeta de débito/crédito, efectivo, tarjeta de prepago, entre otras.

Estos tipos pueden ser encontradas en éste enlace en la sección payment_type_id, y son:

  • Ticket impreso (ticket)
  • ATM (atm)
  • Tarjeta de crédito (credit_card)
  • Tarjeta de débito (debit_card)
  • Prepago (prepaid_card)

Excluyendo métodos y tipos de pago en MercadoPago

Para excluir los métodos y tipos de pago debemos construir nuestra petición, por ejemplo, para crear una preferencia debemos pasar un producto y su información:

curl -X POST \
'https://api.mercadopago.com/checkout/preferences?access_token=ACCESS_TOKEN_ENV' \
-H 'content-type:application/json' \
-d '{
"items": [
{
"title": "Dummy Item",
"description": "Multicolor Item",
"quantity": 1,
"currency_id": "ARS",
"unit_price": 10.0
}
]
}'

Muy simple, estamos haciendo un request con cURL y le enviamos datos en formato JSON (¡tiene que ser válido!)

En la documentación, podemos ver que acepta varios parámetros que podemos adjuntar al request. En este caso nos interesa más la propiedad payment_methods:

La propiedad "payment_methods" y sus atributos de MercadoPago.
La propiedad “payment_methods” y sus atributos de MercadoPago.

Como ves, acepta una propiedad llamada excluded_payment_methods y excluded_payment_types de tipo arreglo.

Pero fíjate bien, en la documentación supuestamente dice que esas propiedades aceptan un id como valor y de tipo “string“. Desde aquí la documentación ya empezó mal.

El objeto se debe construir de la siguiente forma:

curl -X POST \
'https://api.mercadopago.com/checkout/preferences?access_token=[ACCESS_TOKEN]' \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"title": "Dummy Item",
"description": "Multicolor Item",
"quantity": 1,
"currency_id": "MXN",
"unit_price": 10
}
],
"payment_methods": {
"excluded_payment_methods": [
{
"id": "oxxo"
}
],
"excluded_payment_types": [
{
"id": "atm"
}
]
}
}'

Las propiedades excluded_payment_methods y excluded_payment_types no aceptan un tipo string, si no un tipo arreglo, tal como en el ejemplo de arriba.

El resultado del POST anterior será un JSON enorme, te mostrará la información de la preferencia, pero el dato más importante para el usuario será el init_point o sandbox_init_point, el cual será la URL donde el usuario podrá pagar el producto:

https://sandbox.mercadopago.com/mlm/checkout/pay?pref_id=197664220-19dbfcb1-82d4-4b32-b6c9-01a4bfcdf399

Una preferencia de pago que solo acepta pagos con tarjeta.
Una preferencia de pago que solo acepta pagos con tarjeta.

¿Qué pasa si quiero excluir más de uno? Pues el objeto sería de esta forma:

{
"payment_methods": {
"excluded_payment_methods": [
{
"id": "oxxo"
},
{
"id": "amex"
}
],
"excluded_payment_types": [
{
"id": "atm"
},
{
"id": "debit_card"
}
]
}
}

¡Mucho ojo! Debes utilizar los ids de los métodos y tipos de pago. Si insertas el nombre del servicio, no funcionará.

¡Haz tus pruebas! Y recuerda que necesitarás tu public_key para listar los métodos de pago y access_token para crear tus pagos y/o preferencias.

Si tienes problemas o dudas, no dudes en comentar.


Escrito por Roel Magdaleno

Desarrollador Backend y Performance Engineer.


14 respuestas a “Excluir métodos y tipos de pagos en MercadoPago”

  1. Avatar de jerome
    jerome

    Hola, buen post, una pregunta, sabes como mostrar en la orden de compra el medio de pago utilizado? (woocommerce-wp), es decir, oxxo, tarjeta, etc…
    ¡Gracias!

    1. Avatar de Roel Magdaleno

      Es una buena pregunta, mira todas las peticiones de pago de MercadoPago generan dos valores en sus resultados:

      payment_type_id y payment_method_id

      Es más que probable que el plugin de WooCommerce o MercadoPago para WP también almacene esos datos en alguna parte de la base de datos de WP. Pero los valores que te menciono, comúnmente contiene lo que tu necesitas. Y pues para mostrarlo en la orden de compra del usuario debería haber un “filter” hook para adjuntar ese dato. Es cosa de leer el plugin que te genera la orden de pago y encontrar dónde exactamente podrías agregar ese valor.

      Si no sabes que es un filter hook, lee aquí, pero en resumen son funciones que permiten cambian el resultado antes de mandarlo al usuario.

      Saludos. 🙂

  2. Avatar de Geovanni Diaz
    Geovanni Diaz

    Hola, mi nombre es Geovanni de casualidad tendras algun tutorial para implementar mercado pago con ionic 6, he intentado implementarlo pero no le entiendo bien y me esta costando mucho trabajo.

    De ante mano muchas gracias.

    1. Avatar de Roel Magdaleno

      Hola Geovanni, gracias por tu comentario. ¿Exactamente en qué no entiendes bien?

      Para serte sincero, no tengo ningún por ahora para usar MP con Ionic 6. Y no he implementado MercadoPago con una app móvil. Lo que puedes hacer es tranquilizarte e ir paso a paso con los tutoriales que da MP en su titio web:

      1. Necesitas incluir el SDK de JS:
      https://www.mercadopago.com.mx/developers/es/guides/sdks/official/js/

      2. Necesitas implementar el SDK para pagos móviles (aunque en este punto no estoy seguro si será 100% necesario):
      https://www.mercadopago.com.mx/developers/es/guides/payments/mobile-checkout/introduction/

      Es lo que se me ocurre por ahora, pero contáctame por email: roelmagdaleno@gmail.com si gustas. Espero poder ayudarte.

      Saludos.

  3. Avatar de Sergio
    Sergio

    Hola, como estas? Necesitaria un poco tu ayuda.
    Estoy generando sucursal, caja y despues los QR dinamicos de pagos con la documentacion de la API que se encuentra en: https://www.mercadopago.com.ar/developers/es/guides/in-person-payments/qr-code/qr-dynamic/integrations
    Hasta ahi, no tengo problemas, pero necesito a esto agregar restricciones de pago con determinadas tarjetas. No puedo agregar el array payment_methods a la generacion del QR ya que me da como que no lo reconoce. Como deberia hacerse?
    La idea es solo emitir el QR para imprimirlo en una factura que se envia a los clientes de la empresa mensualmente.
    Mil gracias por tu ayuda.

    1. Avatar de Roel Magdaleno

      Buen día Sergio, gracias por leer mi blog.

      Te he grabado un video, ya que la respuesta tiene que ser visual en este caso:
      https://www.loom.com/share/fdf41fc5e19b4d6d82aae48337e700e0

      Hazme saber si te ayudó. Saludos.

  4. Avatar de Mario
    Mario

    Hola!
    Muchas gracias por tu fantástico trabajo.
    Me gustaría saber si existe alguna manera de saber si el pago ha sido financiado o no. ¿Existe algún modo fiable de saberlo?
    Gracias

    1. Avatar de Roel Magdaleno

      Buen día Mario. Gracias por tu comentario.

      MercadoPago tiene este endpoint:

      https://www.mercadopago.com.mx/developers/es/reference/payments/_payments_id/get

      Si llamas a ese endpoint pasando los parámetros correctos, en la respuesta verás la propiedad installments, el cual te muestra la cantidad de cuotas seleccionadas. Y en la propiedad de transaction_details, dentro de ese valor tienes que ver el valor installment_amount, el cual es el monto de la cuota de financiación elegida.

      Espero que sea lo que estés buscando. Saludos.

  5. Avatar de carlos bernal
    carlos bernal

    hola soy carlos, estoy implementando un bot en wpp y pues ya tengo el como crear los links de pago gracias a tu tutorial, pero sabes como podria saber si ya se hizo el pago o no para que mi bot pueda enviar un mensaje de confirmacion de pago?

    1. Avatar de Roel Magdaleno

      Buen día Carlos, me da gusto que mi tutorial te haya servido.

      Ahora, de acuerdo a tu pregunta, la solución más común en ese tipo de situaciones: “detectar si ya se hizo o rechazó el pago y de acuerdo a eso ejecutar alguna acción” son los “webhook”.

      Un webhook es un sistema que está escuchando respuesta de otro servidor, en este caso MercadoPago le envía una llamada a la aplicación instalada en tu servidor. En ese momento, tu aplicación deberá ejecutar el código necesario para notificar a tu cliente (entre más cosas que se te ocurran), ya sea con correo electrónico, SMS, Slack, o en tu caso, un chat bot.

      Te dejo la documentación de cómo puedes configurar los webhook con MercadoPago.

      También, dentro de MercadoPago, existe algo llamado IPN, otro método de notificación similar al webhook. En este caso, el IPN es más enfocado a los pagos, así que en tu caso usarías el IPN. En lo personal, yo he usado IPN en un sistema de venta de boletos para conciertos y ha funcionado como debe.

      Espero te sirva la información.

      Un saludo.

  6. Avatar de Edmer
    Edmer

    Serian tan amables de indicarme como crear la preferencia para multitems de mercado pago checkout pro?, estoy trabajando con 3.0 en laravel 10 y php 8.2. La preferencia de su documentación no me reconoce:

    # Crear un objeto preferencia
    $preference = new MercadoPago\Preference();
    # Crea ítems en la preferencia
    $item1 = new MercadoPago\Item();
    $item1->title = “Item de Prueba 1”;
    $item1->quantity = 2;
    $item1->unit_price = 11.96;

    $item2= new MercadoPago\Item();
    $item2->title = “Item de Prueba 2”;
    $item2->quantity = 1;
    $item2->unit_price = 11.96;

    $preference->items = array($item1,$item2);
    # Guardar y postear la preferencia
    $preference->save();

    1. Avatar de Roel Magdaleno

      Hola Edmer, gracias por comentar.

      De acuerdo a la documentación de MercadoPago, tienes que usar la clase PreferenceClient de acuerdo al primer ejemplo. Al parecer es algo nuevo y es algo que no he probado en lo personal, así que espero pueda servirte.

      Saludos.

  7. Avatar de Francisco Beltran
    Francisco Beltran

    Hola ya no éxito la posibilidad de quitar la posibilidad de pagar con cuenta de mercado pago???
    puesto que solo quiero que se puedan hacer pagos con externos y no con cosas directas de merado pago ; espero darme a entender

    1. Avatar de Roel Magdaleno

      Hola, la verdad es que no he entendido nada de lo que has puesto. También puedo responder en inglés si eso te sirve. Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

0