Actualizar token de tarjeta

Actualizar token de tarjeta

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/update
    2. Producción: https://checkout.greenpay.me/tokenize/update
  2. Tener una session token de una orden de 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:
  1. {
        "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"
        },
        "token": "token de tarjeta a actualizar"
    }

Los parámetros obligatorios son los siguientes:
  1. cardHolder: Nombre del titular de la tarjeta.
  2. expirationDate: Fecha y año de vencimiento de la tarjeta.
  3. cardNumber: Número de la tarjeta de crédito o débito.
  4. nickname: Un nickname significativo a la tarjeta (máximo 50 caracteres).
  5. token: UUID del token de tarjeta registrado en greenpay.

2. Cifrar los datos de la tarjeta

Es necesario enviar la información de la tarjeta encriptada con el algoritmo "AES-CTR-128" por motivos de seguridad. Si no se cifra de esta manera, el servicio de tokenización no aceptará la solicitud, lo que garantiza la protección tanto de GreenPay como de su comercio.

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 modo CTR de AES.
  2. Cifrar el objeto JSON con los datos de la tarjeta, y convertir el resultado 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 verlos 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.
  1. <!---->
    <!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
    },
    "token":"1c3a0f89-1515-402c-88e5-50814f854706"
    };
    // 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:
  1. {
        "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
  1. {
        "session": "session from create tokenization order",
        "ld": "ld from encryption process",
        "lk": "lk from encryption process"
    }
  1. 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 
    "list-token":"token uuid".

  2. 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 cómo realizar la solicitud del token.
  1. 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/update')
            .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 actualizado.
  1. {
        "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": [],
            "callback": "http://localhost:3000/callback",
            "_signature": "5005b0d596e607825ea4385d48b1c2f39aaae2a1965e135e47a050e00018e7f799aea524f489fe4d77416f4e2534d308e9bf967333ed695b0b1d73a0ce751e85f9b04edb12ec06096352535934f993ae4d68644896470f619cba8aa0fd5e7b7cb12b75fdb11bcc4d70da915c3c47dc835bf68e6f60c35bbbd9dcd44431100"
        },
        "headers": {
            "...": "..."
        },
        "request": {
            "uri": {
                "...": "..."
            },
            "method": "post",
            "headers": {
                "...": "..."
            }
        }
    }




    • Related Articles

    • Borrar token de tarjeta

      Consideraciones Para hacer uso del servicio de eliminar tokens de tarjetas, se debe tomar en cuenta las siguientes consideraciones: Utilizar el servicio en los endpoints: Sandbox: https://sandbox-merchant.greenpay.me/deleteToken/ Producción: ...
    • Proceso para actualizar token con formulario

      Consideraciones Para utilizar el formulario de tokenización de tarjetas se debe considerar los siguiente: El formulario está disponible en: Sandbox: http://sandbox-tokenizeform.greenpay.me/ Producción: https://tokenizeform.greenpay.me/ Tener una ...
    • Actualizar método de pago

      Para este servicio se debe consumir el siguiente endpoint: https://sandbox-merchant.greenpay.me/subscriptions/update/card_token A continuación, se muestra el paso a paso para cancelar una suscripción en nuestro API de forma exitosa: 1. Crear el ...
    • Actualizar monto

      Consideraciones Para este servicio se debe consumir el siguiente endpoint: https://sandbox-merchant.greenpay.me/subscriptions/update A continuación, se muestra el paso a paso para actualizar el monto de una suscripción en nuestro API de forma ...
    • Invocar API de pago

      Consideraciones Para invocar el Api de pagos se debe considerar lo siguiente: Utilizar el servicio en los endpoints: Sandbox: https://sandbox-checkout.greenpay.me/kount Producción: https://checkout.greenpay.me/kount Tener una session y token de una ...