UNPKG

@nicotordev/flowcl-pagos

Version:

SDK en TypeScript para integrar pagos con la API de Flow.cl de manera sencilla y segura.

139 lines 7.13 kB
"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 reembolsos de Flow. * Permite realizar reembolsos en Flow. */ class FlowRefunds { /** * 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 reembolsos en Flow. */ /** * Este servicio permite crear una orden de reembolso. Una vez que el receptor del reembolso acepte o rechaze el reembolso, Flow notificará vía POST a la página del comercio identificada en urlCallback pasando como parámetro token En esta página, el comercio debe invocar el servicio refund/getStatus para obtener el estado del reembolso. * @param {string} data FlowCreateRefundRequest con los datos del reembolso. * @returns {Promise<FlowCreateRefundResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowCreateRefundError} Si hay un error al crear el reembolso. */ this.create = this.createRefund.bind(this); /** * Este servicio permite cancelar una orden de reembolso pendiente * @param {string} token Token de la orden de reembolso * @returns {Promise<FlowCancelRefundResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowCancelRefundError} Si hay un error al cancelar el reembolso. */ this.cancel = this.cancelRefund.bind(this); /** * Este servicio permite obtener el estado de un reembolso. */ this.status = { /** * Permite obtener el estado de un reembolso solicitado. Este servicio se debe invocar desde la página del comercio que se señaló en el parámetro urlCallback del servicio refund/create. * @param {string} token Token de la orden de reembolso * @returns {Promise<FlowRefundStatusResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowRefundStatusError} Si hay un error al obtener el estado del reembolso. */ byToken: this.getRefundStatus.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}/refund`, 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 {Record<string, unknown>} data Datos a enviar en la petición. * @param {'post' | 'get'} 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, 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)) { throw new errors_1.FlowAPIError(err.response?.status || 500, err.message); } error(err); } } /** * Este servicio permite crear una orden de reembolso. Una vez que el receptor del reembolso acepte o rechaze el reembolso, Flow notificará vía POST a la página del comercio identificada en urlCallback pasando como parámetro token En esta página, el comercio debe invocar el servicio refund/getStatus para obtener el estado del reembolso. * @param {FlowCreateRefundRequest} data con los datos del reembolso. * @returns {Promise<FlowCreateRefundResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowCreateRefundError} Si hay un error al crear el reembolso. */ async createRefund(data) { return await this.request('/create', data, 'post', (e) => { throw new errors_1.FlowCreateRefundError(e.message); }); } /** * Este servicio permite cancelar una orden de reembolso pendiente * @param {string} token Token de la orden de reembolso * @returns {Promise<FlowCancelRefundResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowCancelRefundError} Si hay un error al cancelar el reembolso. */ async cancelRefund(token) { return await this.request('/cancel', { token }, 'post', (e) => { throw new errors_1.FlowCancelRefundError(e.message); }); } /** * Permite obtener el estado de un reembolso solicitado. Este servicio se debe invocar desde la página del comercio que se señaló en el parámetro urlCallback del servicio refund/create. * @param {string} token Token de la orden de reembolso * @returns {Promise<FlowRefundStatusResponse>} con la respuesta de Flow. * @throws {FlowAPIError} Si hay un error en la respuesta de la API. * @throws {FlowRefundStatusError} Si hay un error al obtener el estado del reembolso. */ async getRefundStatus(token) { return await this.request('/getStatus', { token }, 'get', (e) => { throw new errors_1.FlowRefundStatusError(e.message); }); } } exports.default = FlowRefunds; //# sourceMappingURL=flow.refunds.js.map