Skip to content

Instantly share code, notes, and snippets.

@fr20587
Last active January 17, 2024 16:47
Show Gist options
  • Select an option

  • Save fr20587/18738f2cb94880f5af40586556b0a95d to your computer and use it in GitHub Desktop.

Select an option

Save fr20587/18738f2cb94880f5af40586556b0a95d to your computer and use it in GitHub Desktop.
Athwire API Encrypt

Proceso de cifrado

Dependencias

Paquetes de nodejs para manejar el cifrado y la validación

Para instalarlos ejecutar:

npm i crypto-js       # para el cifrado
npm i zod             # para la validación

Documentación:

Importar dependencias

import CryptoJS from 'crypto-js';
import { z } from 'zod';

Interfaz de la remesa

// Esta interfaz se puede sustituir infiriendo el tipado del esquema de validación
export interface Invoice {
    accountId:              string; // identificador propio de su cuenta.
    userId:                 string; // identificador único del usuario que solicita crear la remesa.
    invoiceNo:              string; // identificador que su negocio le asigna a la remesa.
    amount:                 number; // importe de la remesa en dólares americanos.
    remitterIdNumber:       string; // carnet de identidad o pasaporte del remesante.
    remitterName:           string; // nombre del remesante.
    remitterLastName1:      string; // primer apellido del remesante.
    remitterLastName2?:     string; // segundo apellido del remesante. (opcional)
    remitterAddress:        string; // dirección del remesante.
    remitterState:          string; // estado del remesante.
    remitterCity:           string; // ciudad del remesante.
    remitterCountry:        string; // país del remesante.
    beneficiaryCard:        string; // número de tarjeta o cuenta bancaria del beneficiario.
    beneficiaryIdNumber:    string; // carnet de identidad o pasaporte del beneficiario.
    beneficiaryName:        string; // nombre del beneficiario.
    beneficiaryLastName1:   string; // primer apellido del beneficiario.
    beneficiaryLastName2:   string; // segundo apellido del beneficiario. (opcional)
    beneficiaryAddress:     string; // dirección del beneficiario.
    beneficiaryState:       string; // provincia del beneficiario.
    beneficiaryCity:        string; // municipio del beneficiario.
    beneficiaryTown?:       string; // consejo popular o barrio del beneficiario. (opcional)
    beneficiaryPhone:       string; // teléfono del beneficiario.
}

Esquema de validación de la remesa

// Definiendo esquema de validación de la remesa con Zod
export const InvoiceSchema = z.object({
    accountId:              z.string().trim();
    userId:                 z.string().trim(),
    invoiceNo:              z.string().trim(),
    amount:                 z.number(),
    remitterIdNumber:       z.string().trim(),
    remitterName:           z.string().trim(),
    remitterLastName1:      z.string().trim(),
    remitterLastName2:      z.string().trim(),
    remitterAddress:        z.string().trim(),
    remitterState:          z.string().trim(),
    remitterCity:           z.string().trim(),
    remitterCountry:        z.string().trim(),
    beneficiaryCard:        z.string().trim(),
    beneficiaryIdNumber:    z.string().trim(),
    beneficiaryName:        z.string().trim(),
    beneficiaryLastName1:   z.string().trim(),
    beneficiaryLastName2:   z.string().trim(),
    beneficiaryAddress:     z.string().trim(),
    beneficiaryState:       z.string().trim(),
    beneficiaryCity:        z.string().trim(),
    beneficiaryTown:        z.string().trim(),
    beneficiaryPhone:       z.string().trim(),
})

// Infiriendo tipado desde el esquema de validación para evitar duplicar lineas de código
export type Invoice = z.infer<typeof InvoiceSchema>;

// Ejemplo de uso
const invoice = InvoiceSchema(invoiceObject)

// invoiceObject es el objeto antes de cifrar que debe ser igual al resultante del proceso de descifrado

Métodos

Método para el proceso de cifrado

Se recomienda validar el objeto de la remesa antes del cifrado con el mecanismo antes descrito ya que será el mismo mecanismo a utilizar en la API para validar la integridad de la información recibida.

    /**
     * Método para encriptar la información de la remesa
     */
    public encrypt(): string {

        // Objeto que contiene la información de la remesa
        const invoiceObject = {
            accountId: 'string',
            userId: 'string',
            invoiceNo: 'string',
            amount: 0,
            remitterIdNumber: 'string',
            remitterName: 'string',
            remitterLastName1: 'string',
            remitterLastName2: 'string',
            remitterAddress: 'string',
            remitterState: 'string',
            remitterCity: 'string',
            remitterCountry: 'string',
            beneficiaryCard: 'string',
            beneficiaryIdNumber: 'string',
            beneficiaryName: 'string',
            beneficiaryLastName1: 'string',
            beneficiaryLastName2: 'string',
            beneficiaryAddress: 'string',
            beneficiaryState: 'string',
            beneficiaryCity: 'string',
            beneficiaryTown: 'string',
            beneficiaryPhone: 'string',
        };

        // Convertir el objeto a un string
        const stringifiedInvoiceObject = JSON.stringify(invoiceObject);

        // Encriptar el string
        const encryptedInvoice = CryptoJS.AES.encrypt(stringifiedInvoiceObject, 'secret key 123').toString();

        // Devolver el string encriptado
        return encryptedInvoice;

    }

Método para el proceso de descifrado

    /**
     * Método para desencriptar la información de la remesa
     *
     * @param encryptedInvoice
     */
    public decrypt(encryptedInvoice: string): string {

        //! Esta frase debe ir en la variables de entorno del contenedor
        const secretPhrase = 'secret key 123';

        // Desencriptar la información de la remesa
        const decryptedResult = CryptoJS.AES.decrypt(encryptedInvoice, secretPhrase).toString(CryptoJS.enc.Utf8);

        // Convertir la información de la remesa a un objeto
        const invoiceObject = JSON.parse(String(decryptedResult));

        console.log('Decrypted:', invoiceObject);

        // Devolver la información de la remesa
        return invoiceObject;

    }

Petición

Ejemplo de petición

curl -X 'POST' \
'http://api.web.com/w1/invoices/group' \          // URL para la petición
-H 'accept: application/json' \                         // Tipo de contenido aceptado
-H 'Content-Type: application/json' \                   // Formato del cuerpo de la petición
-H 'apiKey: apiKey-para-el-grupo' \                     // Llave proporcionada para el grupo
-d '{ "data": "encryptedInvoice",}'                     // El string con la información de la remesa encriptada

Respuestas de la API

Respuesta: Remesa creada con éxito

{
    ok: true,
    statusCode: 201,
    message: 'Remesa creada con éxito',
}

Respuesta: Solicitud incorrecta

{
    ok: false,
    statusCode: 400,
    message: 'Datos incorrectos',
}

Respuesta: No autorizado

{
    ok: false,
    statusCode: 401,
    message: 'Cliente no autorizado',
}

Respuesta: Operación no aceptada

{
    ok: false,
    statusCode: 406,
    message: 'La remesa supera el límite establecido',
}

Respuesta: Conflicto

{
    ok: false,
    statusCode: 409,
    message: 'La información proporcionada es inconsistente',
}

Respuesta: Error en el servidor

{
    ok: false,
    statusCode: 500,
    message: 'Ha ocurrido un error inesperado',
}
[{
"state": "Pinar del Rio",
"city": "Sandino",
"fCode": "SANDIN"
}, {
"state": "Pinar del Rio",
"city": "Mantua",
"fCode": "MANTUA"
}, {
"state": "Pinar del Rio",
"city": "Minas de Matahambre",
"fCode": "MATA"
}, {
"state": "Pinar del Rio",
"city": "Viñales",
"fCode": "VINA"
}, {
"state": "Pinar del Rio",
"city": "La Palma",
"fCode": "LPALMA"
}, {
"state": "Pinar del Rio",
"city": "Los Palacios",
"fCode": "LPALA"
}, {
"state": "Pinar del Rio",
"city": "Consolación del Sur",
"fCode": "CONSUR"
}, {
"state": "Pinar del Rio",
"city": "Pinar del Río",
"fCode": "PRIO"
}, {
"state": "Pinar del Rio",
"city": "San Luis",
"fCode": "SAN LP"
}, {
"state": "Pinar del Rio",
"city": "San Juan y Martínez",
"fCode": "SJMAR"
}, {
"state": "Pinar del Rio",
"city": "Guane",
"fCode": "GUANE"
}, {
"state": "Artemisa",
"city": "Bahía Honda",
"fCode": "BHONDA"
}, {
"state": "Artemisa",
"city": "Mariel",
"fCode": "MARIEL"
}, {
"state": "Artemisa",
"city": "Guanajay",
"fCode": "GUANAJ"
}, {
"state": "Artemisa",
"city": "Caimito",
"fCode": "CAIMI"
}, {
"state": "Artemisa",
"city": "Bauta",
"fCode": "BAUTA"
}, {
"state": "Artemisa",
"city": "San Antonio de los Baños",
"fCode": "SANTON"
}, {
"state": "Artemisa",
"city": "Güira de Melena",
"fCode": "GUIRA"
}, {
"state": "Artemisa",
"city": "Alquízar",
"fCode": "ALQUI"
}, {
"state": "Artemisa",
"city": "Artemisa",
"fCode": "ARTE"
}, {
"state": "Artemisa",
"city": "Candelaria",
"fCode": "CANDE"
}, {
"state": "Artemisa",
"city": "San Cristóbal",
"fCode": "SCRIST"
}, {
"state": "La Habana",
"city": "Playa",
"fCode": "PLAYA"
}, {
"state": "La Habana",
"city": "Plaza de la Revolución",
"fCode": "PLZ"
}, {
"state": "La Habana",
"city": "Centro Habana",
"fCode": "CENHAB"
}, {
"state": "La Habana",
"city": "La Habana Vieja",
"fCode": "HBV"
}, {
"state": "La Habana",
"city": "Regla",
"fCode": "REGLA"
}, {
"state": "La Habana",
"city": "La Habana del Este",
"fCode": "HBE"
}, {
"state": "La Habana",
"city": "Guanabacoa",
"fCode": "GBA"
}, {
"state": "La Habana",
"city": "San Miguel del Padrón",
"fCode": "SMP"
}, {
"state": "La Habana",
"city": "Diez de Octubre",
"fCode": "10OCT"
}, {
"state": "La Habana",
"city": "Cerro",
"fCode": "CERRO"
}, {
"state": "La Habana",
"city": "Marianao",
"fCode": "MNO"
}, {
"state": "La Habana",
"city": "La Lisa",
"fCode": "LISA"
}, {
"state": "La Habana",
"city": "Boyeros",
"fCode": "BOY"
}, {
"state": "La Habana",
"city": "Arroyo Naranjo",
"fCode": "AN"
}, {
"state": "La Habana",
"city": "Cotorro",
"fCode": "COTO"
}, {
"state": "Mayabeque",
"city": "Bejucal",
"fCode": "BEJUCA"
}, {
"state": "Mayabeque",
"city": "San José de las Lajas",
"fCode": "SLAJAS"
}, {
"state": "Mayabeque",
"city": "Jaruco",
"fCode": "JARUCO"
}, {
"state": "Mayabeque",
"city": "Santa Cruz del Norte",
"fCode": "SCRUZN"
}, {
"state": "Mayabeque",
"city": "Madruga",
"fCode": "MADRU"
}, {
"state": "Mayabeque",
"city": "Nueva Paz",
"fCode": "NUEPAZ"
}, {
"state": "Mayabeque",
"city": "San Nicolás",
"fCode": "SNICOL"
}, {
"state": "Mayabeque",
"city": "Güines",
"fCode": "GUINES"
}, {
"state": "Mayabeque",
"city": "Melena del Sur",
"fCode": "MELSUR"
}, {
"state": "Mayabeque",
"city": "Batabanó",
"fCode": "BATABA"
}, {
"state": "Mayabeque",
"city": "Quivicán",
"fCode": "QUIVI"
}, {
"state": "Matanzas",
"city": "Matanzas",
"fCode": "MATAN"
}, {
"state": "Matanzas",
"city": "Cárdenas",
"fCode": "CARDE"
}, {
"state": "Matanzas",
"city": "Martí",
"fCode": "MARTI"
}, {
"state": "Matanzas",
"city": "Colón",
"fCode": "COLON"
}, {
"state": "Matanzas",
"city": "Perico",
"fCode": "PERICO"
}, {
"state": "Matanzas",
"city": "Jovellanos",
"fCode": "JOVE"
}, {
"state": "Matanzas",
"city": "Pedro Betancourt",
"fCode": "PBETAN"
}, {
"state": "Matanzas",
"city": "Limonar",
"fCode": "LIMON"
}, {
"state": "Matanzas",
"city": "Unión de Reyes",
"fCode": "UNION"
}, {
"state": "Matanzas",
"city": "Ciénaga de Zapata",
"fCode": "CIENAG"
}, {
"state": "Matanzas",
"city": "Jagüey Grande",
"fCode": "JAGUEY"
}, {
"state": "Matanzas",
"city": "Calimete",
"fCode": "CALIME"
}, {
"state": "Matanzas",
"city": "Los Arabos",
"fCode": "ARABOS"
}, {
"state": "Villa Clara",
"city": "Corralillo",
"fCode": "CORRA"
}, {
"state": "Villa Clara",
"city": "Quemado de Güines",
"fCode": "QUEMA"
}, {
"state": "Villa Clara",
"city": "Sagua la Grande",
"fCode": "SAGRAN"
}, {
"state": "Villa Clara",
"city": "Encrucijada",
"fCode": "ENCRU"
}, {
"state": "Villa Clara",
"city": "Camajuaní",
"fCode": "CAMAJU"
}, {
"state": "Villa Clara",
"city": "Caibarién",
"fCode": "CAIBA"
}, {
"state": "Villa Clara",
"city": "Remedios",
"fCode": "REMEDI"
}, {
"state": "Villa Clara",
"city": "Placetas",
"fCode": "PLACE"
}, {
"state": "Villa Clara",
"city": "Santa Clara",
"fCode": "SCLARA"
}, {
"state": "Villa Clara",
"city": "Cifuentes",
"fCode": "CIFUEN"
}, {
"state": "Villa Clara",
"city": "Santo Domingo",
"fCode": "SDOMIN"
}, {
"state": "Villa Clara",
"city": "Ranchuelo",
"fCode": "RANCHU"
}, {
"state": "Villa Clara",
"city": "Manicaragua",
"fCode": "MANICA"
}, {
"state": "Cienfuegos",
"city": "Aguada de Pasajeros",
"fCode": "AGUADA"
}, {
"state": "Cienfuegos",
"city": "Rodas",
"fCode": "RODAS"
}, {
"state": "Cienfuegos",
"city": "Palmira",
"fCode": "PALMI"
}, {
"state": "Cienfuegos",
"city": "Lajas",
"fCode": "LAJAS"
}, {
"state": "Cienfuegos",
"city": "Cruces",
"fCode": "CRUCES"
}, {
"state": "Cienfuegos",
"city": "Cumanayagua",
"fCode": "CUMANA"
}, {
"state": "Cienfuegos",
"city": "Cienfuegos",
"fCode": "CIENF"
}, {
"state": "Cienfuegos",
"city": "Abreus",
"fCode": "ABREUS"
}, {
"state": "Sancti Spíritus",
"city": "Yaguajay",
"fCode": "YAGUA"
}, {
"state": "Sancti Spíritus",
"city": "Jatibonico",
"fCode": "JATI"
}, {
"state": "Sancti Spíritus",
"city": "Taguasco",
"fCode": "TAGUAS"
}, {
"state": "Sancti Spíritus",
"city": "Cabaiguán",
"fCode": "CABAIS"
}, {
"state": "Sancti Spíritus",
"city": "Fomento",
"fCode": "FOMEN"
}, {
"state": "Sancti Spíritus",
"city": "Trinidad",
"fCode": "TRINI"
}, {
"state": "Sancti Spíritus",
"city": "Sancti Spíritus",
"fCode": "SANCTI"
}, {
"state": "Sancti Spíritus",
"city": "La Sierpe",
"fCode": "SIERPE"
}, {
"state": "Ciego de Ávila",
"city": "Chambas",
"fCode": "CHAMBA"
}, {
"state": "Ciego de Ávila",
"city": "Morón",
"fCode": "MORON"
}, {
"state": "Ciego de Ávila",
"city": "Bolivia",
"fCode": "BORIV"
}, {
"state": "Ciego de Ávila",
"city": "Primero de Enero",
"fCode": "1ROENE"
}, {
"state": "Ciego de Ávila",
"city": "Ciro Redondo",
"fCode": "CIRO"
}, {
"state": "Ciego de Ávila",
"city": "Florencia",
"fCode": "FLOREN"
}, {
"state": "Ciego de Ávila",
"city": "Majagua",
"fCode": "MAJAGU"
}, {
"state": "Ciego de Ávila",
"city": "Ciego de Ávila",
"fCode": "CAVILA"
}, {
"state": "Ciego de Ávila",
"city": "Venezuela",
"fCode": "VENE"
}, {
"state": "Ciego de Ávila",
"city": "Baraguá",
"fCode": "BARA"
}, {
"state": "Camagüey",
"city": "Carlos Manuel de Céspedes",
"fCode": "CESPE"
}, {
"state": "Camagüey",
"city": "Esmeralda",
"fCode": "ESMERA"
}, {
"state": "Camagüey",
"city": "Sierra de Cubitas",
"fCode": "CUBITA"
}, {
"state": "Camagüey",
"city": "Minas",
"fCode": "Minas"
}, {
"state": "Camagüey",
"city": "Nuevitas",
"fCode": "NUEVI"
}, {
"state": "Camagüey",
"city": "Guáimaro",
"fCode": "GUAIMA"
}, {
"state": "Camagüey",
"city": "Sibanicú",
"fCode": "SIBANI"
}, {
"state": "Camagüey",
"city": "Camagüey",
"fCode": "CAMA"
}, {
"state": "Camagüey",
"city": "Florida",
"fCode": "FLORI"
}, {
"state": "Camagüey",
"city": "Vertientes",
"fCode": "VERTI"
}, {
"state": "Camagüey",
"city": "Jimaguayú",
"fCode": "JIMAGU"
}, {
"state": "Camagüey",
"city": "Najasa",
"fCode": "NAJASA"
}, {
"state": "Camagüey",
"city": "Santa Cruz del Sur",
"fCode": "SCRUZS"
}, {
"state": "Las Tunas",
"city": "Manatí",
"fCode": "MANATI"
}, {
"state": "Las Tunas",
"city": "Puerto Padre",
"fCode": "PPADRE"
}, {
"state": "Las Tunas",
"city": "Jesús Menéndez",
"fCode": "JMENDE"
}, {
"state": "Las Tunas",
"city": "Majibacoa",
"fCode": "MAJIBA"
}, {
"state": "Las Tunas",
"city": "Las Tunas",
"fCode": "TUNAS"
}, {
"state": "Las Tunas",
"city": "Jobabo",
"fCode": "JOBABO"
}, {
"state": "Las Tunas",
"city": "Colombia",
"fCode": "COLOM"
}, {
"state": "Las Tunas",
"city": "Amancio",
"fCode": "AMANCI"
}, {
"state": "Holguín",
"city": "Gibara",
"fCode": "GIBARA"
}, {
"state": "Holguín",
"city": "Rafael Freyre",
"fCode": "FREIRE"
}, {
"state": "Holguín",
"city": "Banes",
"fCode": "BANES"
}, {
"state": "Holguín",
"city": "Antilla",
"fCode": "ANTILL"
}, {
"state": "Holguín",
"city": "Báguanos",
"fCode": "BAGUA"
}, {
"state": "Holguín",
"city": "Holguín",
"fCode": "HOLGUI"
}, {
"state": "Holguín",
"city": "Calixto García",
"fCode": "CGARCI"
}, {
"state": "Holguín",
"city": "Cacocum",
"fCode": "CACO"
}, {
"state": "Holguín",
"city": "Urbano Noris",
"fCode": "UNORIS"
}, {
"state": "Holguín",
"city": "Cueto",
"fCode": "CUETO"
}, {
"state": "Holguín",
"city": "Mayarí",
"fCode": "MAYARI"
}, {
"state": "Holguín",
"city": "Frank País",
"fCode": "FPAIS"
}, {
"state": "Holguín",
"city": "Sagua de Tánamo",
"fCode": "TANAMO"
}, {
"state": "Holguín",
"city": "Moa",
"fCode": "MOA"
}, {
"state": "Granma",
"city": "Río Cauto",
"fCode": "RCAUTO"
}, {
"state": "Granma",
"city": "Cauto Cristo",
"fCode": "CRISTO"
}, {
"state": "Granma",
"city": "Jiguaní",
"fCode": "JIGUAN"
}, {
"state": "Granma",
"city": "Bayamo",
"fCode": "BAYAMO"
}, {
"state": "Granma",
"city": "Yara",
"fCode": "YARA"
}, {
"state": "Granma",
"city": "Manzanillo",
"fCode": "MANZA"
}, {
"state": "Granma",
"city": "Campechuela",
"fCode": "CAMPE"
}, {
"state": "Granma",
"city": "Media Luna",
"fCode": "MLUNA"
}, {
"state": "Granma",
"city": "Niquero",
"fCode": "NIQUE"
}, {
"state": "Granma",
"city": "Pilón",
"fCode": "PILON"
}, {
"state": "Granma",
"city": "Bartolomé Masó",
"fCode": "BMASO"
}, {
"state": "Granma",
"city": "Buey Arriba",
"fCode": "BUEYA"
}, {
"state": "Granma",
"city": "Guisa",
"fCode": "GUISA"
}, {
"state": "Santiago de Cuba",
"city": "Contramaestre",
"fCode": "CONTRA"
}, {
"state": "Santiago de Cuba",
"city": "Mella",
"fCode": "MELLA"
}, {
"state": "Santiago de Cuba",
"city": "San Luis",
"fCode": "SAN LS"
}, {
"state": "Santiago de Cuba",
"city": "Segundo Frente",
"fCode": "II FRE"
}, {
"state": "Santiago de Cuba",
"city": "Songo - La Maya",
"fCode": "SONGO"
}, {
"state": "Santiago de Cuba",
"city": "Santiago de Cuba",
"fCode": "SCUBA"
}, {
"state": "Santiago de Cuba",
"city": "Palma Soriano",
"fCode": "PALMA"
}, {
"state": "Santiago de Cuba",
"city": "Tercer Frente",
"fCode": "III FR"
}, {
"state": "Santiago de Cuba",
"city": "Guamá",
"fCode": "GUAMA"
}, {
"state": "Guantánamo",
"city": "El Salvador",
"fCode": "SALVA"
}, {
"state": "Guantánamo",
"city": "Manuel Tames",
"fCode": "MANUEL"
}, {
"state": "Guantánamo",
"city": "Yateras",
"fCode": "YATERA"
}, {
"state": "Guantánamo",
"city": "Baracoa",
"fCode": "BARACO"
}, {
"state": "Guantánamo",
"city": "Maisí",
"fCode": "MAISI"
}, {
"state": "Guantánamo",
"city": "Imías",
"fCode": "IMIAS"
}, {
"state": "Guantánamo",
"city": "San Antonio del Sur",
"fCode": "SANSUR"
}, {
"state": "Guantánamo",
"city": "Caimanera",
"fCode": "CAIMAN"
}, {
"state": "Guantánamo",
"city": "Guantánamo",
"fCode": "GUANTA"
}, {
"state": "Guantánamo",
"city": "Niceto Pérez",
"fCode": "NICETO"
}, {
"state": "Isla de la Juventud",
"city": "Isla de la Juventud",
"fCode": "IJUVEN"
}]
[
{ "name": "Pinar del Río", "fCode": "PR" },
{ "name": "Artemisa", "fCode": "ARTE" },
{ "name": "La Habana", "fCode": "CH" },
{ "name": "Mayabeque", "fCode": "MAYA" },
{ "name": "Matanzas", "fCode": "MTZ" },
{ "name": "Cienfuegos", "fCode": "CFG" },
{ "name": "Sancti Spíritus", "fCode": "SS" },
{ "name": "Villa Clara", "fCode": "VC" },
{ "name": "Ciego de Ávila", "fCode": "CAV" },
{ "name": "Camagüey", "fCode": "CMG" },
{ "name": "Las Tunas", "fCode": "TN" },
{ "name": "Holguín", "fCode": "HLG" },
{ "name": "Granma", "fCode": "GRAM" },
{ "name": "Santiago de Cuba", "fCode": "STG" },
{ "name": "Guantánamo", "fCode": "GTM" },
{ "name": "Isla de la Juventud", "fCode": "MESP" }
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment