Para instalarlos ejecutar:
npm i crypto-js # para el cifrado
npm i zod # para la validaciónDocumentación:
import CryptoJS from 'crypto-js';
import { z } from 'zod';// 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.
}// 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 descifradoSe 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 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;
}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{
ok: true,
statusCode: 201,
message: 'Remesa creada con éxito',
}{
ok: false,
statusCode: 400,
message: 'Datos incorrectos',
}{
ok: false,
statusCode: 401,
message: 'Cliente no autorizado',
}{
ok: false,
statusCode: 406,
message: 'La remesa supera el límite establecido',
}{
ok: false,
statusCode: 409,
message: 'La información proporcionada es inconsistente',
}{
ok: false,
statusCode: 500,
message: 'Ha ocurrido un error inesperado',
}