@nicotordev/flowcl-pagos
Version:
SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.
306 lines • 17.5 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 pagos de Flow.
* Permite crear órdenes de pago y consultar su estado.
* Implementa un sistema de errores personalizados para un mejor manejo de fallos.
*/
class FlowPayments {
/**
* Constructor de la clase FlowClient.
* @param {string} apiKey Clave de API proporcionada por Flow.
* @param {string} secretKey Clave secreta proporcionada por Flow.
* @param {string}baseURL URL base de la API de Flow.
* @throws {FlowAuthenticationError} Si no se proporciona apiKey o secretKey.
*/
constructor(apiKey, secretKey, baseURL) {
/**
* Objeto que proporciona métodos para interactuar con los pagos en Flow.
*/
/**
* Métodos para consultar el estado de pagos en Flow mediante diferentes identificadores.
*/
this.status = {
/**
* Obtiene el estado de un pago en Flow.
* @param {string} token Token del pago a consultar.
* @returns {Promise<FlowPaymentStatusResponse>} Respuesta de Flow con el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
byToken: this.getPaymentStatusByToken.bind(this),
/**
* Obtiene el estado de un pago utilizando el identificador de comercio.
* @param {string} commerceId Identificador único del comercio asignado al pago.
* @returns {Promise<FlowPaymentStatusResponse>} Una promesa que resuelve con la respuesta de Flow sobre el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
byCommerceId: this.getPaymentStatusByCommerceId.bind(this),
/**
* Obtiene el estado de un pago utilizando el número de orden de Flow.
* @param {number} flowOrder Número de orden de Flow asignado al pago.
* @returns {Promise<FlowPaymentStatusResponse>} Una promesa que resuelve con la respuesta de Flow sobre el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
byFlowOrderNumber: this.getPaymentStatusByFlowOrderNumber.bind(this),
};
/**
* Obtiene la lista de pagos recibidos en una fecha específica.
* @param {FlowPaymentsReceivedByDateRequest} data con la fecha en formato YYYY-MM-DD
* @returns {Promise<FlowPaymentsReceivedByDateResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
this.listPaymentsByDate = this.getPaymentsReceivedByDate.bind(this);
/**
* Obtiene la lista de transacciones recibidas en una fecha específica.
* @param {FlowTransactionsReceivedByDateRequest} data con la fecha en formato YYYY-MM-DD
* @returns {Promise<FlowTransactionsReceivedByDateResponse>} con la lista de transacciones recibidas en la fecha indicada.
* @throws {TransactionsReceivedByDateError} Si ocurre un error al obtener la lista de transacciones recibidas.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
this.listTransactionsByDate = this.getTransactionsReceivedByDate.bind(this);
this.statusExtended = {
/**
* Obtiene el estado extendido de un pago en base al token
* @param {string} token Token único del pago a consultar.
* @returns {Promise<FlowPaymentsStatusExtendedResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
byToken: this.getStatusExtendedByToken.bind(this),
/**
* Obtiene el estado extendido de un pago en base al flowOrder
* @param {number} flowOrder numero de orden de Flow asignado al pago por ejemplo 68977654
* @returns {Promise<FlowPaymentsStatusExtendedResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*
* */
byFlowOrder: this.getStatusExtendedByFlowOrder.bind(this),
};
/**
* Este método permite crear una orden de pago a Flow y recibe como respuesta la URL para redirigir el browser del pagador y el token que identifica la transacción. La url de redirección se debe formar concatenando los valores recibidos en la respuesta de la siguiente forma: url + "?token=" +token Una vez que el pagador efectúe el pago, Flow notificará el resultado a la página del comercio que se envió en el parámetro urlConfirmation.
* @param {FlowCreatePaymentRequest} data con los datos necesarios para crear un pago.
* @returns {Promise<FlowCreatePaymentResponse>} con la respuesta de Flow al crear un pago.
* @throws {FlowCreatePaymentError} Si ocurre un error al crear el pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
this.create = this.createPayment.bind(this);
/**
* Permite generar un cobro por email. Flow emite un email al pagador que contiene la información de la Orden de pago y el link de pago correspondiente. Una vez que el pagador efectúe el pago, Flow notificará el resultado a la página del comercio que se envió en el parámetro urlConfirmation.
* @param {FlowCreatePaymentByEmailRequest} data con los datos necesarios para crear un pago.
* @returns {Promise<FlowCreatePaymentByEmailResponse>} con la respuesta de Flow al crear un pago.
* @throws {FlowCreatePaymentByEmailError} Si ocurre un error al crear el pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
this.createByEmail = this.createPaymentByEmail.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}/payment`,
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 {'post' | 'get'} method Método de la petición (POST o GET).
* @param {(e: unknown) => never} error Error a lanzar en caso de error.
* @param {(data: P) => P} [modifyResponse] Función para modificar la respuesta de la API.
* @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, modifyResponse) {
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}`);
if (modifyResponse) {
return modifyResponse(data);
}
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);
}
}
/**
* Obtiene el estado de un pago en Flow.
* @param {string} token Token del pago a consultar.
* @returns {Promise<FlowPaymentStatusResponse>} Respuesta de Flow con el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getPaymentStatusByToken(token) {
const paymentStatus = await this.request('/getStatus', { token }, 'get', (e) => {
throw new errors_1.FlowPaymentStatusError(e.message);
});
return {
...paymentStatus,
statusStr: (0, flow_utils_1.getPaymentStatus)(paymentStatus.status),
};
}
/**
* Obtiene el estado de un pago utilizando el identificador de comercio.
* @param {string} commerceId Identificador único del comercio asignado al pago.
* @returns {Promise<FlowPaymentStatusResponse>} Una promesa que resuelve con la respuesta de Flow sobre el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getPaymentStatusByCommerceId(commerceId) {
const paymentStatus = await this.request('/getPaymentStatusByCommerceId', { commerceId }, 'get', (e) => {
throw new errors_1.FlowPaymentStatusError(e.message);
});
return {
...paymentStatus,
statusStr: (0, flow_utils_1.getPaymentStatus)(paymentStatus.status),
};
}
/**
* Obtiene el estado de un pago utilizando el número de orden de Flow.
* @param {number} flowOrder Número de orden de Flow asignado al pago.
* @returns {Promise<FlowPaymentStatusResponse>} Una promesa que resuelve con la respuesta de Flow sobre el estado del pago.
* @throws {FlowPaymentStatusError} Si ocurre un error al obtener el estado del pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getPaymentStatusByFlowOrderNumber(flowOrder) {
const paymentStatus = await this.request('/getStatusByFlowOrder', { flowOrder }, 'get', (e) => {
throw new errors_1.FlowPaymentStatusError(e.message);
});
return {
...paymentStatus,
statusStr: (0, flow_utils_1.getPaymentStatus)(paymentStatus.status),
};
}
/**
* Obtiene la lista de pagos recibidos en una fecha específica.
* @param {FlowPaymentsReceivedByDateRequest} data con la fecha en formato YYYY-MM-DD
* @returns {Promise<FlowPaymentsReceivedByDateResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getPaymentsReceivedByDate(data) {
if (!(0, flow_utils_1.isValidPaymentReceivedByDate)(data.date)) {
throw new errors_1.FlowPaymentsReceivedByDateError('Fecha no válida');
}
return await this.request('/getPayments', data, 'get', (e) => {
throw new errors_1.FlowPaymentsReceivedByDateError(e.message);
});
}
/**
* Obtiene el estado extendido de un pago en base al token
* @param {string} token Token único del pago a consultar.
* @returns {Promise<FlowPaymentsStatusExtendedResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getStatusExtendedByToken(token) {
const statusExtended = await this.request('/getStatusExtended', { token }, 'get', (e) => {
throw new errors_1.FlowStatusExtendedError(e.message);
});
return {
...statusExtended,
statusStr: (0, flow_utils_1.getPaymentStatus)(statusExtended.status),
};
}
/**
* Obtiene el estado extendido de un pago en base al flowOrder
* @param {number} flowOrder numero de orden de Flow asignado al pago por ejemplo 68977654
* @returns {Promise<FlowPaymentsStatusExtendedResponse>} con la lista de pagos recibidos en la fecha indicada.
* @throws {PaymentsReceivedByDateError} Si ocurre un error al obtener la lista de pagos recibidos.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*
* */
async getStatusExtendedByFlowOrder(flowOrder) {
const statusExtended = await this.request('/getStatusByFlowOrderExtended', { flowOrder }, 'get', (e) => {
throw new errors_1.FlowStatusExtendedError(e.message);
});
return {
...statusExtended,
statusStr: (0, flow_utils_1.getPaymentStatus)(statusExtended.status),
};
}
/**
* Obtiene la lista de transacciones recibidas en una fecha específica.
* @param {FlowTransactionsReceivedByDateRequest} data con la fecha en formato YYYY-MM-DD
* @returns {Promise<FlowTransactionsReceivedByDateResponse>} con la lista de transacciones recibidas en la fecha indicada.
* @throws {TransactionsReceivedByDateError} Si ocurre un error al obtener la lista de transacciones recibidas.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async getTransactionsReceivedByDate(data) {
if (!(0, flow_utils_1.isValidPaymentReceivedByDate)(data.date)) {
throw new errors_1.FlowTransactionsReceivedByDateError('Fecha no válida');
}
return await this.request('/getTransactions', data, 'get', (e) => {
throw new errors_1.FlowTransactionsReceivedByDateError(e.message);
});
}
/**
* Este método permite crear una orden de pago a Flow y recibe como respuesta la URL para redirigir el browser del pagador y el token que identifica la transacción. La url de redirección se debe formar concatenando los valores recibidos en la respuesta de la siguiente forma: url + "?token=" +token Una vez que el pagador efectúe el pago, Flow notificará el resultado a la página del comercio que se envió en el parámetro urlConfirmation.
* @param {FlowCreatePaymentRequest} data con los datos necesarios para crear un pago.
* @returns {Promise<FlowCreatePaymentResponse>} con la respuesta de Flow al crear un pago.
* @throws {FlowCreatePaymentError} Si ocurre un error al crear el pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async createPayment(data) {
const response = await this.request('/create', {
...data,
paymentMethod: (0, flow_utils_1.getPaymentMethod)(data.paymentMethod || 'flow'),
}, 'post', (e) => {
throw new errors_1.FlowCreatePaymentError(e.message);
});
return {
...response,
redirectUrl: response.url + '?token=' + response.token,
};
}
/**
* Permite generar un cobro por email. Flow emite un email al pagador que contiene la información de la Orden de pago y el link de pago correspondiente. Una vez que el pagador efectúe el pago, Flow notificará el resultado a la página del comercio que se envió en el parámetro urlConfirmation.
* @param {FlowCreatePaymentByEmailRequest} data con los datos necesarios para crear un pago.
* @returns {Promise<FlowCreatePaymentByEmailResponse>} con la respuesta de Flow al crear un pago.
* @throws {FlowCreatePaymentByEmailError} Si ocurre un error al crear el pago.
* @throws {FlowAPIError} Si la API de Flow responde con un error HTTP.
*/
async createPaymentByEmail(data) {
const response = await this.request('/createEmail', {
...data,
paymentMethod: (0, flow_utils_1.getPaymentMethod)(data.paymentMethod || 'flow'),
}, 'post', (e) => {
throw new errors_1.FlowCreatePaymentByEmailError(e.message);
});
return {
...response,
redirectUrl: response.url + '?token=' + response.token,
};
}
}
exports.default = FlowPayments;
//# sourceMappingURL=flow.payments.js.map