Inicio
DocumentaciĂłn
Recursos
Partners
Comunidad

Recursos

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

Partners

Conoce nuestro programa para agencias o desarrolladores que ofrecen servicios de integraciĂłn y vendedores que quieren contratarlos.

Comunidad

Recibe las Ășltimas novedades, pide ayuda a otros integradores y comparte tus conocimientos.

CĂłmo migrar de SDK JS V1 a SDK JS V2 con Secure Fields - Client-side - Mercado Pago Developers

BĂșsqueda inteligente powered by OpenAI 

CĂłmo migrar de SDK JS V1 a SDK JS V2 con Secure Fields

En Mercado Pago lanzamos Secure Fields, una nueva funcionalidad de seguridad para procesar pagos con tarjetas. EstĂĄ disponible solo en la versiĂłn mĂĄs actual de SDK JS y cuenta con varios beneficios cĂłmo:

  • ImplementaciĂłn mĂĄs simple
  • Mayor seguridad para tu tienda
  • Facilidad para sacar la certificaciĂłn PCI SAQ A de forma mĂĄs sencilla

En este artĂ­culo explicaremos las configuraciones necesarias para la migraciĂłn de JavaScript SDK en la versiĂłn 1 a JavaScript SDK en la versiĂłn 2 con Secure Fields.

A continuaciĂłn mostramos las principales diferencias entre los pasos de migraciĂłn.

  • Cambiamos la forma de instanciar Mercado Pago;
  • Ya no usaremos las funciones de callback de cada mĂ©todo, sino su retorno para trabajar con los datos;
  • Los nombres de algunos mĂ©todos tambiĂ©n han sufrido algunos cambios menores y se han vuelto mĂĄs claros en los snippets comparativos.
AtenciĂłn
La migraciĂłn no afectarĂĄ su backend de ninguna manera, las modificaciones estĂĄn completamente en la interfaz de la aplicaciĂłn.

Vea a continuaciĂłn una comparaciĂłn de los diagramas.

java-v1

java-v2

Cambiar la importaciĂłn del script

Se ha cambiado el nombre del archivo JS en el CDN y serĂĄ necesario modificar la importaciĂłn del script en el HTML.

  • V1

html

<script 
   src="https://secure.mlstatic.com/sdk/javascript/v1/mercadopago.js"></script>
  • V2

html

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

Instanciar Mercado Pago

Como se mencionó anteriormente, la instanciación de Mercado Pago también ha cambiado.

  • V1

javascript

 
   window.Mercadopago.setPublishableKey("YOUR_PUBLIC_KEY");
  • V2

javascript

 
   const mp = new MercadoPago("YOUR_PUBLIC_KEY"); 

Crear campos PCI

Con Secure Fields, la forma en que se implementan los campos card number, expiration date y security code ha cambiado un poco. Con esta nueva propuesta, mucho mĂĄs segura, no es necesario crear tags inputs para estos campos en tu HTML, ahora solo debemos crear los divs donde se renderizarĂĄn los inputs y dejar que Mercado Pago envĂ­e iframes para los campos, como en los ejemplos a continuaciĂłn.

  • La fecha de caducidad en V1

html

<div>
  <input type="text" placeholder="MM" id="cardExpirationMonth" data-checkout="cardExpirationMonth">
  <span class="date-separator">/</span>
  <input type="text" placeholder="YY" id="cardExpirationYear" data-checkout="cardExpirationYear">
</div>
  • Card number en V1

html

<input type="text" id="cardNumber" data-checkout="cardNumber" />
  • CĂłdigo de seguridad en V1

html

<input id="securityCode" data-checkout="securityCode" type="text" />

Ahora, solo con los 'divs' y los 'ID' correspondientes, se verĂĄ asĂ­:

  • La fecha de caducidad en el V2

html

<div id="expirationDate"></div>
  • Card number en V2

html

<div id="cardNumber"></div>
  • CĂłdigo de seguridad en V2

html

<div id="securityCode"> </div>

Y ademĂĄs de los divs, en el caso de Secure Fields necesitaremos informar a los MPs dĂłnde debe montar las entradas. Usando los divs anteriores como ejemplo, el script se verĂĄ asĂ­:

javascript


  const cardNumberElement = mp.fields.create('cardNumber', {
  placeholder: "NĂșmero do cartĂŁo"
}).mount('cardNumber');

const expirationDateElement = mp.fields.create('expirationDate', {
  placeholder: "MM/YY",
}).mount('expirationDate');

const securityCodeElement = mp.fields.create('securityCode', {
  placeholder: "Código de segurança"
}).mount('securityCode');

Con eso tenemos nuestros campos PCI seguros dentro del formulario. Para obtener mĂĄs informaciĂłn sobre cĂłmo configurar los iframes, visite nuestro Github.

Obtener tipos de documentos

Ahora getIdentificationTypes devuelve una promise y la forma de completar la tag select ha cambiado.

En el caso de SDK V1, la tag select era completada automåticamente en la selección con id='docType', después de la llamada getIdentificationTypes().

  • V1

html

<body 
   <select id="docType" name="docType" data-checkout="docType" type="text"></select>
</body>

javascript

 window.Mercadopago.getIdentificationTypes();

En V2, la llamada al método devuelve una promise con una lista de identificationTypes y deberås completar la tag select con la ID que desees. Usando el ejemplo anterior con id='docType', la implementación se vería así:

Sabiendo que el método getIdentificationTypes es una devolución de una promise y debe ejecutarse justo después de renderizar, una opción es usar un [IIFE,] ( https://developer.mozilla.org/en-US/docs/Glossary/IIFE ) como en el siguiente ejemplo.

javascript

 (async function getIdentificationTypes() {
      try {
        const identificationTypes = await mp.getIdentificationTypes();

        const identificationTypeElement = document.getElementById('docType');

        createSelectOptions(identificationTypeElement, identificationTypes);

      } catch (e) {
        return console.error('Error getting identificationTypes: ', e);
      }
})();

function createSelectOptions(elem, options, labelsAndKeys = { label: "name", value: "id" }) {

      const { label, value } = labelsAndKeys;

      elem.options.length = 0;

      const tempOptions = document.createDocumentFragment();

      options.forEach(option => {
        const optValue = option[value];
        const optLabel = option[label];

        const opt = document.createElement('option');
        opt.value = optValue;
        opt.textContent = optLabel;

        tempOptions.appendChild(opt);
      });

      elem.appendChild(tempOptions);
}

Obtener método de pago con tarjeta

Ahora getPaymentMethod es getPaymentMethods (en plural). En V1, este mĂ©todo recibĂ­a dos parĂĄmetros, un objeto que contenĂ­a el bin (los primeros 6 dĂ­gitos de la tarjeta aĂșn en V1) y una funciĂłn de callback que se ejecutarĂ­a en la devoluciĂłn del mĂ©todo.

  • V1

javascript

window.Mercadopago.getPaymentMethod({
    "bin": bin
}, callbackFn);

javascript

document.getElementById('cardNumber').addEventListener('change', guessPaymentMethod);
Importante
El código bin en V2 no tiene solo 6 dígitos, sino 8, y este cambio no interfiere en absoluto con la implementación. Ademås, ya no se puede acceder al código a través del componente cardNumber porque ahora no hay una entrada en el campo, sino un div y, dentro del div, hay un iframe.



Ahora, para recuperar el bin debemos escuchar el evento binChange que existe en el div donde estĂĄ contenido el card number.
  • V2

javascript

cardNumberElement.on('binChange', guessPaymentMethod);

La funciĂłn que se ejecutarĂĄ en el evento binChange recibirĂĄ un objeto que contenga el bin como parĂĄmetro. En V2, este getPaymentMethods es una promise que solo recibe un objeto que contiene el bin como parĂĄmetro y devuelve un objeto que contiene un array de medios de pago cuando se resuelve la promise.

javascript

async function getPaymentMethods(data) {
    const { bin } = data
    const { results } = await mp.getPaymentMethods({ bin });
        // O id do payment estarĂĄ em results[0].id
    

}

Obtener banco emisor

Anteriormente, getIssuers recibía dos paråmetros, paymentMethodId y una función de callback que se ejecutaba cuando el método regresaba.

  • V1

javascript

window.Mercadopago.getIssuers(
    paymentMethodId, callBackFn
);

function callBackFn(status, response) {
    if (status == 200) {
        response.forEach( issuer => {
           ...
        });
    }
}

En V2, este método correspondiente es una promise que toma un objeto que contiene bin y paymentMethodId como paråmetros, devolviendo los issuers cuando se resuelve la promise.

  • V2

javascript

async function getIssuers(paymentMethodId, bin) {
    const issuears = await mp.getIssuers({paymentMethodId, bin });
    ...
};

Obtener nĂșmero de cuotas

Anteriormente, getInstallments recibía dos paråmetros: un objeto que contenía payment_method_id, amount y issuer_id, y una función de callback que se ejecutaba en la devolución del método.

  • V1

javascript

window.Mercadopago.getInstallments({
       "payment_method_id": paymentMethodId,
       "amount": parseFloat(transactionAmount),
       "issuer_id": parseInt(issuerId)
   }, callbackFn
);

function callBackFn(status, response) {
   if (status == 200) {
      response[0].payer_costs.forEach( payerCost => {
        ...
       });
   }
}

En la V2 este método es una promise y recibe como paråmetro un objeto que contiene el amount, el bin y el paymentTypeId, donde paymentTypeId siempre debe recibir el valor credit_card.

  • V2

javascript

async function getInstallments(paymentMethodId, bin) {
    const installments = await mp.getInstallments({
        amount: document.getElementById('transactionAmount').value,
        bin,
        paymentTypeId: 'credit_card'
    });
    ...
};

Crear token de tarjeta

Finalmente, en el envĂ­o del formulario, el token se genera y se envĂ­a al backend. Esto continĂșa funcionando parcialmente de la misma manera, solo hay algunos cambios en las invocaciones y los nombres de los mĂ©todos.

El método de creación de tokens, particularmente, tuvo un cambio de nombre: en V1 era createToken y en V2 es createCardToken.

En V1, el método createToken recibía dos paråmetros, el formulario y la función de callback que se ejecuta al final de la creación del token.

  • V1

javascript

window.Mercadopago.createToken($form, setCardTokenAndPay);

En V2, el método recibe un objeto que contiene cardholderName, identificationType y identificationNumber, y devuelve una promise con el token.

  • V2

javascript

async function createCardToken(){
    const token = await mp.fields.createCardToken({
        cardholderName,
        identificationType, 
        identificationNumber, 
    });
    ...
}

Enviar pago

Ahora, con el token en la mano, simplemente agrégalo al formulario y envíalo, como se explica en la documentación de Integración vía Métodos Core.

Ejemplo de implementaciĂłn:

javascript

doSubmit = false;
document.getElementById('paymentForm').addEventListener('submit', getCardToken);

async function getCardToken(event) {
    event.preventDefault();
    if (!doSubmit) {
        let $form = document.getElementById('paymentForm');
        const token = await mp.fields.createCardToken({
            cardholderName: document.getElementById('cardholderName').value,
            identificationType: document.getElementById('docType').value,
            identificationNumber: document.getElementById('docNumber').value,
        })
        setCardTokenAndPay(token.id)
    }
};

function setCardTokenAndPay(token) {
    let form = document.getElementById('paymentForm');
    let card = document.createElement('input');
    card.setAttribute('name', 'token');
    card.setAttribute('type', 'hidden');
    card.setAttribute('value', token);
    form.appendChild(card);
    doSubmit = true;
    form.submit();
};
Importante
Para obtener mĂĄs informaciĂłn, ve a documentaciĂłn para SDK JS V2 con Secure Fields. AdemĂĄs, proporcionamos un ejemplo completo de migraciĂłn en cĂłdigo fuente con comentarios que puedes usar como plantilla.

Otras alternativas

Existen otras dos alternativas de implementación que no incluyen métodos centrales, que fueron los métodos que se analizaron en este artículo, y ambas alternativas son tan seguras como usar métodos centrales. Ve a continuación estas alternativas.

Cardform

La integraciĂłn de los pagos con tarjeta se realiza a travĂ©s de cardform. En este modo de integraciĂłn, MercadoPago.js es responsable de los flujos necesarios para obtener la informaciĂłn requerida para crear un pago. Cuando se inicializa, se realiza una bĂșsqueda para recopilar los tipos de documentos disponibles para el paĂ­s en cuestiĂłn. Consulta la documentaciĂłn de Checkout Transparente para obtener mĂĄs informaciĂłn.

Checkout Bricks

Checkout Bricks es un conjunto de mĂłdulos de UI que vienen con su front-end listo y optimizados para una mejor usabilidad y conversiĂłn. Cada Brick se puede utilizar de forma independiente o en conjunto, formando la experiencia de un checkout completo. Consulta la documentaciĂłn de Checkout Bricks para obtener mĂĄs informaciĂłn.