Proceso de tokenización

Proceso de tokenización

Consideraciones

Para utilizar el servicio de tokenización se debe tomar en cuenta los siguiente:
  1. Utilizar el servicio en los endpoints
    1. Sandbox: https://sandbox-checkout.greenpay.me/tokenize
    2. Producción: https://checkout.greenpay.me/tokenize
  2. Tener una session token de una orden the tokenización que no haya excedido los 30 minutos establecidos de vencimiento. Para ver cómo crear una orden de tokenización visite este enlace.

Pasos para usar el servicio

1. Estructura de los datos de la tarjeta

Se debe crear un objeto JSON que cumpla con la siguiente estructura.


{
    "card": {
      "cardHolder": "Nombre del titular de la tarjeta",
      "expirationDate": {
        "month": número del mes, del 01 al 12,
        "year": últimos dos dígitos del año
      },
      "cardNumber": "Número_de_la_tarjeta",
      "nickname": "nickname, nombre representativo"
    }
}


Los parámetros obligatorios son los siguientes:
  1. cardHolder: Es un cadena que contiene el nombre del titular de la tarjeta.
  2. expirationDate: Objeto con la fecha y el año  de vencimiento de la tarjeta. Tanto month como year son números.
  3. cardNumber: Número completo de la tarjeta de crédito o débito. Es un cadena que contiene el número de tarjeta.
  4. nickname: Una cadena nickname que sea significativo a la tarjeta (Debe ser mayor que 5 caractéres y no exceder los 50 caractéres).

2. Cifrar los datos de la tarjeta

Por razones de seguridad, tanto para GreenPay como para proteger su comercio, se requiere que la información de la tarjeta se envíe encriptada. Para cifrar estos datos, se debe utilizar el algoritmo de encriptación “AES-CTR-128”, si esta información no se cifra con este algoritmo, el servicio de tokenización rechazará la solicitud.

A continuación, se muestran los pasos a seguir para cifrar la información de la tarjeta:
  1. Generar dinámicamente un par de llaves AES (Key , Counter), las cuales se utilizarán para cifrar la información de la tarjeta.
    1. Cada llave es un arreglo de 16 bytes.
    2. El key contiene la llave para cifrar en AES.
    3. El Counter es el contador para el modo CTR de AES.
  2. Cifrar el objeto JSON con los datos de la tarjeta, y convertir el resultado del cifrado a formato hexadecimal.
    1. El string en formato hexadecimal corresponde al valor “ld” que se debe enviar en el “body” de la solicitud de pago.
    2. El valor “ld” que debe enviar en el body de la solicitud de pago, corresponde al string en formato hexadecimal que se obtiene al cifrar el objeto JSON que contiene la información de la tarjeta con AES-CTR-128.
  3. Cifrar con RSA las llaves AES (key, counter) con la llave pública provista por “GreenPay support team”.
    1. El string en formato base64 que se obtiene de cifrar el par de llaves AES, corresponde al valor “lk” que se debe enviar en el “body” de la solicitud de pago.
    2. El valor “lk” que se debe enviar en el body de la solicitud de pago corresponde a la codificación en base64 del cifrado de las llaves AES.

2.1. Los siguientes son ejemplos de cifrado 

  1. Cifrado en C#: Ejemplos de cifrado AES-CTR-128 con librerías externas y con BouncyCastle. Para ver los ejemplos visitar Cifrado en C#.
  2. Cifrado en JavaScript:  El cifrado en javascript se hace con las las bibliotecas aes-js y jsencrypt, a continuación se muestra el código de cifrado.

    <!---->
    <!doctype html>
    <html>
    <head>
    <title>GP LD LK</title>
    <script type="text/javascript" src="https://cdn.rawgit.com/ricmoo/aes-js/e27b99df/index.js"></script>
    <script type="text/javascript">
    //init jsencryp
    var encrypt = new JSEncrypt();
    //add publib key provided byu greenpay with no \n
    encrypt.setPublicKey("MIGfMA0GCSqGSIb3DQEBA....QUAA4GNADCBiQKBg");

    $(function() {
    // cardDataObject is the object that must be encrypted when you are going to create a token
    var cardDataObject = {
    "card":{
    "cardHolder": "Tico payment user", //must have more tha 5 chars
    "expirationDate": {
    "month": 12,
    "year": 23
    },
    "cardNumber": "4242424242424242",
    "cvc": "123",
    "nickname": "nickname" //more than 5 chars and less tan 50 chars
    }
    };

    // encrypt the card data and print the log in console
    var cardDataEcrypted = pack(cardDataObject, undefined);
    console.log('Card data encrypted:', JSON.stringify(cardDataEcrypted));
    });

    function pack(obj, pair_) {
    var pair = (pair_ !== undefined) ? pair_ : this.generateAESPairs();
    var textBytes = aesjs.utils.utf8.toBytes(JSON.stringify(obj));
    var aesCtr = new aesjs.ModeOfOperation.ctr(pair.k, new aesjs.Counter(pair.s));
    var encryptedBytes = aesCtr.encrypt(textBytes);
    var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
    var returnObj = {
    ld:encryptedHex,
    lk:encrypt.encrypt(JSON.stringify(pair))
    };
    return returnObj;
    }

    function generateAESPairs () {
    var key = []
    var iv = 0;
    for (var k = 0; k < 16; k++) {
    key.push(Math.floor(Math.random() * 255))
    }
    for (var k = 0; k < 16; k++) {
    iv = Math.floor(Math.random() * 255)
    }
    return {
    k: key,
    s: iv
    }
    }
    </script>
    </head>
    <body>
    </body>
    </html>

2.2. Resultado del cifrado

Una vez cifrado los datos, el resultado debe ser un ld y un lk. Con estos valores se debe crear un objeto JSON con la siguiente estructura:


{
    "session": "session from create tokenization order",
    "ld": "ld from encryption process",
    "lk": "lk from encryption process"
}


3. Realizar una petición POST con los datos cifrados.

Con el objeto JSON creados a partir de la sesión de la orden de tokenización y los datos cifrados se debe hacer una petición POST al API de Greenpay
Para esto se debe hacer lo siguiente:
  1. Colocar  el objeto con los datos cifrados y la session como body del request
    {
    "session": "session from create tokenization order",
    "ld": "ld from encryption process",
    "lk": "lk from encryption process"
    }
  2. En los header del POST colocar un nuevo header llamado liszt-token. EL valor debe ser el token generado en la creación de la orden de tokenización, del siguiente manera
    "liszt-token":"token uuid".

  3. Para ver un ejemplo en POSTMAN de cómo hacer la solicitud visitar este enlace.
A continuación, se muestra un ejemplo de JavaScrip sobre como realizar la solicitud del token.

var data= {
"session": "sesión obtenida en 'Crear una orden de tokenización' ",
"ld": "datos de la tarjeta cifrados con AES-CTR-128 en formato HEX",
"lk": "Llaves AES cifradas con llave pública en formato base64"
}
var unirest = require("unirest");
//Tokenize the order created in GreenPay gateway
function postTokenize(data, accessToken) {
return new Promise(function (resolve, reject) {
unirest.post("https://sandbox-checkout.greenpay.me/%22 + 'tokenize')
.headers({
"Accept": "application/json",
"Content-Type": "application/json",
"liszt-token": "token obtenido en 'Crear una orden de tokenización'"
})
.send(data)
.end(function (response) {
if (response.status === 200) {
console.log("response: ",JSON.stringify(response));
resolve(response.body);
} else {
reject(response.body);
}
});
});
}

A continuación, se muestra un ejemplo de la respuesta del api con el token creado.

{
"statusCode": 200,
"body": {
"status": 201,
"requestId": 1,
"result": {
"token": "fb3d1a7b-9cb1-45b7-b49d-b2a3efd98371",
"last_digits": "7777",
"bin": "477777"
},
"expiration_date": "2109",
"brand": "Visa",
"nickname": "Visa",
"errors": [],
"_signature": "5005b0d596e607825ea4385d48b1c2f39aaae2a1965e135e47a050e00018e7f799aea524f489fe4d77416f4e2534d308e9bf967333ed695b0b1d73a0ce751e85f9b04edb12ec06096352535934f993ae4d68644896470f619cba8aa0fd5e7b7cb12b75fdb11bcc4d70da915c3c47dc835bf68e6f60c35bbbd9dcd44431100"
},
"headers": {
"...": "..."
},
"request": {
"uri": {
"...": "..."
},
"method": "post",
"headers": {
"...": "..."
}
}
}

4. Hacer cobro sobre un token

Para aplicar un cobro sobre un token de tarjeta, revisar este artículo.

    • Related Articles

    • Proceso de tokenización con formulario

      Consideraciones Para utilizar el formulario de tokenización de tarjetas se debe considerar lo siguiente: El formulario está disponible en: Sandbox: http://sandbox-tokenizeform.greenpay.me/ Producción: https://tokenizeform.greenpay.me/ Se requiere ...
    • Crear orden de tokenización

      Consideraciones Una orden de tokenización se crea para indicar al API de Greenpay que se creará un token a partir de los datos de una tarjeta de crédito o débito. Para esto se debe tener las siguientes consideraciones: Endpoints para crear la orden ...
    • Proceso de pago con Widget

      Consideraciones Al utilizar el widget de pago de Greenpay, es importante tener en cuenta lo siguiente: Es necesario disponer de una cuenta de sandbox o de producción. Para obtener esta cuenta, visite la sección Sobre cuenta de pruebas o sandbox. El ...
    • Proceso de pago con webform

      Consideraciones Para utilizar el formulario de pago de Greenpay, se debe considerar los siguiente: El formulario está disponible en dos entornos: Sandbox: https://sandbox-checkoutform.greenpay.me/ Producción: https://checkout-form.greenpay.me/ Se ...
    • Crear orden de pago

      Consideraciones La orden de pago se genera para indicar al API de pago que se realizará una transacción, basándose en los datos proporcionados en la orden. Para esto, se debe considerar lo siguiente: Utilizar el servicio en los endpoints: En sandbox: ...