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.
Vea a continuaciĂłn una comparaciĂłn de los diagramas.
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Ă:
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);
- 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();
};
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.