@nicotordev/flowcl-pagos
Version:
SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.
418 lines • 22.8 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const errors_1 = require("../errors");
const flow_utils_1 = require("../utils/flow.utils");
const qs_1 = __importDefault(require("qs"));
/**
* Cliente para interactuar con la API de clientes de Flow.
* Permite realizar operaciones con clientes en Flow.
*/
class FlowCustomers {
/**
* Constructor de la clase FlowClient.
* @param apiKey Clave de API proporcionada por Flow.
* @param secretKey Clave secreta proporcionada por Flow.
* @param baseURL URL base de la API de Flow.
* @throws FlowAuthenticationError Si no se proporciona apiKey o secretKey.
*/
constructor(apiKey, secretKey, baseURL) {
/**
* Operaciones relacionadas con clientes
*/
/**
* Crea un nuevo cliente en Flow.
* @param {FlowCreateCustomerRequest} data Datos del cliente a crear.
* @returns {Promise<FlowCreateCustomerResponse>} Objeto con la información del cliente creado.
* @throws {FlowCreateCustomerError}
* @throws {FlowAPIError}
*/
this.create = this.createCustomer.bind(this);
/**
* Edita un cliente existente en Flow.
* @param {FlowEditCustomerRequest} data Datos del cliente a editar.
* @returns {Promise<FlowEditCustomerResponse>} Objeto con la información del cliente editado.
* @throws {FlowEditCustomerError}¿
* @throws {FlowAPIError}
*/
this.edit = this.editCustomer.bind(this);
/**
* Elimina un cliente en Flow.
* @param {string} customerId Identificador del cliente a eliminar.
* @returns {Promise<FlowDeleteCustomerResponse>} Objeto con la información del cliente eliminado.
* @throws {FlowDeleteCustomerError}
* @throws {FlowAPIError}
*/
this.delete = this.deleteCustomer.bind(this);
/**
* Permite obtener los datos de un cliente en base a su customerId.
* @param {string} customerId Identificador del cliente a obtener.
* @returns {Promise<FlowGetCustomerResponse>} Objeto con la información del cliente.
* @throws {FlowGetCustomerError} Si hay problemas al crear el cliente.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.get = this.getCustomer.bind(this);
/**
* Permite obtener la lista de clientes paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:
* filter: filtro por nombre del cliente
* status: filtro por estado del cliente
* @param {FlowGetCustomerListRequest} data Datos de la petición de la lista de clientes.
* @returns {Promise<FloeGetCustomerListResponse>} Objeto con la información de la lista de clientes.
* @throws {FlowGetCustomerListError} Si hay problemas al obtener la lista de clientes.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
this.list = this.getCustomerList.bind(this);
this.card = {
/**
* Registra una tarjeta de crédito para un cliente en Flow.
* @param {FlowRegisterCardRequest} data Datos de la solicitud de registro de tarjeta.
* @returns {Promise<FlowRegisterCardResponse>} Información de la transacción con URL de redirección.
* @throws {FlowRegisterCardError}
* @throws {FlowAPIError}
*/
register: this.registerCard.bind(this),
/**
* Obtiene el estado del registro de tarjeta de un cliente.
* @param {string} token Token de la transacción.
* @returns {Promise<FlowRegisterCardStatusResponse> } Estado del registro de la tarjeta.
* @throws {FlowRegisterCardStatusError}
* @throws {FlowAPIError}
*/
status: this.registerCardStatus.bind(this),
/**|
* Elimina el registro de la tarjeta de crédito de un cliente.
* @param {string} customerId Identificador del cliente.
* @returns {Promise<FlowDeleteCardResponse>} Información del registro de tarjeta eliminado.
* @throws {FlowDeleteCardError} Si hay problemas al eliminar el registro de la tarjeta.
* @throws {FlowDeleteCardError} Si hay problemas al eliminar el registro de la tarjeta.
*/
delete: this.deleteCard.bind(this),
/**
* Este servicio permite efectuar un cargo automático en la tarjeta de crédito previamente registrada por el cliente. Si el cliente no tiene registrada una tarjeta el metodo retornará error.
* @param {FlowChargeCardRequest} data Datos de la petición de cargo.
* @returns {Promise<FlowChargeCardResponse>} Objeto con la información del cargo.
* @throws {FlowChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
charge: this.chargeCard.bind(this),
/**
* Este servicio envía un cobro a un cliente. Si el cliente tiene registrada una tarjeta de crédito se le hace un cargo automático, si no tiene registrada una tarjeta de credito se genera un cobro. Si se envía el parámetro byEmail = 1, se genera un cobro por email.
* @param {FlowSendChargeRequest} data Datos de la petición de cargo.
* @returns {Promise<FlowSendChargeResponse>} Objeto con la información del cargo.
* @throws {FlowSendChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
sendCharge: this.sendChargeCard.bind(this),
/**
* Este servicio envía de forma masiva un lote de cobros a clientes. Similar al servicio collect pero masivo y asíncrono. Este servicio responde con un token identificador del lote y el número de filas recibidas.
* @param {FlowSendMassiveChargeCardRequest} data Datos de la petición de cargo masivo.
* @returns {Promise<FlowSendMassiveChargeCardResponse>} Objeto con la información del cargo masivo.
* @throws {FlowSendMassiveChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
sendMassiveCharge: this.sendMassiveChargeCard.bind(this),
/**
* Este servicio permite consultar el estado de un lote de cobros enviados por medio del servicio batchCollect.
* @param {string} token Token del lote de cobros.
* @returns {Promise<FlowMassiveChargeCardStatusResponse>} Objeto con la información del estado del lote de cobros.
* @throws {FlowMassiveChargeCardStatusError} Si hay problemas al ver el estado del lote de cobros.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
massiveChargeStatus: this.massiveChargeCardStatus.bind(this),
/**
* Este servicio permite reversar un cargo previamente efectuado a un cliente. Para que el cargo se reverse, este servicio debe ser invocado dentro de las 24 horas siguientes a efectuado el cargo, las 24 horas rigen desde las 14:00 hrs, es decir, si el cargo se efectuó a las 16:00 hrs, este puede reversarse hasta las 14:00 hrs del día siguiente.\n\n Puede enviar como parámetros el commerceOrder o el flowOrder.
* @param {FlowReverseChargeCardRequest} data Datos de la petición de reversa.
* @returns {Promise<FlowReverseChargeCardResponse>} Objeto con la información de la reversa.
* @throws {FlowReverseChargeCardError} Si hay problemas al realizar la reversa.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
reverseCharge: this.reverseChargeCard.bind(this),
/**
* Este servicio obtiene la lista paginada de los cargos efectuados a un cliente.
* @param {FlowListChargesRequest} data Datos de la petición de lista de cargos.
* @returns {Promise<FlowListChargesResponse>} Objeto con la información de la lista de cargos.
* @throws {FlowListChargesCardError} Si hay problemas al listar los cargos.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
listCharges: this.listChargeCard.bind(this),
/**
* Este servicio obtiene la lista paginada de los intentos de cargos fallidos a un cliente.
* @param {FlowListFailedChargesRequest} data Datos de la petición de lista de cargos fallidos.
* @returns {Promise<FlowListFailedChargesResponse>} Objeto con la información de la lista de cargos fallidos.
* @throws {FlowListFailedChargesCardError} Si hay problemas al listar los cargos fallidos.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
listFailedCharges: this.listFailedChargesCard.bind(this),
};
/**
* Operaciones relacionadas con las suscripciones de un cliente.
*/
this.subscriptions = {
/**
* Este servicio obtiene la lista paginada de las suscripciones de un cliente.
* @param {FlowListPaginatedSubscriptionsRequest} data Datos de la petición de lista de suscripciones.
* @returns {Promise<FlowListPaginatedSubscriptionsResponse>} Objeto con la información de la lista de suscripciones.
* @throws {FlowListPaginatedSubscriptionsError} Si hay problemas al listar las suscripciones.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
list: this.listPaginatedSubscriptions.bind(this),
};
if (!apiKey || !secretKey) {
throw new errors_1.FlowAuthenticationError();
}
this.apiKey = apiKey;
this.secretKey = secretKey;
// Crear una instancia de Axios con la configuración base
this.axiosInstance = axios_1.default.create({
baseURL: `${baseURL}/customer`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
}
/**
* Realiza una petición a la API de Flow.
* @param {string} endpoint URL del endpoint de la API.
* @param {string} data Datos a enviar en la petición.
* @param {string} method Método de la petición (POST o GET).
* @param {(err: unknown) => never} error - Error a lanzar en caso de error.
* @returns {Promise<T>} Respuesta de la API.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
* @throws {Error} Si hay problemas al realizar la petición.
*/
async request(endpoint, data, method = 'post', error) {
try {
const allData = {
...data,
apiKey: this.apiKey,
};
const formData = (0, flow_utils_1.generateFormData)(allData, this.secretKey);
const formDataSearchParams = new URLSearchParams(formData);
const response = method === 'post'
? await this.axiosInstance.post(`${endpoint}`, qs_1.default.stringify(formData))
: await this.axiosInstance.get(`${endpoint}?${formDataSearchParams}`);
return response.data;
}
catch (err) {
if (axios_1.default.isAxiosError(err)) {
console.log(err.response?.data);
throw new errors_1.FlowAPIError(err.response?.status || 500, err.message);
}
error(err);
}
}
/**
* Crea un nuevo cliente en Flow.
* @param {FlowCreateCustomerRequest} data Datos del cliente a crear.
* @returns {Promise<FlowCreateCustomerResponse>} Objeto con la información del cliente creado.
* @throws {FlowCreateCustomerError}
* @throws {FlowAPIError}
*/
async createCustomer(data) {
return await this.request('/create', data, 'post', (e) => {
throw new errors_1.FlowCreateCustomerError(e.message);
});
}
/**
* Edita un cliente existente en Flow.
* @param {FlowEditCustomerRequest} data Datos del cliente a editar.
* @returns {Promise<FlowEditCustomerResponse>} Objeto con la información del cliente editado.
* @throws {FlowEditCustomerError}¿
* @throws {FlowAPIError}
*/
async editCustomer(data) {
return await this.request('/edit', data, 'post', (e) => {
throw new errors_1.FlowEditCustomerError(e.message);
});
}
/**
* Elimina un cliente en Flow.
* @param {string} customerId Identificador del cliente a eliminar.
* @returns {Promise<FlowDeleteCustomerResponse>} Objeto con la información del cliente eliminado.
* @throws {FlowDeleteCustomerError}
* @throws {FlowAPIError}
*/
async deleteCustomer(customerId) {
return await this.request('/delete', { customerId }, 'post', (e) => {
throw new errors_1.FlowDeleteCustomerError(e.message);
});
}
/**
* Obtiene los datos de un cliente por su ID.
* @param {string} customerId Identificador del cliente.
* @returns {Promise<FlowGetCustomerResponse>} Objeto con la información del cliente.
* @throws {FlowGetCustomerError}
* @throws {FlowAPIError}
*/
async getCustomer(customerId) {
return await this.request('/get', { customerId }, 'get', (e) => {
throw new errors_1.FlowGetCustomerError(e.message);
});
}
/**
* Obtiene una lista de clientes con paginación y filtros.
* @param {FlowGetCustomerListRequest} data Parámetros de paginación y filtro.
* @returns {Promise<FlowGetCustomerListResponse>} Lista de clientes paginada.
* @throws {FlowGetCustomerListError}
* @throws {FlowAPIError}
*/
async getCustomerList(data) {
return await this.request('/list', data, 'get', (e) => {
throw new errors_1.FlowGetCustomerListError(e.message);
});
}
/**
* Registra una tarjeta de crédito para un cliente en Flow.
* @param {FlowRegisterCardRequest} data Datos de la solicitud de registro de tarjeta.
* @returns {Promise<FlowRegisterCardResponse>} Información de la transacción con URL de redirección.
* @throws {FlowRegisterCardError}
* @throws {FlowAPIError}
*/
async registerCard(data) {
const response = await this.request('/register', data, 'post', (e) => {
throw new errors_1.FlowRegisterCardError(e.message);
});
return {
...response,
redirectUrl: `${response.url}?token=${response.token}`,
};
}
/**
* Obtiene el estado del registro de tarjeta de un cliente.
* @param {string} token Token de la transacción.
* @returns {Promise<FlowRegisterCardStatusResponse> } Estado del registro de la tarjeta.
* @throws {FlowRegisterCardStatusError}
* @throws {FlowAPIError}
*/
async registerCardStatus(token) {
return await this.request('/getRegisterStatus', { token }, 'post', (e) => {
throw new errors_1.FlowRegisterCardStatusError(e.message);
});
}
/**
* Elimina el registro de la tarjeta de crédito de un cliente.
* @param {string} customerId Identificador del cliente.
* @returns {Promise<FlowDeleteCardResponse>} Información del registro de tarjeta eliminado.
* @throws {FlowDeleteCardError} Si hay problemas al eliminar el registro de la tarjeta.
* @throws {FlowDeleteCardError} Si hay problemas al eliminar el registro de la tarjeta.
*/
async deleteCard(customerId) {
return await this.request('/unRegister', { customerId }, 'post', (e) => {
throw new errors_1.FlowDeleteCardError(e.message);
});
}
/**
* Este servicio permite efectuar un cargo automático en la tarjeta de crédito previamente registrada por el cliente. Si el cliente no tiene registrada una tarjeta el metodo retornará error.
* @param {FlowChargeCardRequest} data Datos de la petición de cargo.
* @returns {Promise<FlowChargeCardResponse>} Objeto con la información del cargo.
* @throws {FlowChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async chargeCard(data) {
return await this.request('/charge', data, 'post', (e) => {
throw new errors_1.FlowChargeCardError(e.message);
});
}
/**
* Este servicio envía un cobro a un cliente. Si el cliente tiene registrada una tarjeta de crédito se le hace un cargo automático, si no tiene registrada una tarjeta de credito se genera un cobro. Si se envía el parámetro byEmail = 1, se genera un cobro por email.
* @param {FlowSendChargeRequest} data Datos de la petición de cargo.
* @returns {Promise<FlowSendChargeResponse>} Objeto con la información del cargo.
* @throws {FlowSendChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async sendChargeCard(data) {
return await this.request('/collect', {
...data,
paymentMethod: (0, flow_utils_1.getPaymentMethod)(data.paymentMethod ?? 'flow'),
}, 'post', (e) => {
throw new errors_1.FlowSendChargeCardError(e.message);
});
}
/**
* Este servicio envía de forma masiva un lote de cobros a clientes. Similar al servicio collect pero masivo y asíncrono. Este servicio responde con un token identificador del lote y el número de filas recibidas.
* @param {FlowSendMassiveChargeCardRequest} data Datos de la petición de cargo masivo.
* @returns {Promise<FlowSendMassiveChargeCardResponse>} Objeto con la información del cargo masivo.
* @throws {FlowSendMassiveChargeCardError} Si hay problemas al realizar el cargo.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async sendMassiveChargeCard(data) {
return await this.request('/batchCollect', {
...data,
batchRows: data.batchRows.map((row) => ({
...row,
paymentMethod: (0, flow_utils_1.getPaymentMethod)(row.paymentMethod ?? 'flow'),
})),
}, 'post', (e) => {
throw new errors_1.FlowSendMassiveChargeCardError(e.message);
});
}
/**
* Este servicio permite consultar el estado de un lote de cobros enviados por medio del servicio batchCollect.
* @param {string} token Token del lote de cobros.
* @returns {Promise<FlowMassiveChargeCardStatusResponse>} Objeto con la información del estado del lote de cobros.
* @throws {FlowMassiveChargeCardStatusError} Si hay problemas al ver el estado del lote de cobros.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async massiveChargeCardStatus(token) {
return await this.request('/getBatchCollectStatus', { token }, 'get', (e) => {
throw new errors_1.FlowMassiveChargeCardStatusError(e.message);
});
}
/**
* Este servicio permite reversar un cargo previamente efectuado a un cliente. Para que el cargo se reverse, este servicio debe ser invocado dentro de las 24 horas siguientes a efectuado el cargo, las 24 horas rigen desde las 14:00 hrs, es decir, si el cargo se efectuó a las 16:00 hrs, este puede reversarse hasta las 14:00 hrs del día siguiente.\n\n Puede enviar como parámetros el commerceOrder o el flowOrder.
* @param {FlowReverseChargeCardRequest} data Datos de la petición de reversa.
* @returns {Promise<FlowReverseChargeCardResponse>} Objeto con la información de la reversa.
* @throws {FlowReverseChargeCardError} Si hay problemas al realizar la reversa.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
async reverseChargeCard(data) {
return await this.request('/reverseCharge', data, 'post', (e) => {
throw new errors_1.FlowReverseChargeCardError(e.message);
});
}
/**
* Este servicio obtiene la lista paginada de los cargos efectuados a un cliente.
* @param {FlowListChargesRequest} data Datos de la petición de lista de cargos.
* @returns {Promise<FlowListChargesResponse>} Objeto con la información de la lista de cargos.
* @throws {FlowListChargesCardError} Si hay problemas al listar los cargos.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*
*/
async listChargeCard(data) {
return await this.request('/getCharges', data, 'get', (e) => {
throw new errors_1.FlowListChargesCardError(e.message);
});
}
/**
* Este servicio obtiene la lista paginada de los intentos de cargos fallidos a un cliente.
* @param {FlowListFailedChargesRequest} data Datos de la petición de lista de cargos fallidos.
* @returns {Promise<FlowListFailedChargesResponse>} Objeto con la información de la lista de cargos fallidos.
* @throws {FlowListFailedChargesCardError} Si hay problemas al listar los cargos fallidos.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async listFailedChargesCard(data) {
return await this.request('/getChargeAttemps', data, 'get', (e) => {
throw new errors_1.FlowListFailedChargesCardError(e.message);
});
}
/**
* Este servicio obtiene la lista paginada de las suscripciones de un cliente.
* @param {FlowListPaginatedSubscriptionsRequest} data Datos de la petición de lista de suscripciones.
* @returns {Promise<FlowListPaginatedSubscriptionsResponse>} Objeto con la información de la lista de suscripciones.
* @throws {FlowListPaginatedSubscriptionsError} Si hay problemas al listar las suscripciones.
* @throws {FlowAPIError} Si hay problemas con la API de Flow.
*/
async listPaginatedSubscriptions(data) {
return await this.request('/getSubscriptions', data, 'get', (e) => {
throw new errors_1.FlowListPaginatedSubscriptionsError(e.message);
});
}
}
exports.default = FlowCustomers;
//# sourceMappingURL=flow.customers.js.map