Antes de comenzar, ten en cuenta que en esta versión sólo puedes integrar el SDK mobile para Argentina, México, Brasil y Colombia*.
Si necesitas integrarte desde otro lugar, puedes ver qué países soportamos en la nueva versión.

*En Colombia sólo soportamos pagos con tarjetas de crédito, por lo que deberás excluir los demás medios de pago.


Personaliza tu checkout

¿Usas Gradle? Agrégala en el build.gradle del módulo donde nos integres.

Sino descarga el SDK de Mercado Pago.

                        dependencies {
   compile 'com.mercadopago:sdk:'
}
                        
                        
                     

Medios de pago

Es la entidad participante del pago en sí misma. Desde la marca de la tarjeta, pasando por la entidad de cobro en efectivo hasta el lugar dónde se encuentra el cajero automático para que el usuario realice el pago.
Si el medio de pago pertenece a una tarjeta te brindamos la información necesaria para armar tu formulario de tarjeta y sus validaciones, por ejemplo la longitud del número de tarjeta, si el código de seguridad está al frente o al dorso de la tarjeta, su longitud, entre otros. Pero también, el medio de pago puede ser offline. En este caso te indicamos, entre otros, el tiempo de acreditación ya que el pago quedará en un estado pendiente que cambiará cuando el usuario se acerque a la entidad correspondiente a finalizar el pago en efectivo.

*Prueba un ejemplo de respuesta de la API de medios de pago (/v1/payment_methods).

El siguiente código hace el llamado a la API y convierte la respuesta en un listado de PaymentMethod.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

MercadoPago mercadoPago = new MercadoPago.Builder()
  .setContext(this)
  .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
  .build();

mercadoPago.getPaymentMethods(new Callback <List<PaymentMethod>>() {
   @Override
   public void success(List<PaymentMethod> paymentMethods) {
      // Listo, arma tu UI para el listado de medios de pago
   }

  @Override
  public void failure(ApiException error) {
    // UPS! Algo salió mal.
  }
});
                        
                        
                     

Bancos

El banco es la entidad que emite la tarjeta. Como procesadores de pagos establecemos promociones con los distintos bancos para que tus usuarios puedan tener mayor flexibilidad a la hora de comprar. La marca de la tarjeta de tu usuario puede ser emitida por más de un banco. Para ofrecerle las promociones correctas, necesitamos que nos indique el banco que emitió su tarjeta. Si el banco no fuera seleccionado o eligiera uno incorrecto, el pago no será procesado.

*Prueba un ejemplo de respuesta de la API de bancos para un medio de pago seleccionado (/v1/payment_methods/card_issuers).

En el siguiente código te mostramos cómo podes hacer el llamado al servicio de Issuer dado un medio de pago desde nuestra SDK.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

String paymentMethodId = "master";

// Primeros seis dígitos de la tarjeta (nullable).
String bin = "503175";

MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.getIssuers(paymentMethodId, bin, new Callback <List<Issuer>>() {
   @Override
   public void success(List<Issuer> issuers) {
      // Listo, arma tu UI para el listado de bancos
   }

  @Override
  public void failure(ApiException error) {
    // UPS! Algo salió mal.
  }
});
                        
                        
                     

Cuotas

Una vez que tu usuario seleccione el medio de pago y el banco que emitió su tarjeta, es importante que, para ofrecerle mayor flexibilidad al momento de pagar, le permitas seleccionar la cantidad de cuotas en la que va a realizar el pago.
Sólo indícanos qué datos seleccionó (medio de pago y banco). El monto es opcional pero permite obtener una descripción recomendada para la cuota, lo que es muy práctico si se quiere mostrar un listado de cuotas escribiendo muy pocas líneas de código.

*Prueba un ejemplo de respuesta de la API de cuotas para el monto que deseas cobrar y el medio de pago y banco seleccionados (/v1/payment_methods/installments).

Si lo tuvieras, dependiendo cómo pensaste tu experiencia de pagos, puedes enviarnos el BIN, que son los primeros seis dígitos de la tarjeta. Con el BIN podemos conocer el medio de pago de la tarjeta y, en algunos casos, el banco que emitió la tarjeta.
El siguiente código hace el llamado a la API enviando los parámetros mencionados y convierte la respuesta en un listado de Installment.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

// Medio de pago seleccionado
String paymentMethodId = "master";

// Banco seleccionado en el paso anterior
Long issuerId = 326L;

// Primeros seis dígitos de la tarjeta
String bin = "503175";

// Monto que vas a cobrar
BigDecimal amount = new BigDecimal(100);

MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.getInstallments(bin, amount, issuerId,
   paymentMethodId, new Callback <List<Installment>>() {
      @Override
      public void success(List<Installment> installments) {
         // Listo, arma tu UI para el listado de cuotas
      }

      @Override
      public void failure(ApiException error) {
         // UPS! Algo salió mal.
      }
});
                        
                        
                     

Tipos de documento

Debes recolectar el tipo y número de documento del portador de la tarjeta. Dependiendo las regulaciones de cada país en el que procesamos, los bancos y las marcas de tarjetas nos solicitan estos datos para efectuar pagos. Tenemos un servicio que, dependiendo el país en el que operes, te devuelve el listado de tipos disponibles con sus respectivas configuraciones como nombre, tipo de dato (numérico o alfanumérico), longitud máxima y mínima, etc.

*Probá un ejemplo de respuesta de la API de tipos de documento (/v1/identification_types).

En el siguiente código te mostramos cómo podes hacer el llamado al servicio de IdentificationTypes.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.getIdentificationTypes(new Callback<List<IdentificationType>>() {
   @Override
   public void success(List<IdentificationType> identificationTypes) {
      // Listo, armá tu UI para el listado de tipos de documento
   }

   @Override
   public void failure(ApiException error) {
      // Ups, ha ocurrido un error.
   }
});
                        
                        
                     

Tokenización de datos

Es muy importante que la información de la tarjeta sea enviada directamente desde el dispositivo de tu cliente a Mercado Pago y no a tus servidores. Si haces esto, no tendrás que preocuparte por cumplir las normas PCI. Te brindamos los SDKs para que puedas realizar esto de forma simple y segura.
Antes de crear un token para los datos de tarjeta de crédito, sería recomendable que valides la información ingresada por el usuario. Muchas de las validaciones son sencillas, como verificar que los tipos de datos son correctos o que se hayan ingresado los campos que son obligatorios. En el caso del número de tarjeta y el código de seguridad, se realizan validaciones adicionales que tienen que ver con el medio de pago seleccionado: Ej. Si es una tarjeta Mastercard que comience con 5 y que su código de seguridad sea de 3 dígitos. No te preocupes, el SDK de Mercado Pago te ayuda para que no tengas que lidiar con estos detalles.

                        
/* Medio de pago seleccionado por el usuario.
*  Va a serte útil para las validaciones de datos. */
PaymentMethod paymentMethod = JsonUtil.getInstance().fromJson(data.getStringExtra("paymentMethod"), PaymentMethod.class);

/* Crea un CardToken con los datos ingresados por tu usuario.
*  Este es un ejemplo con datos de prueba */
CardToken cardToken = new CardToken("5031755734530604", 11, 19,
   "123", "APROJuan Perez", "DNI", "12345678");

// Valida los datos ingresados por tu usuario
if (validateCardToken(cardToken, paymentMethod)) {
   // Obtén un token de uso único para la tarjeta
}
                        
                        
                     

Las funciones de validación son métodos de la clase CardToken y a continuación te mostramos cómo puedes utilizarlas.

                        
private boolean validateCardToken(CardToken cardToken, PaymentMethod paymentMethod) {

   /* En esta función puedes setear el error para cada campo
   *  Es recomendable que hagas requestFocus en el primer campo
   *  en el que detectes un error. */

   boolean result = true;

   /* Los dos siguientes métodos validan que el número
   *  de tarjeta y el código de seguridad cumplan con las
   *  particularidades del medio de pago. */

   try {
      cardToken.validateCardNumber(this, paymentMethod);
   } catch (Exception ex) {
      result = false;
   }

   try {
      cardToken.validateSecurityCode(this, paymentMethod);
   } catch (Exception ex) {
      result = false;
   }

   // Valiamos que la fecha sea mayor a la de hoy
   if (!cardToken.validateExpiryDate()) {
      result = false;
   }

   // Validamos que el nombre no sea vacío
   if (!cardToken.validateCardholderName()) {
      result = false;
   }

   /* Si se seleccionó un tipo de documento,
   *  validamos que cumpla con sus configuraciones */
   if (getIdentificationType() != null &&
      !cardToken.validateIdentificationNumber(getIdentificationType())) {
        result = false;
   }
   return result;
}
                        
                        
                     

El código que sigue muestra cómo puedes intercambiar los datos ingresados de tarjeta de crédito por un token seguro, directamente en Mercado Pago.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

// Si los datos son válidos, envíanos para que los guardemos de forma segura
MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.createToken(cardToken, new Callback<Token>() {
   @Override
   public void success(Token token) {
      // ¡Listo! ¡Ya puedes enviar la información a tus servidores!
   }

   @Override
   public void failure(ApiException error) {
      // Ups, ha ocurrido un error.
   }
});
                        
                        
                     

Promociones

Hablamos con las marcas de las tarjetas y con los bancos para poder brindarle a tus usuarios las mejores promociones a la hora de pagar. Consideramos que es muy importante que en tu flujo de pagos le cuentes a tus usuarios las comodidades que tiene para abonar, ya que es más probable que elija un medio de pago conveniente para él y pueda concretar el pago.

*Prueba un ejemplo de respuesta de la API de promociones (/v1/payment_methods/deals).

El siguiente código hace el llamado a la API y convierte la respuesta en un listado de BankDeal.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.getBankDeals(new Callback<List<BankDeal>>() {
   @Override
   public void success(List<BankDeal> bankDeals) {
      // Listo, arma tu UI para el listado de promociones
   }

   @Override
   public void failure(ApiException error) {
      // Ups, ha ocurrido un error.
   }
});
                        
                        
                     

Medios de pago offline - Instrucciones

Cuando el usuario selecciona un medio de pago offline, te aconsejamos contarle las instrucciones que debe realizar para poder finalizar el pago. Te ofrecemos un servicio que, dado el identificador del pago y el medio elegido por el usuario, retorna los pasos que debe seguir el usuario y todos los datos necesarios para lograr un pago aprobado.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

Long paymentId = 1234567L;
String paymentTypeId = "ticket";

MercadoPago mercadoPago = new MercadoPago.Builder()
   .setContext(this)
   .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
   .build();

mercadoPago.getPaymentResult(paymentId, paymentTypeId, new Callback<PaymentResult>() {
   @Override
   public void success(PaymentResult paymentResult) {
      Instruction instruction = paymentResult.getInstructions().get(0);
      // Listo, aquí ya tienes las instrucciones para
      // contarle a tu usuario cómo finalizar el pago.
      showInstructions(instruction);
   }

   @Override
   public void failure(ApiException error) {
      // Ups, ha ocurrido un error.
   }
});
                        
                        
                     

MerchantServer

Es una clase que está disponible en nuestras SDK con el fin de ayudarte a enviar los datos a tus servidores y esperar la respuesta adecuada. Son solamente dos métodos que vamos a ver a continuación: la creación de pagos y la creación de preferencias.
Lo que hacemos es pedirte que nos indiques cuál es tu url base (http://api.tunombre.com) y la URI en la cual esperas recibir nuestro llamado (/uri). Luego necesitamos que nos envíes un mapa para convertirlo a JSON y poder enviarlo a http://api.tunombre.com/uri donde procesarás esos datos y, usando nuestras SDK para servidores junto a tu clave privada, te conectarás con nuestros servicios para poder efectuar la acción correspondiente. La respuesta de tu servicio, tiene que ser la misma que tuviste de Mercado Pago, porque MerchantServer se encargará de convertirla en el objeto esperado (Payment o CheckoutPreference).

Crear pagos

Antes de crear el pago, te recomendamos que hagas todas las validaciones necesarias para entender si la transacción que se está llevando a cabo es lícita: puedes verificar el precio del item u objeto a comprar, validar stock si fuera necesario y si tu usuario está en condiciones para realizar la compra.
Junto con el token creado necesitas enviar también el medio de pago, cuotas y banco seleccionados por el usuario, además de un identificador del artículo o servicio que se está pagando y del usuario que está presente en tu aplicación.
En este caso, el método createPayment hace un POST y envía como cuerpo del mensaje el objeto MerchantPayment que agrupa toda la información que precisas tener en tu servidor para conectarte con el nuestro. Por eso debes indicarnos tu URL base (https://api.tunombre.com) y la uri (/create_payment) donde esperas los datos para crear el pago. MerchantServer transformará la respuesta de tu servicio (la misma que los servicios de Mercado Pago) en un objeto Payment.

Una vez recibida la información en tus servidores, puedes crear el pago usando uno de los SDKs de Mercado Pago. En este link podrás ver ejemplos de cómo utilizar nuestras SDK para realizar pagos. Los ejemplos están disponibles para PHP, cURL, ASP.NET, Java, Node.js, Phyton y Ruby.
Recuerda que debes utilizar tu clave privada en este caso.

                        
private void createPayment(final PaymentMethod paymentMethod, Issuer issuer, PayerCost payerCost, Token token) {
   Item item = new Item("id", 5);
   MerchantPayment payment = new MerchantPayment(item, payerCost.getInstallments(), issuer.getId(), token.getId(), paymentMethod.getId(), null, "mla-at");

   MerchantServer.createPayment(activity, TU_BASE_URL, TU_CREATE_PAYMENT_URI,
   payment, new Callback<Payment>() {
      @Override
      public void success(Payment payment) {
             // Ya se realizó el pago.
             // Inicio de componente de resultado.
             new MercadoPago.StartActivityBuilder()
               .setPublicKey(TU_PUBLIC_KEY)
               .setActivity(this)
               .setPayment(payment)
               .setPaymentMethod(paymentMethod)
               .startPaymentResultActivity();
         }
      }

      @Override
      public void failure(ApiException apiException) {

         // Ups, ha ocurrido un error.

      }
   });
}
                        
                        
                     

* Envía tantos datos del pago como puedas. Mientras más información nos envíes, mejor será tu experiencia y la de tus usuarios.

Crear preferencias

Una preferencia de pago es una representación de lo que estás cobrando. Incluye, entre otros, los siguientes atributos:

  • Datos y monto del producto que estás vendiendo.
  • Medios de pago que aceptas.
  • Información del comprador (Por seguridad, el email es requerido).
Además, las preferencias permiten que puedas personalizar cómo deseas que se comporte tu checkout. Las configuraciones permitidas son:
  • Excluír medios de pago.
  • Excluír tipos de pago (sólo tarjeta, por ejemplo).
  • Indicar un medio de pago por defecto (la tarjeta que más usa tu cliente).
  • Limitar la cantidad de cuotas.
  • Seleccionar las cuotas a pagar por defecto.

En este caso, el método createPreference hace un POST y envía como cuerpo del mensaje el mapa que hayas definido (preferenceMap). Por eso debes indicarnos tu URL base (https://api.tunombre.com) y la uri (/create_preference) donde esperas los datos para crear la preferencia. MerchantServer transformará la respuesta de tu servicio (la misma que los servicios de Mercado Pago) en un objeto CheckoutPreference cuyo ID es el punto de entrada a nuestro checkout.

Cómo crear preferencias desde tu servidor.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

// Crea un mapa con los datos de la compra y el mail de tu cliente.
Map<String, Object> preferenceMap = new HashMap<>();
preferenceMap.put("item_id", "1");
preferenceMap.put("amount", new BigDecimal(10));
preferenceMap.put("currency_id", "ARS");
preferenceMap.put("payer_email", "mail_de_tu_cliente@gmail.com");

// Envía la información a tu servidor
MerchantServer.createPreference(this, "https://api.tunombre.com",
 "/create_preference", preferenceMap, new Callback<CheckoutPreference>() {

   @Override
   public void success(CheckoutPreference checkoutPreference) {
       // La preferencia se creó correctamente.
       // Aquí puedes iniciar el Checkout de Mercado Pago.
       new MercadoPago.StartActivityBuilder()
         .setActivity(activity)
         .setPublicKey("TEST-ad365c37-8012-4014-84f5-6c895b3f8e0a")
         .setCheckoutPreferenceId(checkoutPreference.getId())
         .startCheckoutActivity();
   }

   @Override
   public void failure(ApiException error) {
     // Ups, ocurrió un error
   }
});
                        
                        
                     

*Creá una preferencia de pago tan completa como puedas. Mientras más información nos envíes, mejor será tu experiencia y la de tus usuarios.

Obtener cliente

Puedes obtener tus clientes creados y así ofrecerles pagar con sus tarjetas guardadas.

Puedes utilizar el método getCustomer que realiza un GET a tu servidor. Debes indicarnos tu URL base (https://api.tunombre.com) y la uri (/get_customer) del recurso para obtener el cliente. Además, puedes envíar por el parámetro "merchant_access_token" un token que identifique a tu usuario en tu servidor. MerchantServer transformará la respuesta de tu servicio (la misma que los servicios de Mercado Pago) en un objeto Customer que contiene las tarjetas guardadas, entre otras cosas.

                        
// Cuidado! Es el callback de Mercado Pago.
import com.mercadopago.callbacks.Callback;

MerchantServer.getCustomer(this, TU_BASE_URL, GET_CUSTOMER_URI, TOKEN_IDENTIFICADOR,
            new Callback<Customer>() {
                @Override
                public void success(Customer customer) {
                    // Ya puedes usar el cliente
                }

                @Override
                public void failure(ApiException apiException) {
                    // Ups, ocurrió un error
                }
            });
}