DocumentaciĆ³n
Recursos
Certificaciones
Comunidad

Recursos

Revisa las actualizaciones de nuestras soluciones y operatividad del sistema o pide soporte tƩcnico.

Comunidad

Recibe las Ćŗltimas novedades, pide ayuda a otros integradores y comparte tus conocimientos.

Cobros online
Cobros presenciales
Herramientas y recursos
APIs y SDKS
Tarjeta - ConfiguraciĆ³n de la integraciĆ³n - Mercado Pago Developers

Tarjeta

La integraciĆ³n de los pagos con tarjeta se realiza a travĆ©s de CardForm. En este modo de integraciĆ³n, MercadoPago.js se encarga de los flujos necesarios para obtener la informaciĆ³n requerida para la generaciĆ³n de un pago. Al inicializarlo, se realiza una bĆŗsqueda para recabar los tipos de documentos disponibles para el paĆ­s correspondiente.

A medida que se introducen los datos de la tarjeta, se realiza una bĆŗsqueda automĆ”tica de la informaciĆ³n del emisor y las cuotas disponibles para ese mĆ©todo de pago. Con esto, la implementaciĆ³n del flujo es transparente para quien realiza la integraciĆ³n.

Importante
AdemĆ”s de las opciones disponibles en esta documentaciĆ³n, tambiĆ©n es posible integrar pagos con tarjeta utilizando el Brick de CardPayment. Consulta la documentaciĆ³n Renderizado por defecto de CardPayment para obtener mĆ”s detalles.

Consulta el siguiente diagrama que ilustra el proceso de pago con tarjeta utilizando CardForm.

API-integration-flowchart

Para integrar los pagos con tarjeta en Checkout API sigue las siguientes etapas.

Importar MercadoPago.js

La primera etapa del proceso de integraciĆ³n de pagos con tarjeta es la captura de los datos de la tarjeta. Esta captura se realiza a travĆ©s de la inclusiĆ³n de la biblioteca MercadoPago.js en tu proyecto, seguida del formulario de pago. Utiliza el siguiente cĆ³digo para importar la biblioteca antes de aƱadir el formulario de pago.

          
<body>
  <script src="https://sdk.mercadopago.com/js/v2"></script>
</body>

        
          
npm install @mercadopago/sdk-js


        

Configurar credenciales

Las credenciales son claves Ćŗnicas con las que identificamos una integraciĆ³n en tu cuenta. Se utilizan para capturar pagos en tiendas online y otras aplicaciones de forma segura.

Esta es la primera etapa de una estructura de cĆ³digo completa que se debe seguir para integrar correctamente pagos con tarjeta.

          
<script>
  const mp = new MercadoPago("YOUR_PUBLIC_KEY");
</script>

        
          
import { loadMercadoPago } from "@mercadopago/sdk-js";

await loadMercadoPago();
const mp = new window.MercadoPago("YOUR_PUBLIC_KEY");


        

AƱadir formulario de pago

La captura de los datos de la tarjeta se realiza a travĆ©s del CardForm de la biblioteca MercadoPago.js. Nuestro CardForm se conectarĆ” a tu formulario de pago HTML, facilitando la obtenciĆ³n y validaciĆ³n de todos los datos necesarios para procesar el pago.

Para aƱadir el formulario de pago, inserta el siguiente HTML directamente en el proyecto.

          
  <style>
    #form-checkout {
      display: flex;
      flex-direction: column;
      max-width: 600px;
    }

    .container {
      height: 18px;
      display: inline-block;
      border: 1px solid rgb(118, 118, 118);
      border-radius: 2px;
      padding: 1px 2px;
    }
  </style>
  <form id="form-checkout">
    <div id="form-checkout__cardNumber" class="container"></div>
    <div id="form-checkout__expirationDate" class="container"></div>
    <div id="form-checkout__securityCode" class="container"></div>
    <input type="text" id="form-checkout__cardholderName" />
    <select id="form-checkout__issuer"></select>
    <select id="form-checkout__installments"></select>
    <select id="form-checkout__identificationType"></select>
    <input type="text" id="form-checkout__identificationNumber" />
    <input type="email" id="form-checkout__cardholderEmail" />

    <button type="submit" id="form-checkout__submit">Pagar</button>
    <progress value="0" class="progress-bar">Cargando...</progress>
  </form>

        

Inicializar formulario de pago

DespuĆ©s de aƱadir el formulario de pago, es necesario inicializarlo. Esta etapa consiste en relacionar el ID de cada campo del formulario con los atributos correspondientes. La biblioteca se encargarĆ” de rellenar, obtener y validar todos los datos necesarios en la confirmaciĆ³n del pago.

Importante
Al enviar el formulario, se genera un token que representa de manera segura los datos de la tarjeta, tambiĆ©n llamado CardToken. Es posible acceder a Ć©l mediante la funciĆ³n cardForm.getCardFormData(), como se muestra a continuaciĆ³n en el callback onSubmit. AdemĆ”s, este token tambiĆ©n se almacena en un campo oculto dentro del formulario, donde se puede encontrar con la nomenclatura MPHiddenInputToken. Ten en cuenta que puede ser utilizado solo una vez y caduca en un plazo de 7 dĆ­as.
          
    const cardForm = mp.cardForm({
      amount: "100.5",
      iframe: true,
      form: {
        id: "form-checkout",
        cardNumber: {
          id: "form-checkout__cardNumber",
          placeholder: "Numero de tarjeta",
        },
        expirationDate: {
          id: "form-checkout__expirationDate",
          placeholder: "MM/YY",
        },
        securityCode: {
          id: "form-checkout__securityCode",
          placeholder: "CĆ³digo de seguridad",
        },
        cardholderName: {
          id: "form-checkout__cardholderName",
          placeholder: "Titular de la tarjeta",
        },
        issuer: {
          id: "form-checkout__issuer",
          placeholder: "Banco emisor",
        },
        installments: {
          id: "form-checkout__installments",
          placeholder: "Cuotas",
        },        
        identificationType: {
          id: "form-checkout__identificationType",
          placeholder: "Tipo de documento",
        },
        identificationNumber: {
          id: "form-checkout__identificationNumber",
          placeholder: "NĆŗmero del documento",
        },
        cardholderEmail: {
          id: "form-checkout__cardholderEmail",
          placeholder: "E-mail",
        },
      },
      callbacks: {
        onFormMounted: error => {
          if (error) return console.warn("Form Mounted handling error: ", error);
          console.log("Form mounted");
        },
        onSubmit: event => {
          event.preventDefault();

          const {
            paymentMethodId: payment_method_id,
            issuerId: issuer_id,
            cardholderEmail: email,
            amount,
            token,
            installments,
            identificationNumber,
            identificationType,
          } = cardForm.getCardFormData();

          fetch("/process_payment", {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
            },
            body: JSON.stringify({
              token,
              issuer_id,
              payment_method_id,
              transaction_amount: Number(amount),
              installments: Number(installments),
              description: "DescripciĆ³n del producto",
              payer: {
                email,
                identification: {
                  type: identificationType,
                  number: identificationNumber,
                },
              },
            }),
          });
        },
        onFetching: (resource) => {
          console.log("Fetching resource: ", resource);

          // Animate progress bar
          const progressBar = document.querySelector(".progress-bar");
          progressBar.removeAttribute("value");

          return () => {
            progressBar.setAttribute("value", "0");
          };
        }
      },
    });

        
Importante
Si necesitas aƱadir o modificar alguna lĆ³gica en el flujo de los mĆ©todos de Javascript consulta la documentaciĆ³n IntegraciĆ³n vĆ­a MĆ©todos Core

Enviar pago

Para continuar con el proceso de integraciĆ³n de pagos con tarjeta, es necesario que el backend reciba la informaciĆ³n del formulario con el token generado y los datos completos como se indicĆ³ en las anteriores etapas.

En el ejemplo de la secciĆ³n previa, enviamos todos los datos necesarios para la generaciĆ³n del pago al endpoint process_payment del backend .

Con toda la informaciĆ³n recopilada en el backend , envĆ­a un POST con los atributos requeridos, prestando atenciĆ³n a los parĆ”metros token, transaction_amount, installments, payment_method_id y payer.email al endpoint /v1/payments y ejecuta la solicitud o, si lo prefieres, envĆ­a la informaciĆ³n utilizando nuestros SDKs.

Importante
Para aumentar las posibilidades de aprobaciĆ³n del pago y evitar que el anĆ”lisis antifraude no autorice la transacciĆ³n, recomendamos introducir toda la informaciĆ³n posible sobre el comprador al realizar la solicitud. Para mĆ”s detalles sobre cĆ³mo aumentar las posibilidades de aprobaciĆ³n, consulta CĆ³mo mejorar la aprobaciĆ³n de los pagos.

AdemĆ”s, deberĆ”s enviar obligatoriamente el atributo X-Idempotency-Key para asegurar la ejecuciĆ³n y reejecuciĆ³n de las solicitudes sin el riesgo de realizar la misma acciĆ³n mĆ”s de una vez por error. Para hacerlo, actualiza nuestra biblioteca de SDKs , o bien genera un UUID V4 y envĆ­alo en los header de tus llamados. Importante: Los valores admitidos en el encabezado tienen limitaciones y no se permite el formato "prefijo" + "_". Ejemplo invĆ”lido: payment_1298ey98sdsdh12hsd-12esvv. Ejemplo vĆ”lido: payment192839qw8sd7db-2xx2s-23wds.
          
<?php
  use MercadoPago\Client\Payment\PaymentClient;
  use MercadoPago\Client\Common\RequestOptions;
  use MercadoPago\MercadoPagoConfig;

  MercadoPagoConfig::setAccessToken("YOUR_ACCESS_TOKEN");

  $client = new PaymentClient();
  $request_options = new RequestOptions();
  $request_options->setCustomHeaders(["X-Idempotency-Key: <SOME_UNIQUE_VALUE>"]);

  $payment = $client->create([
    "transaction_amount" => (float) $_POST['<TRANSACTION_AMOUNT>'],
    "token" => $_POST['<TOKEN>'],
    "description" => $_POST['<DESCRIPTION>'],
    "installments" => $_POST['<INSTALLMENTS>'],
    "payment_method_id" => $_POST['<PAYMENT_METHOD_ID'],
    "issuer_id" => $_POST['<ISSUER>'],
    "payer" => [
      "email" => $_POST['<EMAIL>'],
      "identification" => [
        "type" => $_POST['<IDENTIFICATION_TYPE'],
        "number" => $_POST['<NUMBER>']
      ]
    ]
  ], $request_options);
  echo implode($payment);
?>

        
          
import { Payment, MercadoPagoConfig } from 'mercadopago';

const client = new MercadoPagoConfig({ accessToken: '<ACCESS_TOKEN>' });

payment.create({
    body: { 
        transaction_amount: req.transaction_amount,
        token: req.token,
        description: req.description,
        installments: req.installments,
        payment_method_id: req.paymentMethodId,
        issuer_id: req.issuer,
            payer: {
            email: req.email,
            identification: {
        type: req.identificationType,
        number: req.number
    }}},
    requestOptions: { idempotencyKey: '<SOME_UNIQUE_VALUE>' }
})
.then((result) => console.log(result))
.catch((error) => console.log(error));

        

Encuentra el estado del pago en el campo status.

          

Map<String, String> customHeaders = new HashMap<>();
    customHeaders.put("x-idempotency-key", <SOME_UNIQUE_VALUE>);
 
MPRequestOptions requestOptions = MPRequestOptions.builder()
    .customHeaders(customHeaders)
    .build();

MercadoPagoConfig.setAccessToken("YOUR_ACCESS_TOKEN");

PaymentClient client = new PaymentClient();

PaymentCreateRequest paymentCreateRequest =
   PaymentCreateRequest.builder()
       .transactionAmount(request.getTransactionAmount())
       .token(request.getToken())
       .description(request.getDescription())
       .installments(request.getInstallments())
       .paymentMethodId(request.getPaymentMethodId())
       .payer(
           PaymentPayerRequest.builder()
               .email(request.getPayer().getEmail())
               .firstName(request.getPayer().getFirstName())
               .identification(
                   IdentificationRequest.builder()
                       .type(request.getPayer().getIdentification().getType())
                       .number(request.getPayer().getIdentification().getNumber())
                       .build())
               .build())
       .build();

client.create(paymentCreateRequest, requestOptions);
 

        

Encuentra el estado del pago en el campo status.

          
require 'mercadopago'
sdk = Mercadopago::SDK.new('YOUR_ACCESS_TOKEN')

custom_headers = {
 'x-idempotency-key': '<SOME_UNIQUE_VALUE>'
}

custom_request_options = Mercadopago::RequestOptions.new(custom_headers: custom_headers)

payment_data = {
 transaction_amount: params[:transactionAmount].to_f,
 token: params[:token],
 description: params[:description],
 installments: params[:installments].to_i,
 payment_method_id: params[:paymentMethodId],
 payer: {
   email: params[:email],
   identification: {
     type: params[:identificationType],
     number: params[:identificationNumber]
   }
 }
}
 
payment_response = sdk.payment.create(payment_data, custom_request_options)
payment = payment_response[:response]
 
puts payment
 

        

Encuentra el estado del pago en el campo status.

          
using System;
using MercadoPago.Client.Common;
using MercadoPago.Client.Payment;
using MercadoPago.Config;
using MercadoPago.Resource.Payment;
 
MercadoPagoConfig.AccessToken = "YOUR_ACCESS_TOKEN";

var requestOptions = new RequestOptions();
requestOptions.CustomHeaders.Add("x-idempotency-key", "<SOME_UNIQUE_VALUE>");
 
var paymentRequest = new PaymentCreateRequest
{
   TransactionAmount = decimal.Parse(Request["transactionAmount"]),
   Token = Request["token"],
   Description = Request["description"],
   Installments = int.Parse(Request["installments"]),
   PaymentMethodId = Request["paymentMethodId"],
   Payer = new PaymentPayerRequest
   {
       Email = Request["email"],
       Identification = new IdentificationRequest
       {
           Type = Request["identificationType"],
           Number = Request["identificationNumber"],
       },
   },
};
 
var client = new PaymentClient();
Payment payment = await client.CreateAsync(paymentRequest, requestOptions);
 
Console.WriteLine(payment.Status);
 

        

Encuentra el estado del pago en el campo status.

          
import mercadopago
sdk = mercadopago.SDK("ACCESS_TOKEN")

request_options = mercadopago.config.RequestOptions()
request_options.custom_headers = {
    'x-idempotency-key': '<SOME_UNIQUE_VALUE>'
}

payment_data = {
   "transaction_amount": float(request.POST.get("transaction_amount")),
   "token": request.POST.get("token"),
   "description": request.POST.get("description"),
   "installments": int(request.POST.get("installments")),
   "payment_method_id": request.POST.get("payment_method_id"),
   "payer": {
       "email": request.POST.get("email"),
       "identification": {
           "type": request.POST.get("type"), 
           "number": request.POST.get("number")
       }
   }
}
 
payment_response = sdk.payment().create(payment_data, request_options)
payment = payment_response["response"]
 
print(payment)

        
          
accessToken := "{{ACCESS_TOKEN}}"


cfg, err := config.New(accessToken)
if err != nil {
   fmt.Println(err)
   return
}


client := payment.NewClient(cfg)


request := payment.Request{
   TransactionAmount: <transaction_amount>,
   Token: <token>,
   Description: <description>,
   PaymentMethodID:   <paymentMethodId>,
   Payer: &payment.PayerRequest{
      Email: <email>,
      Identification: &payment.IdentificationRequest{
         Type: <type>,
         Number: <number>,
      },
   },
}


resource, err := client.Create(context.Background(), request)
if err != nil {
   fmt.Println(err)
}


fmt.Println(resource)

        

Encuentra el estado del pago en el campo status.

          
 
curl -X POST \
   -H 'accept: application/json' \
   -H 'content-type: application/json' \
   -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
   -H 'X-Idempotency-Key: SOME_UNIQUE_VALUE' \
   'https://api.mercadopago.com/v1/payments' \
   -d '{
         "transaction_amount": 100,
         "token": "ff8080814c11e237014c1ff593b57b4d",
         "description": "Blue shirt",
         "installments": 1,
         "payment_method_id": "visa",
         "issuer_id": 310,
         "payer": {
           "email": "PAYER_EMAIL"
         }
   }'
 

        

La respuesta devolverĆ” el siguiente resultado

json

{
   "status": "approved",
   "status_detail": "accredited",
   "id": 3055677,
   "date_approved": "2019-02-23T00:01:10.000-04:00",
   "payer": {
       ...
   },
   "payment_method_id": "visa",
   "payment_type_id": "credit_card",
   "refunds": [],
   ...
}
AtenciĆ³n
Al crear un pago es posible recibir 3 estados diferentes: "Pendiente", "Rechazado" y "Aprobado". Para mantenerse al dƭa con las actualizaciones, debe configurar su sistema para recibir notificaciones de pago y otras actualizaciones de estado. Consulte Notificaciones para obtener mƔs detalles.

Ejemplo de cĆ³digo

Checkout API
Para ejemplos completos de cĆ³digo, consulta nuestros ejemplos completos de integraciĆ³n.