diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c8aa9d8..4a38003 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: rev: v3.17.0 hooks: - id: pyupgrade - args: [--py38-plus] + args: [--py39-plus] - repo: https://github.com/hhatto/autopep8 rev: v2.3.1 hooks: diff --git a/.vscode/pyflowcl.code-workspace b/.vscode/pyflowcl.code-workspace index c3d97e0..d337da4 100644 --- a/.vscode/pyflowcl.code-workspace +++ b/.vscode/pyflowcl.code-workspace @@ -1,33 +1,30 @@ -{ - "folders": [ - { - "path": ".." - }, - { - "path": "../../stripe-python" - } - ], - "settings": { - "python.analysis.typeCheckingMode": "off", - "editor.defaultFormatter": "ms-python.black-formatter", - "editor.formatOnSaveMode": "file", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true - }, - "[jsonc]": { - "editor.defaultFormatter": "vscode.json-language-features" - }, - "isort.args": [ - "--profile", - "black", - "--filter-files" - ], - "isort.check": true, - "diffEditor.codeLens": true, - "python.defaultInterpreterPath": "/home/mariofix/.cache/pypoetry/virtualenvs/pyflowcl-S15X6UCq-py3.8/bin/python", - "[markdown]": { - "editor.defaultFormatter": "DavidAnson.vscode-markdownlint" - }, - } -} +// { +// "folders": [ +// { +// "path": ".." +// } +// ], +// "settings": { +// "python.analysis.typeCheckingMode": "off", +// "editor.defaultFormatter": "ms-python.black-formatter", +// "editor.formatOnSaveMode": "file", +// "editor.formatOnSave": true, +// "editor.codeActionsOnSave": { +// "source.organizeImports": "explicit" +// }, +// "[jsonc]": { +// "editor.defaultFormatter": "vscode.json-language-features" +// }, +// "isort.args": [ +// "--profile", +// "black", +// "--filter-files" +// ], +// "isort.check": true, +// "diffEditor.codeLens": true, +// "python.defaultInterpreterPath": "/home/mariofix/.cache/pypoetry/virtualenvs/pyflowcl-S15X6UCq-py3.10/bin/python", +// "[markdown]": { +// "editor.defaultFormatter": "DavidAnson.vscode-markdownlint" +// }, +// } +// } diff --git a/README.md b/README.md index 77a30e4..4c260c7 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,14 @@ # Bienvenido a pyflowcl -Pyflowcl es una biblioteca de Python que proporciona una interfaz para interactuar con la API de Flow en Chile. Con pyflowcl, puedes realizar diversas operaciones, como crear pagos, obtener información de pagos, realizar reembolsos y más. +Hace aproximadamente 10 años comencé a desarrollar esta librería con el objetivo de crear una herramienta simple y funcional para el sistema en el que estaba trabajando. Aunque el primer commit es de hace 4 años, la he estado utilizando desde entonces, refinándola según las necesidades. Inicialmente, implementé el manejo de pagos y reembolsos, y en ese momento, funcionaba perfectamente. Sin embargo, cuando intenté añadir soporte para suscripciones y otras características más complejas, me encontré con que la API era mucho más extensa de lo que esperaba. Además, surgió un problema de formato en el archivo que impidió que se pudiera leer correctamente. +Investigando soluciones, descubrí la librería Dorthu/openapi3, que permitía generar automáticamente una API a partir del archivo YAML proporcionado por Flow, lo que parecía ideal para simplificar el proceso en Python. Implementé el soporte completo para la API, logrando que funcionara en un 90%, aunque todavía no es completamente usable. Intenté contribuir con una solución para un bug, pero no fue aceptada. Además, el mantenedor no ha realizado actualizaciones en los últimos dos años. Por eso, he decidido dejar de dar soporte a FlowAPI y migrar hacia FlowClient, actualizando la documentación en consecuencia. Los pasos para realizar esta transición están detallados en la documentación. + +pyflowcl es una biblioteca de Python que proporciona una interfaz para interactuar con la API de Flow en Chile. Con pyflowcl, puedes realizar diversas operaciones, como crear pagos, obtener información de pagos, realizar reembolsos y más. + +![PyPI - Status](https://img.shields.io/pypi/status/pyflowcl) [![Tests&Coverage](https://github.com/mariofix/pyflowcl/actions/workflows/tests_coverage.yml/badge.svg?branch=main)](https://github.com/mariofix/pyflowcl/actions/workflows/tests_coverage.yml) +[![Downloads](https://pepy.tech/badge/pyflowcl)](https://pepy.tech/project/pyflowcl) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/7254d825df2d4292bf68563548d41f64)](https://app.codacy.com/gh/mariofix/pyflowcl/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/7254d825df2d4292bf68563548d41f64)](https://app.codacy.com/gh/mariofix/pyflowcl/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/mariofix/pyflowcl/main.svg)](https://results.pre-commit.ci/latest/github/mariofix/pyflowcl/main) @@ -10,8 +16,7 @@ Pyflowcl es una biblioteca de Python que proporciona una interfaz para interactu ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyflowcl) ![PyPI - Implementation](https://img.shields.io/pypi/implementation/pyflowcl) ![PyPI - License](https://img.shields.io/pypi/l/pyflowcl) -![PyPI - Status](https://img.shields.io/pypi/status/pyflowcl) - +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) ## Instalación @@ -26,23 +31,26 @@ pip install pyflowcl Aquí hay un ejemplo básico de cómo usar pyflowcl para crear un pago: ```python -from pyflowcl import FlowAPI -from pyflowcl.utils import genera_parametros - -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") -parametros = { - "apiKey": api.api_key, - "amount": 10000, - "currency": "CLP", - "subject": "Ejemplo de Pago", - "email": "correo@example.com", - "urlConfirmation": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "urlReturn": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "commerceOrder": "order_1234", +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient + +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) +pago = { + "subject": "Asunto Email", + "commerceOrder": "1234", + "amount": 5000, + "email": "mariofix@pm.me", + "urlConfirmation": "https://mariofix.com", + "urlReturn": "https://mariofix.com", } -pago = api.objetos.call_payment_create(parameters=genera_parametros(parametros, api.api_secret)) -print(pago) -> { "flowOrder": 123456, "url": "https://www.flow.cl/app/pay.php", "token": "tok_123456" } + +llamada = Payment.create(api, pago) +print(f"{llamada = }") +> llamada = { "flowOrder": 123456, "url": "https://www.flow.cl/app/pay.php", "token": "tok_123456" } # Obtiene la URL de pago print(f"URL de pago: {pago.url}?token={pago.token}") diff --git a/cliente_openapi.py b/cliente_openapi.py deleted file mode 100644 index 9cf8608..0000000 --- a/cliente_openapi.py +++ /dev/null @@ -1,41 +0,0 @@ -from pyflowcl import FlowAPI -from pyflowcl.utils import genera_parametros - -# Descomenta todo esto para habilitar debug logs en este ejemplo -# -# import http.client as http_client -# import logging -# http_client.HTTPConnection.debuglevel = 1 -# logging.basicConfig() -# logging.getLogger().setLevel(logging.DEBUG) -# requests_log = logging.getLogger("requests.packages.urllib3") -# requests_log.setLevel(logging.DEBUG) -# requests_log.propagate = True - -api = FlowAPI( - api_key="FLOW API LKEY", - api_secret="FLOW API SECRET", - endpoint="sandbox", -) -parametros = { - "apiKey": api.api_key, - "amount": 10000, - "currency": "CLP", - "subject": "Pago desde pyFlowcl", - "email": "mariofix@proton.me", - "urlConfirmation": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "urlReturn": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "commerceOrder": "order_1234", -} -print("Creando Pago de Ejemplo...") -pago = api.objetos.call_payment_create(data=genera_parametros(parametros, api.api_secret)) -print("Informacion de pago:") -print(pago) -parametros_status = { - "apiKey": api.api_key, - "token": pago.token, -} -print("Obteniendo Estado...") -estado = api.objetos.call_payment_getstatus(parameters=genera_parametros(parametros_status, api.api_secret)) -print("Informacion de Estado:") -print(estado) diff --git a/docs/apiFlow.yaml.md b/docs/apiFlow.yaml.md deleted file mode 100644 index 3729cf4..0000000 --- a/docs/apiFlow.yaml.md +++ /dev/null @@ -1,5597 +0,0 @@ -Archivo original extraido desde [https://www.flow.cl/docs/apiFlow.yaml?v=6](https://www.flow.cl/docs/apiFlow.yaml?v=6) -```yaml -openapi: 3.0.0 -servers: - - url: 'https://www.flow.cl/api' - description: Production server (uses live data) - - url: 'https://sandbox.flow.cl/api' - description: Sandbox server (uses test data) -info: - description: | - # Introducción - - Bienvenido a la documentacion de referencia del **API REST** de Flow! - [REST](http://en.wikipedia.org/wiki/REST_API) es un protocolo de servicio web que se presta para un desarrollo rápido mediante el uso de la tecnología HTTP y JSON. - - La API REST de Flow proporciona un amplio conjunto de operaciones y recursos para: - - - Payments (Pagos) - - - Customer (Clientes, cobros, cargos automáticos) - - - Refunds (Reembolsos) - - - Subscriptions (Suscripciones, cobros recurrentes) - - - Coupons (Cupones de descuento para subscripciones) - - - Settlement (Liquidaciones de pagos, reembolsos y comisiones,) - - - Merchants (Gestión de comercios asociados) - - ## Versionamiento - La API se encuentra en constante crecimiento, añadiendo nuevos servicios y/o mejorando funcionalidades existentes para que nuestros clientes puedan sacar el mayor provecho posible a sus integraciones. Por lo mismo, cada vez que se hacen cambios en la API se considera que son compatibles con la versiones anteriores. - - Ahora bien, FLOW considera los siguientes cambios como compatibles con versiones anteriores: - - - Añadir nuevos servicios - - Añadir nuevos parámetros opcionales a servicios existentes - - Añadir nuevas propiedades a respuestas de servicios existentes - - Modificar el orden de las propiedades en respuestas existentes - - Debido a lo anterior es que instamos a nuestros clientes a que consideren estos aspectos en sus integraciones, para evitar inconvenientes con nuevas versiones. - - Para más información en relación a los cambios pueden revisar el API changelog y suscribirse a nuestra lista de correos para enterarse de anuncios de la API. - - ## Acceso al API - - SI tienes una cuenta en Flow, puedes acceder al API REST mediante los siguientes endpoints: - - - - - - - - - - - - - - - - - - -
SiteBase URL for Rest Endpoints
Productionhttps://www.flow.cl/api
Sandboxhttps://sandbox.flow.cl/api
- - El endpoint de Producción proporciona acceso directo para generar transacciones reales. El endpoint Sandbox permite probar su integración sin afectar los datos reales. - - ## Autenticación y Seguridad - - El API soporta como método de autenticación el **APIKey** y como seguridad, los datos que usted envíe siempre deberían estar firmado con su **SecretKey**. De esta forma, Flow verifica que los datos enviados le pertenecen y que no fueron adulterados durante la transmisión de red. - Además, los datos viajan encriptados con un canal seguro mediante **SSL.** - - Tanto su ApiKey como su SecretKey se obtienen desde su cuenta de Flow: - - - - - - - - - - - - - - - - - -
SitioMi cuenta Flow
Productionhttps://www.flow.cl/app/web/misDatos.php
Sandboxhttps://sandbox.flow.cl/app/web/misDatos.php
- - ## ¿Cómo firmar con su SecretKey? - Se deben firmar todos los parámetros menos el parámetro **s** que es donde va la firma. - Primero se deben ordenar los parámetros de forma alfabética ascendente en base al nombre del parámetro. - - Una vez ordenados, se deben concatenar en un string los parámetros de la siguiente forma: - - Nombre_del_parametro **valor** nombre_del_parametro **valor**. - - **Ejemplo:** - - Si sus parámetros son: - - "apiKey" = "XXXX-XXXX-XXXX" - - "currency" = "CLP" - - "amount" = 5000 - - El string ordenado para firmar deberia ser: - - **"amount5000apiKeyXXXX-XXXX-XXXXcurrencyCLP"** - - - - El string concatenado se debe firmar con la función **hmac** utilizando el algoritmo **sha256** y su **secretKey** como llave. - - - ### Ejemplo PHP - Ordenando los parámetros: - ```php - $params = array( - "apiKey" => "1F90971E-8276-4715-97FF-2BLG5030EE3B, - "token" = "AJ089FF5467367" - ); - $keys = array_keys($params); - sort($keys); - ``` - Concatenando: - ```php - $toSign = ""; - foreach($keys as $key) { - $toSign .= $key . $params[$key]; - }; - ``` - Firmando: - ```php - $signature = hash_hmac('sha256', $toSign , $secretKey); - ``` - ### Ejemplos de firmado: - - **PHP:** - ```php - $sign = hash_hmac('sha256', $string_to_sign, $secretKey); - ``` - - **Java:** - ```java - String sign = hmacSHA256(secretKey, string_to_sign); - ``` - - **Ruby:** - ```ruby - OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'),secret_key,string_to_sign); - ``` - - **Javascript:** - ```javascript - var sign = CryptoJS.HmacSHA256(stringToSign, secretKey); - ``` - - ## Consumiendo servicios método GET - Una vez obtenida la firma de los parámetros, agregue al resto de los parámetros el parámetro **s** con el valor del hash obtenido en el proceso de firma. - ### Ejemplo PHP: - ```php - $url = 'https://www.flow.cl/api'; - // Agrega a la url el servicio a consumir - $url = $url . '/payment/getStatus'; - // agrega la firma a los parámetros - $params["s"] = $signature; - //Codifica los parámetros en formato URL y los agrega a la URL - $url = $url . "?" . http_build_query($params); - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); - $response = curl_exec($ch); - if($response === false) { - $error = curl_error($ch); - throw new Exception($error, 1); - } - $info = curl_getinfo($ch); - if(!in_array($info['http_code'], array('200', '400', '401')) { - throw new Exception('Unexpected error occurred. HTTP_CODE: '.$info['http_code'] , $info['http_code']); - } - echo $response; - } catch (Exception $e) { - echo 'Error: ' . $e->getCode() . ' - ' . $e->getMessage(); - } - ``` - - ## Consumiendo servicios método POST - Una vez obtenida la firma de los parámetros, agregue al resto de los parámetros el parámetro **s** con el valor del hash obtenido en el proceso de firma. - - ### Ejemplo PHP: - ```php - $url = 'https://www.flow.cl/api'; - // Agrega a la url el servicio a consumir - $url = $url . '/payment/create'; - //Agrega la firma a los parámetros - $params["s"] = $signature; - try { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); - curl_setopt($ch, CURLOPT_POST, TRUE); - curl_setopt($ch, CURLOPT_POSTFIELDS, $params); - $response = curl_exec($ch); - if($response === false) { - $error = curl_error($ch); - throw new Exception($error, 1); - } - $info = curl_getinfo($ch); - if(!in_array($info['http_code'], array('200', '400', '401')) { - throw new Exception('Unexpected error occurred. HTTP_CODE: '.$info['http_code'] , $info['http_code']); - } - echo $response; - } catch (Exception $e) { - echo 'Error: ' . $e->getCode() . ' - ' . $e->getMessage(); - } - ``` - - ## Notificaciones de Flow a su comercio - Para todas las transaciones asíncronas **Flow** envía a su comercio notificaciones a sus páginas de callback, por medio de request via **POST**, content-type: **application/x-www-form-urlencoded**, enviando como parámetro un **token**, con este token el comercio debe invocar el servicio correspondiente que responde con los datos. Por ejemplo: - Para crear un pago, en el servicio **payment/create** el comercio envía como uno de los parámetros **urlConfirmation**, que corresponde a la url donde **Flow** notificará el estado del pago. En esta página, el comercio recibirá el **token** y deberá invocar el servicio **payment/getStatus** para obtener el resultado del pago. - ### Transacciones asíncronas: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ServicioUrl callbackMétodo para obtener el resultado
payment/createurlConfirmationpayment/getStatus
payment/createEmailurlConfirmationpayment/getStatus
refund/createurlCallbackrefund/getStatus
customer/registerurl_returncustomer/getRegisterStatus
customer/collecturlConfirmationpayment/getStatus
customer/batchCollecturlCallbackcustomer/getBatchCollectStatus
customer/batchCollecturlConfirmationpayment/getStatus
- - ## Códigos de error de intentos de pago - Al utilizar los servicios extendidos **payment/getStatusExtended** y **payment/getStatusByFlowOrderExtended** se puede obtener la información de error en el último intento de pago. Los códigos existentes son: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CódigoDescripción
-1Tarjeta inválida
-11Excede límite de reintentos de rechazos
-2Error de conexión
-3Excede monto máximo
-4Fecha de expiración inválida
-5Problema en autenticación
-6Rechazo general
-7Tarjeta bloqueada
-8Tarjeta vencida
-9Transacción no soportada
-10Problema en la transacción
999Error desconocido
- - ## Paginación - Todos los servicios cuyo resultado son listas **Flow** entrega los resultados paginados. La cantidad de registros por página y la navegación por las distintas páginas se controlan con los siguientes parámetros: - - - - - - - - - - - - - - - - - - -
ParámetroDescripción
startnúmero de registro de inicio de la página. Si se omite el valor por omisión es 0.
limitnúmero de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página.
- - Todos los servicios de paginación retornan un objeto JSON con los siguientes datos: - ``` - { - "total": número de registros totales, - "hasMore": 1 Si hay más páginas, 0 si no hay, - "data": [{}] arreglo con los registros - } - ``` - - Para recorrer las páginas, si como resultado **hasMore** es 1, entonces suma el valor del parámetro **limit** al parámetro **start** y vuelve a invocar el servicio hasta que **hasMore** retorne 0 - - ## Clientes API - Disponemos de los siguientes clientes API Rest que facilitan la integración con Flow: - - - - - - - - - - - - - -
LenguageURL de descarga
PHPhttps://github.com/flowcl/PHP-API-CLIENT
- - ## Postman - Disponemos de Collections de Postman para probar el consumo de los distintos servicios del API. Estas colecciones están agrupadas por funcionalidades y vienen con el algoritmo de firmado pre-programado. - - **¿Que es Postman?** Postman es una herramienta que permite crear peticiones sobre APIs de una forma muy sencilla y poder, de esta manera, probar las APIs - - Puede descargar Postman aquí: Postman download - - Para utilizarlos, deberá crear **Environment** con las siguientes variables de ambiente: - - apiKey: apiKey obtenida de su cuenta Flow - - secretKey: secretKey obtenida de su cuenta Flow - - Hosting: **sandbox.flow.cl** para ambiente sandbox o **www.flow.cl** para ambiente productivo. - - - Puede descargar los archivos Collections para Postman aquí: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CollectionURL de descarga
Flow PaymentFlow Payment.postman_collection.json
Flow CustomerFlow Customer.postman_collection.json
Flow PlansFlow Plans.postman_collection.json
Flow SubscriptionFlow Subscription.postman_collection.json
Flow CouponFlow Coupon.postman_collection.json
Flow InvoicesFlow Invoices.postman_collection.json
Flow RefundFlow Refund.postman_collection.json
Flow SettlementsFlow Settlements.postman_collection.json
Flow MerchantFlow Merchant.postman_collection.json
- - ## Realizar pruebas en nuestro ambiente Sandbox - Puede realizar pruebas en nuestro ambiente Sandbox para los distintos medios de pagos. - - Para realizar pruebas de pago con Webpay o registrar una tarjeta de crédito para cargo automático utilice los siguientes datos: - - ### Tarjeta de crédito - - - - - - - - - - - - - - - - - - - - - - - - - - -
DatoValor
N° tarjeta de crédito4051885600446623
Año de expiraciónCualquiera
Mes de expiraciónCualquiera
CVV123
- - ### En la simulación del banco usar: - - - - - - - - - - - - - - - - - - -
DatoValor
Rut11111111-1
Clave123
- - ### Para los medios de pago: - - Servipag - - Multicaja - - Mach - - Cryptocompra - - Se presentan simuladores de pago, donde sólo debe hacer clic en el botón aceptar. - - version: "3.0.1" - title: Flow API - termsOfService: "https://www.flow.cl/terminos.php" - contact: - email: soporte@flow.cl - license: - name: Apache 2.0 - url: 'http://www.apache.org/licenses/LICENSE-2.0.html' - x-logo: - url: 'https://www.flow.cl/images/header/logo-flow.svg' -tags: - - name: payment - description: | - Creación de transacciones de pagos y cobros por email. Utilice el servicio **payment/create** para crear links de pagos o **payment/createEmail** para crear cobros por email. - - name: refund - description: 'Permite generar reembolsos y obtener el estado de estos.' - - name: customer - description: "Permite crear clientes para efectuarles cargos recurrentes o suscribirlos a un planes de suscripción. Una vez creado un cliente, **Flow** lo identificará por un hash denominado **customerId**, ejemplo:\n\n **customerId**: cus_onoolldvec " - - name: plans - description: 'Permite crear planes de suscripción' - - name: subscription - description: 'Permite suscribir clientes a un plan de suscripción.' - - name: coupon - description: "Permite crear cupones de descuento para ser aplicados a suscripciones o clientes" - - name: invoice - description: 'Permite obtener los importes que se han generado por medio de las suscripciones.' - - name: settlement - description: 'Permite obtener las liquidaciones de pagos efectuadas por Flow' - - name: merchant - description: 'Permite gestionar los comercios asociados' -paths: - /payment/getStatus: - get: - tags: - - payment - summary: Obtiene el estado de una orden de pago. - description: 'Este método se utiliza para obtener el estado de un pago. Se debe utilizar en la página callback del comercio para recibir notificaciones de pagos. Cada vez que el pagador efectúe un pago, **Flow** enviará vía POST una llamada a la página del comercio, pasando como parámetro un **token** que deberá utilizarse en este servicio.' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: token - description: token de la transacción enviado por Flow - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto PaymentStatus - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatus' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error interno de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /payment/getStatusByCommerceId: - get: - tags: - - payment - summary: 'Obtiene el estado de un pago en base al commerceId' - description: 'Este método permite obtener el estado de un pago en base al **commerceId**' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: commerceId - description: Orden del comercio - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto PaymentStatus - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatus' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error interno de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /payment/getStatusByFlowOrder: - get: - tags: - - payment - summary: 'Obtiene el estado de un pago en base al número de orden Flow' - description: 'Este método permite obtener el estado de un pago en base al **flowOrder**' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: flowOrder - description: número de orden Flow - required: true - schema: - type: number - example: 68977654 - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto PaymentStatus - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatus' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error interno de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /payment/getPayments: - get: - tags: - - payment - summary: 'Obtiene el listado de pagos recibidos en un día' - description: 'Este método permite obtener la lista paginada de pagos recibidos en un día.Los objetos pagos de la lista tienen la misma estructura de los retornados en los servicios payment/getStatus' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: date - description: fecha de los pagos en formato yyyy-mm-dd - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Lista paginada de pagos" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /payment/getStatusExtended: - get: - tags: - - payment - summary: Obtiene el estado extendido de una orden de pago. - description: 'Este método se utiliza para obtener el estado de un pago. A diferencia del /payment/getStatus este servicio retorna el tipo de pago, los 4 últimos dígitos de la tarjeta (si el pago se hizo con tarjeta) y la información del último intento de pago. Se debe utilizar en la página callback del comercio para recibir notificaciones de pagos. Cada vez que el pagador efectúe un pago, **Flow** enviará vía POST una llamada a la página del comercio, pasando como parámetro un **token** que deberá utilizarse en este servicio.' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: token - description: token de la transacción enviado por Flow - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto PaymentStatusExtended - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatusExtended' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error interno de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /payment/getStatusByFlowOrderExtended: - get: - tags: - - payment - summary: 'Obtiene el estado extendido de un pago en base al número de orden Flow' - description: 'Este método permite obtener el estado de un pago en base al **flowOrder**. A diferencia del /payment/getStatusByFlowOrder este servicio retorna el tipo de pago, los 4 últimos dígitos de la tarjeta (si el pago se hizo con tarjeta) y la información del último intento de pago.' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: flowOrder - description: número de orden Flow - required: true - schema: - type: number - example: 68977654 - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto PaymentStatusExtended - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatusExtended' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error interno de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /payment/create: - post: - tags: - - payment - summary: Genera una orden de pago - description: "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:\n\n **url** + \"?token=\" +**token**\n\n - 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**." - responses: - '200': - description: "url y token para redirigir el browser del pagador La url de redirección se debe formar concatenando los valores recibidos en la respuesta de la siguiente forma:\n\n **url** + \"?token=\" +**token**" - content: - application/json: - schema: - $ref: '#/components/schemas/PayResponse' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - commerceOrder: - description: Orden del comercio - type: string - subject: - description: Descripción de la orden - type: string - currency: - description: Moneda de la orden - type: string - amount: - description: Monto de la orden - type: number - email: - description: email del pagador - type: string - format: email - paymentMethod: - description: | - Identificador del medio de pago. Si se envía el identificador, el pagador será redireccionado directamente al medio de pago que se indique, de lo contrario Flow le presentará una página para seleccionarlo. El medio de pago debe haber sido previamente contratado. Podrá ver los identificadores de sus medios de pago en la sección "Mis Datos" ingresando a Flow con sus credenciales. Para indicar todos los medios de pago utilice el identificador: - - 9 Todos los medios - type: integer - urlConfirmation: - description: url callback del comercio donde Flow confirmará el pago - type: string - format: uri - urlReturn: - description: url de retorno del comercio donde Flow redirigirá al pagador - type: string - format: uri - optional: - description: | - Datos opcionales en formato JSON clave = valor, ejemplo: - {"rut":"9999999-9","nombre":"cliente 1"} - type: string - timeout: - description: tiempo en segundos para que una orden expire después de haber sido creada. Si no se envía este parámetro la orden no expirará y estará vigente para pago por tiempo indefinido. Si envía un valor en segundos, la orden expirará x segundos después de haber sido creada y no podrá pagarse. - type: integer - merchantId: - description: Id de comercio asociado. Solo aplica si usted es comercio integrador. - type: string - payment_currency: - description: Moneda en que se espera se pague la orden - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - commerceOrder - - subject - - amount - - email - - urlConfirmation - - urlReturn - - s - callbacks: - paymentConfirmation: - '{$request#/urlConfirmation}': - post: - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - token: - description: hash token que identifica la transacción - type: string - responses: - '200': - description: Your server returns this code if it accepts the callback - - - - /payment/createEmail: - post: - tags: - - payment - summary: Genera un cobro por email - description: "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**." - responses: - '200': - description: "Al crear un cobro por email, Flow enviará el email directamente al pagador con un link de pago. El link de pago se forma concatenando los valores recibidos en la respuesta de la siguiente forma:\n\n **url** + \"?token=\" +**token**" - content: - application/json: - schema: - $ref: '#/components/schemas/PayResponse' - '400': - description: Error del api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - commerceOrder: - description: Orden del comercio - type: string - subject: - description: Descripción de la orden - type: string - currency: - description: Moneda de la orden - type: string - amount: - description: Monto de la orden - type: number - email: - description: email del pagador - type: string - format: email - urlConfirmation: - description: url callbak del comercio donde Flow confirmará el pago - type: string - format: uri - urlReturn: - description: url de retorno del comercio donde Flow redirigirá al pagador - type: string - format: uri - forward_days_after: - description: Número de días posteriores al envío del cobro para enviar una nueva notificación de persistencia si la orden no está pagada. - type: number - forward_times: - description: Número de veces de envío de mail de persistencia. - type: number - optional: - description: | - Datos opcionales en formato JSON clave = valor, ejemplo: - {"rut":"9999999-9","nombre":"cliente 1"} - type: string - timeout: - description: tiempo en segundos para que una orden expire después de haber sido creada. Si no se envía este parámetro la orden no expirará y estará vigente para pago por tiempo indefinido. Si envía un valor en segundos, la orden expirará x segundos después de haber sido creada y no podrá pagarse. - type: integer - merchantId: - description: Id de comercio asociado. Solo aplica si usted es comercio integrador. - type: string - payment_currency: - description: Moneda en que se espera se pague la orden - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - commerceOrder - - subject - - amount - - email - - urlConfirmation - - urlReturn - - s - - /refund/create: - post: - tags: - - refund - summary: "Permite crear un reembolso" - description: "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**\n\n - En esta página, el comercio debe invocar el servicio **refund/getStatus** para obtener el estado del reembolso." - responses: - '200': - description: El objeto RefundStatus - content: - application/json: - schema: - $ref: '#/components/schemas/RefundStatus' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - refundCommerceOrder: - description: La orden de reembolso del comercio - type: string - receiverEmail: - description: Email del receptor del reembolso - type: string - amount: - description: Monto del reembolso - type: number - urlCallBack: - description: La url callback del comercio donde Flow comunica el estado del reembolso - type: string - commerceTrxId: - description: Identificador del comercio de la transacción original que se va reembolsar - type: string - flowTrxId: - description: Identificador de Flow de la transacción original que se va reembolsar. - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - refundCommerceOrder - - receiverEmail - - amount - - urlCallBack - - s - - /refund/cancel: - post: - tags: - - refund - summary: "Permite cancelar un reembolso" - description: "Este servicio permite cancelar una orden de reembolso pendiente" - responses: - '200': - description: El objeto RefundStatus - content: - application/json: - schema: - $ref: '#/components/schemas/RefundStatus' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - token: - description: El token devuelto al crear el reembolso - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - token - - s - - /refund/getStatus: - get: - tags: - - refund - summary: "Obtiene el estado de un reemboso." - description: "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**." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: token - description: token de la solicitud de reembolso enviado por Flow - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: El objeto RefundStatus - content: - application/json: - schema: - $ref: '#/components/schemas/RefundStatus' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - #<--- Customer - /customer/create: - post: - tags: - - customer - summary: "Crear un cliente" - description: "Permite crear un nuevo cliente. El servicio retorna el objeto cliente creado." - responses: - '200': - description: El objeto Customer - content: - application/json: - schema: - $ref: '#/components/schemas/Customer' - '400': - description: error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - name: - description: Nombre del cliente (nombre y apellido) - type: string - email: - description: Email del cliente - type: string - externalId: - description: Identificador externo del cliente, es decir, el identificador con el que su sistema lo reconoce. - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - name - - email - - externalId - - s - /customer/edit: - post: - tags: - - customer - summary: "Edita un cliente" - description: "Este servicio permite editar los datos de un cliente" - responses: - '200': - description: "El objeto cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/Customer' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - description: "Los campos: name, email y externalId son opcionales. Si desea modificar solo el nombre, envíe solo en campo name." - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - name: - description: Nombre del cliente - type: string - email: - description: Email del cliente - type: string - externalId: - description: Identificador externo del cliente, es decir, el identificador con el que su sistema lo reconoce. - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - s - - /customer/delete: - post: - tags: - - customer - summary: "Eliminar un cliente" - description: "Permite eliminar un cliente. Para eliminar un cliente, este no debe tener suscripciones activas o importes pendientes de pago." - responses: - '200': - description: "El objeto cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/Customer' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - s - /customer/get: - get: - tags: - - customer - summary: "Obtiene los datos de un cliente" - description: "Permite obtener los datos de un cliente en base a su **customerId**." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: customerId - description: Identificador del cliente - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "El objeto cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/Customer' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /customer/list: - get: - tags: - - customer - summary: "Lista de clientes" - description: "Permite obtener la lista de clientes paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:\n\n - * filter: filtro por nombre del cliente\n - * status: filtro por estado del cliente" - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por nombre del cliente - required: false - schema: - type: string - - in: query - name: status - description: Filtro por estado del cliente - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Lista paginada de clientes" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /customer/register: - post: - tags: - - customer - summary: "Envía a un cliente a registrar su tarjeta de crédito" - description: | - Envía a un cliente a registrar su tarjeta de crédito para poder efectuarle cargos automáticos. - El servicio responde con 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 redirigido el browser del cliente, Flow responderá por medio de una llamada POST a la url callback del comercio indicada en el parámetro **url_return** pasando como parámetro **token**. El comercio debe implementar una página y capturar el parámetro token enviado por Flow para luego consumir el servicio "customer/getRegisterStatus" para obtener el resultado del registro. - responses: - '200': - description: "Url y token para redireccionar el browser del cliente a registrar su tarjeta de crédito" - content: - application/json: - schema: - type: object - properties: - url: - type: string - example: 'https://www.flow.cl/app/webpay/disclaimer.php' - token: - type: string - example: 41097C28B5BD78C77F589FE4BC59E18AC333F9EU - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - url_return: - description: "Url de página callback donde Flow notifica el resultado del registro" - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - url_return - - s - /customer/getRegisterStatus: - get: - tags: - - customer - summary: "Resultado de registro de tarjeta de crédito de un cliente" - description: "Elte servicio retorna el resultado del registro de la tarjeta de crédito de un cliente." - parameters: - - in: query - name: apiKey - description: apiKeydel comercio - required: true - schema: - type: string - - in: query - name: token - description: El token enviado por Flow a su página callback. - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Resultado del registro de tarjeta de crédito" - content: - application/json: - schema: - $ref: '#/components/schemas/RegisterResult' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /customer/unRegister: - post: - tags: - - customer - summary: "Elimina el registro de la tarjeta de crédito de un cliente" - description: "Este servicio permite eliminar el registro de la tarjeta de crédito de un cliente. Al eliminar el registro no se podrá hacer cargos automáticos y Flow enviará un cobro por email." - responses: - '200': - description: "El objeto cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/Customer' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - s - - /customer/charge: - post: - tags: - - customer - summary: "Efectúa un cargo en la tarjeta de crédito un cliente" - description: "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." - responses: - '200': - description: El objeto PaymentStatus - content: - application/json: - schema: - $ref: '#/components/schemas/PaymentStatus' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - amount: - description: El monto del cargo - type: number - subject: - description: Descripción del cargo - type: string - commerceOrder: - description: Identificador de la orden del comercio - type: string - currency: - description: Moneda del cargo (CLP, UF) - type: string - optionals: - description: | - Datos opcionales en formato JSON clave = valor, ejemplo: - {"rut":"9999999-9","nombre":"cliente 1"} - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - amount - - subject - - commerceOrder - - s - - /customer/collect: - post: - tags: - - customer - summary: "Envía un cobro a un cliente." - description: "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." - responses: - '200': - description: El objeto CollectResponse - content: - application/json: - schema: - $ref: '#/components/schemas/CollectResponse' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - customerId: - description: Identificador del cliente - type: string - commerceOrder: - description: Identificador de la orden del comercio - type: string - subject: - description: Descripción del cobro - type: string - amount: - description: El monto del cobro - type: number - urlConfirmation: - description: url callbak del comercio donde Flow confirmará el pago - type: string - format: uri - urlReturn: - description: url de retorno del comercio donde Flow redirigirá al pagador - type: string - format: uri - currency: - description: Moneda del cargo (CLP, UF) - type: string - paymentMethod: - description: | - Identificador del medio de pago. Si se envía el identificador, el pagador será redireccionado directamente al medio de pago que se indique, de lo contrario Flow le presentará una página para seleccionarlo. El medio de pago debe haber sido previamente contratado. Podrá ver los identificadores de sus medios de pago en la sección "Mis Datos" ingresando a Flow con sus credenciales. Para indicar todos los medios de pago utilice el identificador: - - 9 Todos los medios - type: integer - byEmail: - description: Si se desea que Flow envíe cobros por email, este parámetro debe enviarse con valor 1 - type: integer - forward_days_after: - description: Número de días posteriores al envío del cobro para enviar una nueva notificación de persistencia si la orden no está pagada. - type: integer - forward_times: - description: Número de veces de envío de mail de persistencia. - type: integer - ignore_auto_charging: - description: Si se envía este parámetro con valor 1 entonces ignora el método de cargo automático aunque el cliente tenga registrada una tarjeta de crédito - type: integer - optionals: - description: | - Datos opcionales en formato JSON clave = valor, ejemplo: - {"rut":"9999999-9","nombre":"cliente 1"} - type: string - timeout: - description: tiempo en segundos para que una orden expire después de haber sido creada. Si no se envía este parámetro la orden no expirará y estará vigente para pago por tiempo indefinido. Si envía un valor en segundos, la orden expirará x segundos después de haber sido creada y no podrá pagarse. - type: integer - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - customerId - - amount - - subject - - commerceOrder - - urlConfirmation - - urlReturn - - s - - /customer/batchCollect: - post: - tags: - - customer - summary: "Envía de forma masiva un lote de cobros a clientes." - description: 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. - responses: - '200': - description: El objeto BatchCollectResponse - content: - application/json: - schema: - $ref: '#/components/schemas/BatchCollectResponse' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - urlCallBack: - description: url callback del comercio donde Flow avisará cuando el lote ha sido procesado. - type: string - format: uri - urlConfirmation: - description: url callbak del comercio donde Flow confirmará el pago - type: string - format: uri - urlReturn: - description: url de retorno del comercio donde Flow redirigirá al pagador - type: string - format: uri - batchRows: - description: Arreglo en formato JSON del lote de cargos CollectObject - type: array - items: - $ref: '#/components/schemas/CollectObject' - byEmail: - description: Si se desea que Flow envíe cobros por email, este parámetro debe enviarse con valor 1 - type: integer - forward_days_after: - description: Número de días posteriores al envío del cobro para enviar una nueva notificación de persistencia si la orden no está pagada. - type: integer - forward_times: - description: Número de veces de envío de mail de persistencia. - type: integer - timeout: - description: tiempo en segundos para que una orden expire después de haber sido creada. Si no se envía este parámetro la orden no expirará y estará vigente para pago por tiempo indefinido. Si envía un valor en segundos, la orden expirará x segundos después de haber sido creada y no podrá pagarse. - type: integer - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - commerceBatchId - - urlCallBack - - urlConfirmation - - urlReturn - - batchRows - - s - callbacks: - batchCollectProcessConfirmation: - '{$request#/urlCallBack}': - post: - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - token: - description: hash token que identifica el lote procesado - type: string - responses: - '200': - description: Your server returns this code if it accepts the callback - batchCollectPaymentConfirmatio: - '{$request#/urlConfirmation}': - post: - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - token: - description: hash token que identifica el pago - type: string - responses: - '200': - description: Your server returns this code if it accepts the callback - batchCollectReturn: - '{$request#/urlReturn}': - post: - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - token: - description: hash token que identifica el pago - type: string - responses: - '200': - description: Your server returns this code if it accepts the callback - - /customer/getBatchCollectStatus: - get: - tags: - - customer - summary: "Obtiene el estado de un lote de cobros enviados por el servicio batchCollect" - description: "Este servicio permite consultar el estado de un lote de cobros enviados por medio del servicio batchCollect." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: token - description: El token enviado por Flow a su página callback del servicio batchCollect. - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Resultado del lote de cargos enviados por el servicio batchCollect" - content: - application/json: - schema: - $ref: '#/components/schemas/BatchCollectStatusResponse' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /customer/reverseCharge: - post: - tags: - - customer - summary: "Reversa un cargo efectuado en la tarjeta de crédito de un cliente" - description: | - 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**. - responses: - '200': - description: El objeto ReverseChargeResponse - content: - application/json: - schema: - $ref: '#/components/schemas/ReverseChargeResponse' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - commerceOrder: - description: Identificador de la orden del comercio - type: string - flowOrder: - description: Identificador de la orden de Flow - type: number - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - s - /customer/getCharges: - get: - tags: - - customer - summary: "Lista paginada de los cargos efectuados a un cliente" - description: "Este servicio obtiene la lista paginada de los cargos efectuados a un cliente." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: customerId - description: Identificador del cliente - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por descripción del cargo - required: false - schema: - type: string - - in: query - name: fromDate - description: Filtro por fecha de inicio - required: false - schema: - type: string - format: yyyy-mm-dd - - in: query - name: status - description: Filtro por estado del cargo - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Lista paginada de los cargos efectuados a un cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /customer/getChargeAttemps: - get: - tags: - - customer - summary: "Lista paginada de intentos de cargos fallidos a un cliente" - description: "Este servicio obtiene la lista paginada de los intentos de cargos fallidos a un cliente." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: customerId - description: Identificador del cliente - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por descripción del error - required: false - schema: - type: string - - in: query - name: fromDate - description: Filtro por fecha de inicio - required: false - schema: - type: string - format: yyyy-mm-dd - - in: query - name: commerceOrder - description: Filtro por el número de la orden del comercio - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Lista paginada de los intentos de cargos fallidos efectuados a un cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /customer/getSubscriptions: - get: - tags: - - customer - summary: "Lista paginada de suscripciones de un cliente" - description: "Este servicio obtiene la lista paginada de las suscripciones de un cliente." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: customerId - description: Identificador del cliente - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: filtro por el identificador de la suscripción - required: false - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "Lista de las suscripciones de un cliente" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /plans/create: - post: - tags: - - plans - summary: "Crea un Plan de Suscripción" - description: "Este servicio permite crear un nuevo Plan de Suscripción" - responses: - '200': - description: El objeto Plan - content: - application/json: - schema: - $ref: '#/components/schemas/Plan' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - planId: - description: | - Identificador del Plan. Un texto identificador del Plan, sin espacios, ejemplo: PlanMensual - type: string - name: - description: Nombre del Plan - type: string - currency: - description: Moneda del Plan, por omisión CLP - type: string - amount: - description: Monto del Plan - type: number - interval: - description: | - Especifica la frecuencia de cobros (generación de importe) - - 1 diario - - 2 semanal - - 3 mensual - - 4 anual - type: number - interval_count: - description: | - Número de intervalos de frecuencia de cobros, por ejemplo: - - interval = 2 y interval_count = 2 la frecuancia será quincenal. El valor por omisión es 1. - type: number - trial_period_days: - description: Número de días de Trial. El valor por omisón es 0. - type: number - days_until_due: - description: Número de días pasados, después de generar un importe, para considerar el importe vencido. Si no se especifica el valor será 3. - type: number - periods_number: - description: Número de períodos de duración del plan. Si el plan tiene vencimiento, entonces ingrese aquí el número de periodos de duración del plan - type: number - urlCallback: - description: URL donde Flow notificará al comercio los pagos efectuados por este plan. - type: string - charges_retries_number: - description: El número de reintentos de cargo, por omisión Flow utilizará 3 - type: number - currency_convert_option: - description: | - Si hay conversión de moneda, en qué momento hará la conversión: - - 1 al pago (default) - - 2 al importe (invoice) - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - planId - - name - - amount - - interval - - s - - /plans/get: - get: - tags: - - plans - summary: "Obtiene los datos de un Plan de Suscripción" - description: "Este servicio permite obtener los datos de un Plan de Suscripción" - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: planId - description: Identificador del Plan - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "El objeto Plan" - content: - application/json: - schema: - $ref: '#/components/schemas/Plan' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /plans/edit: - post: - tags: - - plans - summary: "Edita un Plan de Suscripción" - description: "Este servicio permite editar los datos de un Plan de Suscripción. Si el plan tiene clientes suscritos sólo se puede modificar el campo **trial_period_days**." - responses: - '200': - description: "El objeto Plan" - content: - application/json: - schema: - $ref: '#/components/schemas/Plan' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - planId: - description: Identificador del Plan - type: string - name: - description: Nombre del Plan - type: string - currency: - description: Moneda del Plan - type: string - amount: - description: Monto del Plan - type: number - interval: - description: | - Especifica la frecuencia de cobros (generación de importe) - - 1 diario - - 2 semanal - - 3 mensual - - 4 anual - type: number - interval_count: - description: | - Número de intervalos de frecuencia de cobros, por ejemplo: - - interval = 2 y interval_count = 2 la frecuancia será quincenal. El valor por omisión es 1. - type: number - trial_period_days: - description: Número de días de Trial. El valor por omisón es 0. - type: number - days_until_due: - description: Número de días pasados, después de generar un importe, para considerar el importe vencido. - type: number - periods_number: - description: Número de períodos de duración del plan. Si el plan tiene vencimiento, entonces ingrese aquí el número de periodos de duración del plan - type: number - urlCallback: - description: URL donde Flow notificará al comercio los pagos efectuados por este plan. - type: string - charges_retries_number: - description: El número de reintentos de cargo, por omisión Flow utilizará 3 - type: number - currency_convert_option: - description: | - Si hay conversión de moneda, en qué momento hará la conversión: - - 1 al pago (default) - - 2 al importe (invoice) - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - planId - - /plans/delete: - post: - tags: - - plans - summary: "Elimina un Plan de Suscripción" - description: "Este servicio permite eliminar un Plan de Suscripción. El eliminar un Plan significa que ya no podrá suscribir nuevos clientes al plan. Pero las suscripciones activas continuarán su ciclo de vida mientras estas no sean cancelas." - responses: - '200': - description: "El objeto Plan" - content: - application/json: - schema: - $ref: '#/components/schemas/Plan' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - planId: - description: Identificador del Plan - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - planId - - /plans/list: - get: - tags: - - plans - summary: "Lista paginada de planes de suscripción" - description: "Permite obtener la lista de planes de suscripción paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:\n\n - * filter: filtro por nombre del plan\n - * status: filtro por estado del plan" - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por el nombre del Plan - required: false - schema: - type: string - - in: query - name: status - description: Filtro por el estado del Plan 1-Activo 0-Eliminado - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: Lista paginada de Planes - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /subscription/create: - post: - tags: - - subscription - summary: Crea una nueva suscripción a un Plan - description: "Este servicio permite crear una nueva suscripción de un cliente a un Plan.\n - Para crear una nueva suscripción, basta con enviar los parámetros **planId** y **customerId**, los parámetros opcionales son:\n\n - - - - - - - - - - - - - - - - - - - - - -
ParámetroDescripción
subscription_startFecha de inicio de la suscripción
couponIdIdentificador de cupón de descuento
trial_period_daysNúmero de días de Trial
" - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - planId: - description: Identificador del Plan - type: string - customerId: - description: Identificador del cliente - type: string - subscription_start: - description: La fecha de inicio de la suscripción - type: string - format: yyyy-mm-dd - couponId: - description: Si quiere aplicarle un descuento, el identificador del cupón de descuento. - type: number - trial_period_days: - description: Número de días de Trial. Si el Plan tiene días de Trial, este valor modificará los días para esta suscripción. - type: number - periods_number: - description: Número de períodos de duración de la subscripción. Si null, entonces tomará el periods_number del plan. - type: number - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - planId - - customerId - - s - - /subscription/get: - get: - tags: - - subscription - summary: "Obtiene una Suscripción en base al subscriptionId" - description: "Este servicio permite obtener los datos de una suscripción." - parameters: - - in: query - name: apiKey - description: apiKeyel comercio - required: true - schema: - type: string - - in: query - name: subscriptionId - description: Identificador de la suscripción - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /subscription/list: - get: - tags: - - subscription - summary: Obtiene la lista de suscripciones para un Plan - description: "Permite obtener la lista de suscripciones paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:\n\n - * filter: filtro por nombre del plan\n - * status: filtro por estado de la suscripción." - parameters: - - in: query - name: apiKey - description: apiKeyel comercio - required: true - schema: - type: string - - in: query - name: planId - description: Identificador del Plan - required: true - schema: - type: string - - in: query - name: start - description: número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: filtro por el nombre del cliente - required: false - schema: - type: string - - in: query - name: status - description: Filtro por el estado de la suscripción - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: Lista paginada de suscripciones de un Plan - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /subscription/changeTrial: - post: - tags: - - subscription - summary: Modifica los días de Trial de una suscripción - description: | - Este servicio permite modificar los días de Trial de una suscripción. - Sólo se puede modificar los días de Trial a una suscripción que aún no se ha iniciado o que todavía está vigente el Trial. - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKeyel comercio - type: string - subscriptionId: - description: Identificador de la suscripción - type: string - trial_period_days: - description: Número de días de Trial - type: number - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - subscriptionId - - trial_period_days - - s - - /subscription/cancel: - post: - tags: - - subscription - summary: "Cancela una suscripción" - description: | - Este servicio permite cancelar una suscripción. Existen formas de cancelar una suscripción: - - inmediatamente. Es decir, en este instante - - al terminar el perído vigente. - - Si desea cancelar la suscripción inmediatamente, envíe el parámetro **at_period_end** con valor 0, si desea cancelarla al final del período vigente envíe el valor 1. - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - subscriptionId: - description: Identificador de la suscripción. - type: string - at_period_end: - description: 1 Si la cancelación será al finalizar el período vigente 0 Si la cancelación será inmediata. - type: number - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - subscriptionId - - s - - /subscription/addCoupon: - post: - tags: - - subscription - summary: "Agrega un descuento a la suscripción" - description: "Este servicio permite agregar un descuento a la suscripción. Si la suscripción ya tenía un descuento, será reemplazado por este." - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - subscriptionId: - description: Identificador de la suscripción - type: string - couponId: - description: Identificador del cupón de descuento. - type: number - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - subscriptionId - - couponId - - s - - /subscription/deleteCoupon: - post: - tags: - - subscription - summary: "Elimina un descuento a la suscripción" - description: "Este servicio permite eliminar el descuento que tenga la suscripción. El eliminar el descuento de la suscripción, no elimina el descuento que podría tenar asociado el cliente." - responses: - '200': - description: "El objeto Subscription" - content: - application/json: - schema: - $ref: '#/components/schemas/Subscription' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - subscriptionId: - description: Identificador de la suscripción - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - subscriptionId - - s - - /coupon/create: - post: - tags: - - coupon - summary: "Crea un cupón de descuento" - description: "Este servicio permite crear un cupón de descuento" - responses: - '200': - description: "El objeto Coupon" - content: - application/json: - schema: - $ref: '#/components/schemas/Coupon' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - name: - description: Nombre del cupón - type: string - percent_off: - description: Porcentaje del cupon. Número entre 0 y 100. Permite 2 decimales con punto decimal. Ejemplo 10.2. No se agrega el signo % - type: number - currency: - description: Moneda del descuento. Solo agregue la moneda para cupones de monto. - type: string - amount: - description: Monto del descuento - type: number - duration: - description: | - Duración del cupón: - - 1 definida - - 0 indefinida - type: number - times: - description: | - Si la duración del cupón es definida, este campo indica las veces de duración del cupón. Si el cupón se aplica a un cliente veces corresponderá a meses. Si l cupón se aplica a una suscripción, veces corresponderá a los períodos del Plan. - type: number - max_redemptions: - description: Número de veces de aplicación del cupón. - type: number - expires: - description: Fecha de expiración del cupón en formato yyyy-mm-dd - type: string - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - name - - s - - /coupon/edit: - post: - tags: - - coupon - summary: Edita un cupón de descuento - description: Este servicio permite editar un cupón de descuento. Sólo se puede editar el nombre de un cupón. - responses: - '200': - description: "El objeto Coupon" - content: - application/json: - schema: - $ref: '#/components/schemas/Coupon' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - couponId: - description: Identificador del cupón - type: string - name: - description: Nombre del cupón - type: string - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - couponId - - name - - s - - /coupon/delete: - post: - tags: - - coupon - summary: "Elimina un cupón de descuento" - description: "Este servicio permite eliminar un cupón de descuento. Eliminar un cupón de descuento no elimina los descuentos aplicados a clientes o suscripciones, sólo no permite volver a aplicar este cupón" - responses: - '200': - description: "El objeto Coupon" - content: - application/json: - schema: - $ref: '#/components/schemas/Coupon' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - couponId: - description: Identificado del cupón - type: string - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - couponId - - s - - /coupon/get: - get: - tags: - - coupon - summary: "Obtiene un cupón de descuento" - description: "Este servicio permite obtener los datos de un cupón de descuento" - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: couponId - description: Identificador del cupón - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "El objeto Coupon" - content: - application/json: - schema: - $ref: '#/components/schemas/Coupon' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /coupon/list: - get: - tags: - - coupon - summary: "Lista los cupones de descuento" - description: "Este servicio permite la lista de cupones de descuento" - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por el nombre del cupón - required: false - schema: - type: string - - in: query - name: status - description: | - Filtro por el estado del cupón: - - 1 Activo - - 0 Inactivo - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "El objeto Coupon" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /invoice/get: - get: - tags: - - invoice - summary: "Obtiene los datos de un Invoice (Importe)" - description: "Este servicio permite obtener los datos de un Importe." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: invoiceId - description: Identificador del Invoice - required: true - schema: - type: number - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "El objeto Invoice" - content: - application/json: - schema: - $ref: '#/components/schemas/Invoice' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /invoice/cancel: - post: - tags: - - invoice - summary: "Cancela un Importe (Invoice) pendiente de pago" - description: "Este servicio permite cancelar un Importe (Invoice) pendiente de pago." - responses: - '200': - description: "El objeto Invoice" - content: - application/json: - schema: - $ref: '#/components/schemas/Invoice' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - invoiceId: - description: Identificador del Invoice (Importe) - type: number - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - invoiceId - - s - - /invoice/outsidePayment: - post: - tags: - - invoice - summary: "Ingresa un pago por fuera y da por pagado el Importe (Invoice) " - description: "Este servicio permite dar por pagado un Importe (Invoice) cuando el pago no se realiza por Flow." - responses: - '200': - description: "El objeto Invoice" - content: - application/json: - schema: - $ref: '#/components/schemas/Invoice' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - invoiceId: - description: Identificador del Invoice (Importe) - type: number - date: - description: Fecha del pago en formato "yyyy-mm-dd" - type: string - comment: - description: descripción del pago por fuera - type: string - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - invoiceId - - date - - s - - /invoice/getOverDue: - get: - tags: - - invoice - summary: "Obtiene los invoices vencidos" - description: "Este servicio permite obtener la lista de invoices vencidos, es decir, aquellos no pagados cuyo due_date este vencido." - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro - required: false - schema: - type: string - - in: query - name: planId - description: Identificador del Plan, si se agrega se filtrará para los invoices de este plan. - required: false - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - responses: - '200': - description: "El objeto Invoice" - content: - application/json: - schema: - $ref: '#/components/schemas/Invoice' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /invoice/retryToCollect: - post: - tags: - - invoice - summary: "Reintenta el cobro de un invoice vencido" - description: "Este servicio permite reintentar el cobro de un Invoice vencido." - responses: - '200': - description: "El objeto Invoice" - content: - application/json: - schema: - $ref: '#/components/schemas/Invoice' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - invoiceId: - description: Identificador del Invoice (Importe) - type: number - s: - description: la firma de los parámetros efectuada con su secretKey. - type: string - required: - - apiKey - - invoiceId - - s - /settlement/getByDate: - get: - tags: - - settlement - summary: Obtiene la liquidación efectuada para esa fecha. - description: 'Este método se utiliza para obtener la liquidación de la fecha enviada como parámetro.
Nota: Si su liquidación es anterior al 01-06-2021 utilizar este servicio, en caso contrario se recomienda utilizar el servicio /settlement/search' - deprecated: true - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: date - description: Fecha de la liquidación - required: true - schema: - type: string - format: yyyy-mm-dd - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "Arreglo de objetos Settlement" - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/Settlement' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - - /settlement/getById: - get: - tags: - - settlement - summary: Obtiene la Liquidación efectuada con ese identificador - description: 'Este método se utiliza para obtener el objeto Settlement correspondiente al identificador.
Nota: Si su liquidación es anterior al 01-06-2021 utilizar este servicio, en caso contrario se recomienda utilizar el servicio /settlement/getByIdv2' - deprecated: true - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: id - description: Identificador de la liquidación - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "El objeto Settlement" - content: - application/json: - schema: - $ref: '#/components/schemas/Settlement' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /settlement/search: - get: - tags: - - settlement - summary: Busca liquidaciones en el un determinado rango de fechas. - description: 'Este método se utiliza para obtener el(los) encabezado(s) de liquidación(es) dentro del rango de fechas ingresado (permite filtrar también por la moneda). Para obtener la liquidación completa (encabezado y detalles) utilizar el servicio /settlement/getByIdv2' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: startDate - description: Fecha inicio de rango - required: true - schema: - type: string - format: yyyy-mm-dd - - in: query - name: endDate - description: Fecha fin de rango - required: true - schema: - type: string - format: yyyy-mm-dd - - in: query - name: currency - description: Moneda de liquidación - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "Arreglo de objetos SettlementBase" - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/SettlementBaseV2' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /settlement/getByIdv2: - get: - tags: - - settlement - summary: Obtiene la liquidación efectuada con ese identificador en el formato nuevo - description: 'Este método se utiliza para obtener el objeto Settlement correspondiente al identificador' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: id - description: Identificador de la liquidación - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey. - required: true - schema: - type: string - responses: - '200': - description: "El objeto SettlementV2" - content: - application/json: - schema: - $ref: '#/components/schemas/SettlementV2' - '400': - description: Error del Api - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: Error de negocio - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - /merchant/create: - post: - tags: - - merchant - summary: Crea un comercio asociado - description: "Este método permite crear un nuevo comercio asociado en **Flow**" - responses: - '200': - description: "Objeto con información del comercio asocioado en Flow" - content: - application/json: - schema: - $ref: '#/components/schemas/Merchant' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - id: - description: Id de comercio asociado - type: string - name: - description: Nombre de comercio asociado - type: string - url: - description: Url del comercio asociado - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - id - - name - - url - - s - /merchant/edit: - post: - tags: - - merchant - summary: Edita un comercio asociado - description: "Este método permite modificar un comercio asociado previamente creado en **Flow**" - responses: - '200': - description: "Objeto con información del comercio asociado en Flow" - content: - application/json: - schema: - $ref: '#/components/schemas/Merchant' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - id: - description: Id de comercio asociado - type: string - name: - description: Nombre de comercio asociado - type: string - url: - description: Url del comercio asociado - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - id - - name - - url - - s - /merchant/delete: - post: - tags: - - merchant - summary: Elimina un comercio asociado - description: "Este método permite eliminar un comercio asociado previamente creado en **Flow**" - responses: - '200': - description: "Objeto con información de la orden generada en Flow" - content: - application/json: - schema: - $ref: '#/components/schemas/MerchantDeleteResponse' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - apiKey: - description: apiKey del comercio - type: string - id: - description: Id de comercio asociado - type: string - s: - description: la firma de los parámetros efectuada con su secretKey - type: string - required: - - apiKey - - id - - s - /merchant/get: - get: - tags: - - merchant - summary: Obtener comercio asociado - description: "Este método permite obtener la información de un comercio asociado previamente creado en **Flow**" - responses: - '200': - description: "Objeto con información del comercio asocioado en Flow" - content: - application/json: - schema: - $ref: '#/components/schemas/Merchant' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: id - description: Id de comercio asociado - required: true - schema: - type: string - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string - /merchant/list: - get: - tags: - - merchant - summary: Lista de comercios asociados - description: "Permite obtener la lista de comercios paginada de acuerdo a los parámetros de paginación. Además, se puede definir los siguientes filtros:\n\n - * filter: filtro por nombre del comercio asociado\n - * status: filtro por estado del comercio asociado" - responses: - '200': - description: "Objeto con información del comercio asocioado en Flow" - content: - application/json: - schema: - $ref: '#/components/schemas/List' - '400': - description: "Error del Api" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - '401': - description: "Error de negocio" - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - parameters: - - in: query - name: apiKey - description: apiKey del comercio - required: true - schema: - type: string - - in: query - name: start - description: Número de registro de inicio de la página. Si se omite el valor por omisión es 0. - required: false - schema: - type: integer - - in: query - name: limit - description: Número de registros por página. Si se omite el valor por omisón es 10. El valor máximo es de 100 registros por página. - required: false - schema: - type: integer - - in: query - name: filter - description: Filtro por nombre del comercio asociado - required: false - schema: - type: string - - in: query - name: status - description: "Filtro por estado del comercio asociado. Valores posibles:\n\n0: Pendiente de aprobación\n\n1: Aprobado\n\n2: Rechazado" - required: false - schema: - type: integer - - in: query - name: s - description: la firma de los parámetros efectuada con su secretKey - required: true - schema: - type: string -components: - schemas: - PaymentStatus: - description: Objeto que representa un cobro y si está pagado su correspondiente pago - type: object - nullable: true - properties: - flowOrder: - type: integer - description: El número de la orden de Flow - example: 3567899 - commerceOrder: - type: string - description: El número de la orden del comercio - example: sf12377 - requestDate: - type: string - description: La fecha de creación de la orden - format: 'yyyy-mm-dd hh:mm:ss' - example: '2017-07-21 12:32:11' - status: - type: integer - description: | - El estado de la order - - 1 pendiente de pago - - 2 pagada - - 3 rechazada - - 4 anulada - example: 1 - subject: - type: string - description: El concepto de la orden - example: game console - currency: - type: string - description: La moneda - example: CLP - amount: - type: number - format: float - description: El monto de la orden - example: 12000 - payer: - type: string - description: El email del pagador - example: pperez@gamil.com - optional: - type: string - nullable: true - description: datos opcionales enviados por el comercio en el request de creación de pago en el parámetro optional en formato JSon - example: - RUT: "7025521-9" - ID: "899564778" - pending_info: - type: object - description: Información para un pago pendiente cuando se generó un cupón de pago. Si no existen datos es que no se generó un cupón de pago. - properties: - media: - type: string - nullable: true - description: El medio de pago utilizado para emitir el cupón de pago - example: Multicaja - date: - type: string - nullable: true - description: La fecha de emisión del cupón de pago - example: '2017-07-21 10:30:12' - paymentData: - description: Los datos del pago - type: object - properties: - date: - type: string - nullable: true - description: La fecha de pago - example: '2017-07-21 12:32:11' - media: - type: string - nullable: true - description: El medio de pago utilizado - example: webpay - conversionDate: - type: string - nullable: true - description: La fecha de conversión de la moneda - example: '2017-07-21' - conversionRate: - type: number - nullable: true - format: float - description: La tasa de conversión. - example: 1.1 - amount: - type: number - nullable: true - format: float - description: El monto pagado - example: 12000 - currency: - type: string - nullable: true - description: La moneda con que se pagó - example: CLP - fee: - type: number - nullable: true - format: float - description: El costo del servicio - example: 551 - taxes: - type: number - nullable: true - format: float - description: Impuestos - example: 28 - balance: - type: number - nullable: true - format: float - description: El saldo a depositar - example: 11499 - transferDate: - type: string - nullable: true - description: La fecha de transferencia de los fondos a su cuenta bancaria. - example: '2017-07-24' - merchantId: - description: Id de comercio asociado. Solo aplica si usted es comercio integrador. - type: string - nullable: true - PaymentStatusExtended: - description: Objeto que representa un cobro y si está pagado su correspondiente pago - type: object - nullable: true - properties: - flowOrder: - type: integer - description: El número de la orden de Flow - example: 3567899 - commerceOrder: - type: string - description: El número de la orden del comercio - example: sf12377 - requestDate: - type: string - description: La fecha de creación de la orden - format: 'yyyy-mm-dd hh:mm:ss' - example: '2017-07-21 12:32:11' - status: - type: integer - description: | - El estado de la order - - 1 pendiente de pago - - 2 pagada - - 3 rechazada - - 4 anulada - example: 1 - subject: - type: string - description: El concepto de la orden - example: game console - currency: - type: string - description: La moneda - example: CLP - amount: - type: number - format: float - description: El monto de la orden - example: 12000 - payer: - type: string - description: El email del pagador - example: pperez@gamil.com - optional: - type: string - nullable: true - description: datos opcionales enviados por el comercio en el request de creación de pago en el parámetro optional en formato JSon - example: - RUT: "7025521-9" - ID: "899564778" - pending_info: - type: object - description: Información para un pago pendiente cuando se generó un cupón de pago. Si no existen datos es que no se generó un cupón de pago. - properties: - media: - type: string - nullable: true - description: El medio de pago utilizado para emitir el cupón de pago - example: Multicaja - date: - type: string - nullable: true - description: La fecha de emisión del cupón de pago - example: '2017-07-21 10:30:12' - paymentData: - description: Los datos del pago - type: object - properties: - date: - type: string - nullable: true - description: La fecha de pago - example: '2017-07-21 12:32:11' - media: - type: string - nullable: true - description: El medio de pago utilizado - example: webpay - conversionDate: - type: string - nullable: true - description: La fecha de conversión de la moneda - example: '2017-07-21' - conversionRate: - type: number - nullable: true - format: float - description: La tasa de conversión. - example: 1.1 - amount: - type: number - nullable: true - format: float - description: El monto pagado - example: 12000 - currency: - type: string - nullable: true - description: La moneda con que se pagó - example: CLP - fee: - type: number - nullable: true - format: float - description: El costo del servicio - example: 551 - balance: - type: number - nullable: true - format: float - description: El saldo a depositar - example: 11499 - transferDate: - type: string - nullable: true - description: La fecha de transferencia de los fondos a su cuenta bancaria. - example: '2017-07-24' - mediaType: - type: string - nullable: true - description: Tipo de pago - example: 'Crédito' - cardLast4Numbers: - type: string - nullable: true - description: 4 últimos dígito de la tarjeta (si el pago fue con tarjeta). - example: '9876' - merchantId: - description: Id de comercio asociado. Solo aplica si usted es comercio integrador. - type: string - nullable: true - lastError: - description: Error del último intento - type: object - properties: - code: - type: string - nullable: true - description: Código de error - example: '01' - message: - type: string - nullable: true - description: Mensaje de error - example: 'Tarjeta inválida' - medioCode: - type: string - nullable: true - description: Código de error del medio de pago - example: '005' - PayResponse: - description: "Datos de retorno de la creación de un link de pago" - type: object - properties: - url: - type: string - description: | - URL ha redireccionar. Para formar el link de pago a esta URL se debe concatenar el token de la siguiente manera: - url + "?token=" + token - example: 'https://api.flow.cl' - token: - type: string - description: token de la transacción - example: "33373581FC32576FAF33C46FC6454B1FFEBD7E1H" - flowOrder: - type: number - description: Número de order de cobro Flow - example: 8765456 - - Customer: - type: object - properties: - customerId: - type: string - description: Identificador del cliente - example: cus_onoolldvec - created: - type: string - format: 'yyyy-mm-dd hh:mm:ss' - description: La fecha de creación - example: '2017-07-21 12:33:15' - email: - type: string - description: email del cliente - example: customer@gmail.com - name: - type: string - description: nombre del cliente - example: Pedro Raul Perez - pay_mode: - type: string - description: | - modo de pago del cliente: - - auto (cargo automático) - - manual (cobro manual) - creditCardType: - type: string - description: La marca de la tarjeta de crédito registrada - example: Visa - last4CardDigits: - type: string - description: Los últimos 4 dígitos de la tarjeta de crédito registrada - example: '4425' - externalId: - type: string - description: El identificador del cliente en su negocio - example: 14233531-8 - status: - type: string - description: | - El estado del cliente: - - 0 Eliminado - - 1 Activo - example: '1' - registerDate: - type: string - format: 'yyyy-mm-dd hh:mm:ss' - description: La fecha en que el cliente registro su tarjeta de crédito. - example: '2017-07-21 14:22:01' - List: - type: object - properties: - total: - type: number - description: El número total de registros encontrados - example: 200 - hasMore: - type: boolean - description: | - - 1 Si existen más páginas - - 0 Si es la última página - example: 1 - data: - type: array - items: - type: object - description: arreglo de registros de la página - example: '[{item list 1}{item list 2}{item list n..}' - - RegisterResult: - type: object - properties: - status: - type: string - description: El estado del registro - - 1 registrado - - 0 no registrado - example: '1' - customerId: - type: string - description: Identificador del cliente - example: cus_onoolldvec - creditCardType: - type: string - description: Marca de la tarjeta de crédito - example: Visa - last4CardDigits: - type: string - description: Últimos 4 dígitos de la tarjeta de crédito - example: '0366' - - RefundStatus: - type: object - properties: - token: - type: string - description: Token del reembolso - example: C93B4FAD6D63ED9A3F25D21E5D6DD0105FA8CAAQ - flowRefundOrder: - type: string - description: Número de orden de reembolso - example: '122767' - date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de solicitud de reembolso - example: '2017-07-21 12:33:15' - status: - type: string - description: | - Estado del reembolso, los estado pueden ser: - - created Solicitud creada - - accepted Reembolso aceptado - - rejected Reembolso rechazado - - refunded Reembolso reembolsado - - canceled Reembolso cancelado - example: created - amount: - type: number - description: Monto del reembolso - example: '12000.00' - fee: - type: number - description: Costo del servicio de reembolso - example: '240.00' - - CollectResponse: - type: object - properties: - type: - type: number - description: | - Tipo de cobro: - - 1 Cobro automático - - 2 Cobro normal (link de pago) - - 3 Cobro por email - example: '1' - commerceOrder: - type: string - description: El número de la orden del comercio - example: 'zc23456' - flowOrder: - type: number - description: El número de la orden de Flow - url: - type: string - description: | - URL ha redireccionar. Los cargos automaticos no tienen url por ser síncronos. Para formar el link de pago a esta URL se debe concatenar el token de la siguiente manera: - url + "?token=" + token - example: 'https://api.flow.cl' - token: - type: string - description: token de la transacción - example: "33373581FC32576FAF33C46FC6454B1FFEBD7E1H" - status: - type: integer - description: | - Estado de emisión del cobro, es decir si se emitió el cobro, no indica si hubo pago: - - 0 Cobro no emitido (uncollected) - - 1 Cobro emitido (collected) - paymenResult: - $ref: '#/components/schemas/PaymentStatus' - - - CollectObject: - type: object - description: Objeto de cobro para un lote de cobros - properties: - customerId: - type: string - description: Identificador del cliente en Flow - example: cus_onoolldvec - commerceOrder: - type: string - description: Identificador de la orden del comercio - example: zc23456 - subject: - type: string - description: descripción de la orden de cobro - example: cobro de factura - amount: - type: number - description: monto del cobro - example: 8000 - currency: - type: string - description: moneda del cobro, por omisón CLP - example: CLP - paymentMethod: - type: number - description: medio de pago en el caso de cobros tipo 2, por omisión 9 todos los medios de pago disponibles por el comercio - example: 9 - optional: - type: string - description: Valores opcionales en formato JSON - example: {"factura":"123456", "clave": "Valor"} - required: - - customerId - - commerceOrder - - subject - - amount - - BatchCollectResponse: - type: object - properties: - token: - type: string - description: hash token identificador del lote recibido - example: "33373581FC32576FAF33C46FC6454B1FFEBD7E1H" - receivedRows: - type: integer - description: Número de filas de collects recibidas - example: '112' - acceptedRows: - type: integer - description: Número de filas de collects aceptadas - example: '111' - rejectedRows: - type: array - description: Arreglo de filas de collects rechazadas - items: - $ref: '#/components/schemas/BatchCollectRejectedRow' - - - BatchCollectRejectedRow: - type: object - properties: - customerId: - type: string - description: Identificador del cliente en Flow - example: cus_onoolldvec - commerceOrder: - type: string - description: Identificador de la orden del comercio - example: zc23456 - rowNumber: - type: integer - description: Número de la fila en el lote - example: 3 - parameter: - type: string - description: nombre del parametros con error - example: commerceOrder - errorCode: - type: integer - description: | - código del error: - - 100 Mandatory field not sent - - 101 Value is empty or cero - - 102 Invalid field - - 103 customer not exist or deleted - - 104 CommerceOrder already sent - - 105 CommerceOrder has been previously paid - - 106 Currency is not soported - - 107 Amount is not numeric - - 108 Amount can not contain decimals for this currency - - 109 The minimum amount is $value CLP - - 110 Optional values are not in JSON format - example: 104 - errorMsg: - type: string - description: descripción del error - example: commerceOrder already sent - - BatchCollectStatusResponse: - type: object - properties: - token: - type: string - description: hash token identificador del lote recibido - example: "33373581FC32576FAF33C46FC6454B1FFEBD7E1H" - createdDate: - type: string - format: 'yyyy-mm-dd hh:mm:ss' - description: Fecha de creación del lote - example: '2019-07-05 14:23:56' - processedDate: - type: string - format: 'yyyy-mm-dd hh:mm:ss' - description: Fecha en que se procesó el lote - example: '2019-07-05 16:03:21' - status: - type: string - description: | - Estado del lote de collect: - - created (lote creado) - - processing (lote en procesamiento) - - processed (lote procesado) - collectRows: - type: array - description: arreglo de resultados de los cargos (collect) generados - items: - $ref: '#/components/schemas/CollectStatus' - - CollectStatus: - type: object - properties: - commerceOrder: - type: string - description: El número de la orden del comercio - example: 'zc23456' - type: - type: integer - description: | - Tipo de cobro: - - 1 Cobro automático - - 2 Cobro normal (link de pago) - - 3 Cobro por email - example: '1' - flowOrder: - type: integer - description: El número de la orden de Flow - example: 9876476 - url: - type: string - description: | - URL ha redireccionar. Los cargos automaticos no tienen url por ser síncronos. Para formar el link de pago a esta URL se debe concatenar el token de la siguiente manera: - url + "?token=" + token - example: 'https://www.flow.cl/web/pay.php' - token: - type: string - description: token de la transacción - example: "33373581FC32576FAF33C46FC6454B1FFEBD7E1H" - status: - type: string - description: | - Estado del registro de collect: - - unprocessed (Fila no procesada) - - collected (Cobro generado) - - uncollected (Cobro no generado) - errorCode: - type: integer - description: Código de error de la fila - example: 105 - errorMsg: - type: string - description: Mensaje de error de la fila - example: 12300 has been previously paid - - ReverseChargeResponse: - type: object - properties: - status: - type: string - description: | - Estado de la reversa: - - 0 Reversa no efectuada - - 1 Reversa efectuada - example: '1' - message: - type: string - description: Mensaje resultado de la reversa - example: Reverse charge was successful - - Plan: - type: object - properties: - planId: - type: string - description: Identificador del plan - example: myPlan01 - name: - type: string - description: Nombre del plan - example: Plan junior - currency: - type: string - description: Moneda del plan - example: CLP - amount: - type: number - description: Monto del plan - example: 20000 - interval: - type: number - description: | - Define la frecuencia de cobro del plan: - - 1 diaria - - 2 semanal - - 3 mesual - - 4 anual - example: 3 - interval_count: - type: number - description: | - Número de intervalos de la frecuencia de cobro del plan, ejemplo: - interal = 2 y interval_count = 2 significaría un plan quincenal. - example: 1 - created: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de creación del plan - example: '2017-07-21 12:33:15' - trial_period_days: - type: number - description: Número de días de Trial - example: 15 - days_until_due: - type: number - description: Número de días pasados, después de generar un importe, para considerar el importe vencido. - example: 3 - periods_number: - type: number - description: Número de períodos de duración del plan. Si el plan es de término indefinido el valor de periods_number sera 0 (cero) - example: 12 - urlCallback: - type: string - format: uri - description: URL donde Flow notificará al comercio los pagos efectuados por este plan. - example: https://www.comercio.cl/flow/suscriptionResult.php - charges_retries_number: - type: number - description: Número de reintentos de cargo, por omisión Flow utilizará 3 reintentos. - example: 3 - currency_convert_option: - type: number - description: | - Si hay conversión de moneda, en qué momento hará la conversión: - - 1 al pago - - 2 al importe (invoice) - status: - type: number - description: | - El estado del plan: - - 1 activo - - 0 eliminado - example: 1 - public: - type: number - description: | - Si el Plan es de visibilidad pública, es decir, expuestos a otras aplicaciones: - - 0 privado - - 1 público - example: 1 - - Subscription: - type: object - properties: - subscriptionId: - type: string - description: Identificador de la suscripción - example: "sus_azcyjj9ycd" - planId: - type: string - description: Identificador del plan - example: "MiPlanMensual" - plan_name: - type: string - description: Nombre del plan - example: "Plan mensual" - customerId: - type: string - description: Identificador del cliente - example: "cus_eblcbsua2g" - created: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de creación de la suscripción - example: '2018-06-26 17:29:06' - subscription_start: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de inicio de la suscripción - example: '2018-06-26 17:29:06' - subscription_end: - type: string - format: 'yyyy-mm-dd hh:mm:ss' - description: Fecha de término de la suscripción, si la suscripción no tiene término mostrará valor null. - example: '2019-06-25 00:00:00' - period_start: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de inicio del período actual. - example: '2018-06-26 00:00:00' - period_end: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de término del período actual. - example: '2018-06-26 00:00:00' - next_invoice_date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha del siguiente cobro - example: '2018-06-27 00:00:00' - trial_period_days: - type: number - description: Número de días de Trial - example: 1 - trial_start: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de inicio del trial - example: '2018-06-26 00:00:00' - trial_end: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de término del trial. - example: '2018-06-26 00:00:00' - cancel_at_period_end: - type: number - description: | - Si la suscripción será cancelada automáticamente al finalizar el período actual: - - 0 No - - 1 Si - example: 0 - cancel_at: - type: string - description: Fecha de cancelación de la suscripción - example: null - periods_number: - type: number - description: Número de períodos de vigencia de la suscripción - example: 12 - days_until_due: - type: number - description: Número de días pasados, después de generar un importe, para considerar el importe vencido. - example: 3 - status: - type: number - description: | - Estado de la suscripción: - - 0 Inactivo (no iniciada) - - 1 Activa - - 2 En período de trial - - 4 Cancelada - example: 1 - morose: - type: number - description: | - Si la subscripción está morosa: - - 0 si todos los invoices está pagados. - - 1 si uno o más invoices están vencidos. - - 2 si uno o más invoices están pendiente de pago, pero no vencidos. - example: 0 - discount: - $ref: '#/components/schemas/Discount' - invoices: - type: array - description: Lista de los importe efectuados a la suscripción. - items: - $ref: '#/components/schemas/Invoice' - - Coupon: - properties: - id: - type: number - description: "El identificador del cupón" - example: 166 - name: - type: string - description: "El nombre del cupón" - example: 166 - percent_off: - type: number - description: "Si el cupón es del tipo porcentaje, en este campo indica el porcentaje de descuento, sino, muestra vacío." - example: 10.00 - currency: - type: string - description: "Si el cupón es del tipo monto, aquí va la moneda, sino, muestra vacío" - example: "CLP" - amount: - type: number - description: "Si el cupón es del tipo monto, aquí va el monto de descuento, sino, muestra vacío" - example: 2000.00 - created: - type: string - description: "La fecha de creación del cupón" - example: "2018-07-13 09:57:53" - duration: - type: number - description: "Si el cupón es de duración indefinida = 0, o es de duración definida = 1 " - example: 1 - times: - type: number - description: "Si el cupón es de duración definida, en este campo va el número de veces de duración. Si el cupón es aplicado a un cliente, el número de duración equivale a meses, si el cupón es aplicado a una suscripción, el número de duración será los períodos del plan de suscripción" - example: 1 - max_redemptions: - type: number - description: "Es el número de veces que puede ser aplicado este cupón, ya sea a clientes o a suscripciones. Una vez que se completa el número de veces, ya no queda disponible para ser aplicado." - example: 50 - expires: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: "Si el cupón se creó con fecha de expiración aquí va la fecha." - example: "2018-12-31 00:00:00" - status: - type: number - description: "El estado del cupón, Activo = 1, Inactivo = 0" - example: 1 - redemtions: - type: number - description: "El número de veces que se ha aplicado este cupón" - example: 21 - - - Invoice: - properties: - id: - type: number - description: Identificador del importe - example: 1034 - subscriptionId: - type: string - description: Identificador de la suscripción - example: sus_azcyjj9ycd - customerId: - type: string - description: Identificador del cliente - example: cus_eblcbsua2g - created: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de creación del importe - example: '2018-06-26 17:29:06' - subject: - type: string - description: Descripción del importe - example: PlanPesos - período 2018-06-27 / 2018-06-27 - currency: - type: string - description: Moneda del importe - example: 'CLP' - amount: - type: number - description: Monto del importe - example: 20000 - period_start: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de inicio del período del importe - example: '2018-06-27 00:00:00' - period_end: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de término del período del importe - example: '2018-07-26 00:00:00' - attemp_count: - type: integer - description: Número de intentos de cobro del importe - example: 0 - attemped: - type: integer - description: | - Si este importe se cobrará: - - 1 Se cobrará - - 0 No se cobrará - example: 1 - next_attemp_date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha del siguiente intento de cobro - example: '2018-07-27 00:00:00' - due_date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha en que este importe será considerado moroso - example: '2018-06-30 00:00:00' - status: - type: integer - description: | - Estado del importe: - - 0 impago - - 1 pagado - - 2 anulado - example: 0 - error: - type: integer - description: | - Si se produjo un error al intentar cobrar el invoice: - - 0 Sin error - - 1 Con error - example: 0 - errorDate: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha en que se produjo el error o null si no hay error - example: '2018-06-30 00:00:00' - errorDescription: - type: string - description: Descripción de error o null si no hay error - example: The minimum amount is 350 CLP - items: - type: array - description: Items del invoice - items: - $ref: '#/components/schemas/InvoiceItem' - payment: - $ref: '#/components/schemas/PaymentStatus' - outsidePayment: - $ref: '#/components/schemas/OutsidePayment' - paymentLink: - type: string - description: Link de pago. Cuando el invoice no esta pagado - example: https://www.flow.cl/app/web/pay.php?token=7C18C35358FEF0E33C056C719E94956D4FC9BBEL - chargeAttemps: - type: array - description: Intentos de cargo fallidos - items: - $ref: '#/components/schemas/ChargeAttemps' - - OutsidePayment: - description: Objeto que muestra los datos de un pago por fuera - type: object - nullable: true - properties: - date: - type: string - description: Fecha del pago por fuera - example: 2021-03-08 00:00:00 - comment: - type: string - description: descripción del pago por fuera - example: Pago por caja - - InvoiceItem: - type: object - properties: - id: - type: number - description: Identificador del InvoiceItem - example: 567 - subject: - type: string - description: Descripción del InvoiceItem - example: "PlanPesos - período 2018-06-27 / 2018-06-27" - type: - type: number - description: | - Tipo de item - - 1 Cargo por plan - - 2 Descuento - - 3 Item pendiente - - 9 Otros - example: 1 - currency: - type: string - description: Moneda del item - example: 'CLP' - amount: - type: number - description: Monto del item - example: 20000 - - Error: - type: object - properties: - code: - type: number - description: Código de error - example: 401 - message: - type: string - description: Mensaje de error - example: 'Bad Request' - - Discount: - type: object - description: Descuento aplicado a una Suscripción - properties: - id: - type: number - description: Identificador del descuento - example: 181 - type: - type: string - description: | - Tipo de descuento puede ser de 2 tipos - - Subscription discount - - Customer discount - example: Subscription discount - created: - type: string - description: Fecha de creación del descuento - example: 2019-12-01 00:00:00 - start: - type: string - description: Fecha de inicio del descuento - example: 2019-12-01 00:00:00 - end: - type: string - description: Fecha de término del descuento - example: 2019-12-31 00:00:00 - deleted: - type: string - description: Fecha en que se eliminó el descuento o null si está vigente - example: 2019-12-25 00:00:00 - status: - type: number - description: | - Estado del descuento - - 1 Activo - - 0 Inactivo - example: 1 - coupon: - $ref: '#/components/schemas/Coupon' - - - Settlement: - type: object - properties: - id: - type: number - description: Identificador de la liquidación - example: 1001 - date: - type: string - format: 'yyyy-mm-dd' - description: fecha de la liquidación - example: '2018-06-15' - rut: - type: string - description: Rol único tributario RUT - example: '9999999-9' - name: - type: string - description: Nombre del usuario de la cuenta Flow - example: "Francisco Castillo" - email: - type: string - description: cuenta de email del usuario de Flow - example: 'fcastillo@gmail.com' - initialBalance: - type: number - description: Saldo inicial de la cuenta - example: -1000 - transferred: - type: number - description: Monto a transferir a la cuenta bancaria del comercio. - example: 120000 - billed: - type: number - description: Monto a facturar por Flow para esta liquidación. - example: 2164 - finalBalance: - type: number - description: Saldo final de la liquidación. Un saldo final negativo significa que el comercio le adeuda dinero a Flow, en cambio, un saldo positivo significa que Flow le adeuda al comercio. - example: 0 - transferredSummary: - type: array - description: Resumen de transferencia de fondos. - items: - $ref: '#/components/schemas/SettlementSummary' - billedSummary: - type: array - description: Resumen de facturación - items: - $ref: '#/components/schemas/SettlementSummary' - transfersDetail: - type: array - description: Detalle de las tranferencias bancarias - items: - $ref: '#/components/schemas/TransferDetail' - paymentsDetail: - type: array - description: Detalle de pagos de la liquidación. - items: - $ref: '#/components/schemas/PaymentDetail' - generalReturnsDetail: - type: array - description: Detalle de Devoluciones - items: - $ref: '#/components/schemas/GeneralDetail' - refundReturnsDetail: - type: array - description: Detalle de reembolsos devueltos - items: - $ref: '#/components/schemas/RefundDetail' - refundWithholdingDetail: - type: array - description: Detalle de reembolsos retenidos - items: - $ref: '#/components/schemas/RefundDetail' - generalWithholdingDetail: - type: array - description: Detalle de retenciones efectuadas - items: - $ref: '#/components/schemas/GeneralDetail' - refundBilledDetail: - type: array - description: Detalle de reembolsos facturados - items: - $ref: '#/components/schemas/RefundDetail' - - - SettlementSummary: - type: object - description: Resumen de liquidación. Si los valores se muestran con signo negativo significa que se deducen ya sea de la transferencia bancaria o de la facturación. - properties: - item: - type: string - description: Concepto del detalle - example: 'Comisión de pagos recibidos' - amount: - type: number - description: Monto del detalle - example: -1000 - taxes: - type: number - description: Monto del impuesto si es que aplica - example: -190 - - TransferDetail: - type: object - description: Detalle de transferencia bancaria - properties: - date: - type: string - format: 'yyyy-mm-dd' - description: Fecha de la transferencia - example: '2018-06-15' - name: - type: string - description: Nombre asociado a la cuenta bancaria - example: 'Francisco Castillo' - bank: - type: string - description: Nombre del banco - example: 'Banco de Chile - Edwards' - account: - type: string - description: Número de la cuenta bancaria - example: '001456700900' - type: - type: string - description: Tipo de cuenta - example: 'Cuenta corriente' - rut: - type: string - description: Rol único tributario asociado a la cuenta bancaria - example: '9999999-9' - email: - type: string - description: cuenta de email asoaciada a la cuenta bancaria - example: 'fcastillo@gmail.com' - amount: - type: number - description: Monto de la transferencia bancaria - example: 120000 - status: - type: string - description: Estado de la transferencia - example: Transferida - - PaymentDetail: - type: object - description: Detalle de pagos de una liquidación - properties: - id: - type: number - description: Identificador Flow de la transacción - example: 3879654 - date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha del pago - example: '2018-06-12 16:13:39' - subject: - type: string - description: Concepto del pago - example: 'Orden 13455 Castillo.cl' - media: - type: string - description: Medio de pago - example: Multicaja - amount: - type: number - description: Monto del pago - example: 53500 - rate: - type: number - description: Tasa de comision aplicada - example: 3.35 - fee: - type: number - description: Monto de comisión aplicado - example: 1960 - - GeneralDetail: - type: object - description: Detalle de Retención o Devolución - properties: - id: - type: number - description: Identificador - example: 101 - date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha de la Retención o Devolución - example: '2018-06-08 17:15:33' - subject: - type: string - description: Concepto - example: 'Dif IVA retenido/facturado fact 1345' - amount: - type: number - description: Monto de la retención o devolución - example: 100 - - RefundDetail: - type: object - description: Detalle de Reembolsos en liquidación - properties: - id: - type: number - description: Identificador del reembolso - example: 222 - date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: Fecha del reembolso - example: '2018-05-04 11:47:11' - receiverEmail: - type: string - description: Email del receptor del reembolso - example: 'fcastillo@gmail.com' - paymentId: - type: number - description: Identificador del pago asociado al reembolso - example: 3654771 - amount: - type: number - description: Monto del reembolso - example: 2000 - fee: - type: number - description: Comisión del reembolso - example: 202 - SettlementBaseV2: - type: object - properties: - id: - type: number - description: Identificador de la liquidación - example: 1001 - date: - type: string - format: 'yyyy-mm-dd' - description: fecha de la liquidación - example: '2018-06-15' - taxId: - type: string - description: Identificador tributario - example: '9999999-9' - name: - type: string - description: Nombre del usuario de la cuenta Flow - example: "John Doe" - email: - type: string - description: cuenta de email del usuario de Flow - example: 'johndoe@flow.cl' - currency: - type: string - description: Moneda de liquidación - example: CLP - initial_balance: - type: number - description: Saldo inicial - example: 0 - final_balance: - type: number - description: Saldo final - example: 0 - transferred: - type: number - description: Total a depositar - example: 0 - billed: - type: number - description: Monto neto a facturar - example: 0 - SettlementV2: - allOf: - - $ref: '#/components/schemas/SettlementBaseV2' - - type: object - properties: - summary: - type: object - properties: - transferred: - type: array - description: Resumen de transferencia de fondos. - items: - $ref: '#/components/schemas/SettlementSummary' - commission: - type: array - description: Resumen de comisiones - items: - $ref: '#/components/schemas/SettlementComissionSummary' - payment: - type: array - description: Resumen de pagos recibidos - items: - $ref: '#/components/schemas/SettlementPaymentSummary' - credit: - type: array - description: Resumen de devoluciones - items: - $ref: '#/components/schemas/SettlementCreditSummary' - debit: - type: array - description: Resumen de retenciones - items: - $ref: '#/components/schemas/SettlementDebitSummary' - billed: - type: array - description: Resumen de facturaciones - items: - $ref: '#/components/schemas/SettlementBilledSummary' - detail: - type: object - properties: - payment: - type: array - description: Detalle de pagos de la liquidación. - items: - $ref: '#/components/schemas/SettlementPaymentDetail' - debit: - type: array - description: Detalle de devoluciones - items: - $ref: '#/components/schemas/SettlementGeneralDetail' - credit: - type: array - description: Detalle de retenciones - items: - $ref: '#/components/schemas/SettlementGeneralDetail' - SettlementGeneralSummary: - type: object - properties: - amount: - type: number - description: Monto del detalle - example: 1000 - commission: - type: number - description: Comision del detalle - example: 10 - nullable: true - taxes: - type: number - description: Monto del impuesto si es que aplica - example: 190 - balance: - type: number - description: Total del item (monto - comision - taxes) - example: 1200 - SettlementComissionSummary: - type: object - properties: - type: - type: string - description: Tipo de detalle - example: 'Comisión de pagos' - amount: - type: number - description: Monto de comisión - example: 1000 - taxes: - type: number - description: Monto del impuesto si es que aplica - example: 190 - total: - type: number - description: Total del item (comision - taxes) - example: 1200 - SettlementDebitSummary: - allOf: - - $ref: '#/components/schemas/SettlementGeneralSummary' - - type: object - properties: - operations: - type: number - description: Cantidad de operaciones - example: 100 - type: - type: string - description: Tipo de detalle - example: 'Reembolsos' - SettlementCreditSummary: - allOf: - - $ref: '#/components/schemas/SettlementGeneralSummary' - - type: object - properties: - operations: - type: number - description: Cantidad de operaciones - example: 100 - type: - type: string - description: Tipo de detalle - example: 'Devolución Solicitada por el Comercio' - SettlementBilledSummary: - type: object - properties: - type: - type: string - description: Tipo de detalle - example: 'Comisiones de pagos recibidos' - amount: - type: number - description: Monto del detalle - example: 1000 - taxes: - type: number - description: Monto del impuesto si es que aplica - example: 190 - balance: - type: number - description: Total del item (monto - taxes) - example: 1200 - SettlementPaymentSummary: - type: object - properties: - paymentMethod: - type: string - description: Medio de pago - example: Webpay - brand: - type: string - description: Marca de tarjeta (aplica sólo para medios de pagto que aceptan tarjetas de débito, crédito o prepago) - example: Visa - nullable: true - operations: - type: number - description: Cantidad de operaciones - example: 100 - amount: - type: number - description: Monto del detalle - example: 2000 - rate: - type: number - description: Tasa de comisión - example: 4.19 - fixed: - type: number - description: Costo fijo por operaicón - example: 100 - commission: - type: number - description: Comisión - example: 83.8 - taxes: - type: number - description: Impuesto - example: 15.9 - balance: - type: number - description: Saldo - example: 1900.3 - SettlementPaymentDetail: - type: object - properties: - trxId: - type: number - description: Número de la orden - example: 100 - date: - type: string - format: yyyy-mm-dd h24:mi:ss - description: Fecha/hora de pago - example: "2020-12-01 23:01:56" - concept: - type: string - description: Concepto de pago - example: 1 unidad de producto A - paymentMethod: - type: string - description: Medio de pago - example: Webpay - amount: - type: number - description: Monto del detalle - example: 2000 - rate: - type: number - description: Tasa de comisión - example: 4.19 - commission: - type: number - description: Comisión - example: 83.8 - taxes: - type: number - description: Monto del impuesto si es que aplica - example: 15.9 - balance: - type: number - description: Monto neto a abonar - example: 1900.3 - SettlementGeneralDetail: - type: object - properties: - id: - type: number - description: Identificador del detalle - example: 100 - date: - type: string - format: yyyy-mm-dd h24:mi:ss - description: Fecha del detalle - example: "2020-12-01 23:01:56" - concept: - type: string - description: Concepto del detalle - example: Reembolso - trxId: - type: string - description: Número de orden - example: 123 - nullable: true - amount: - type: number - description: Monto del detalle - example: 2000 - commission: - type: number - description: Comisión - example: 4.19 - nullable: true - taxes: - type: number - description: Monto del impuesto si es que aplica - example: 190 - balance: - type: number - description: Monto neto - example: 83.80 - ChargeAttemps: - type: object - description: Intentos fallidos de cargos automáticos - properties: - id: - type: number - description: Identificador del intento - example: 901 - date: - type: string - format: 'yyyy-mm-dd hh:mm.ss' - description: fecha del intento - example: "2018-12-06 15:03:33" - customerId: - type: string - description: Identificador del Customer - example: "cus_1uqfm95dch" - invoiceId: - type: number - description: Identificador del Invoice, si el intento no corresponde a un Invoice este vendra vacío. - example: 1234 - commerceOrder: - type: string - description: El número de la orden del comercio - example: "1883" - currency: - type: string - description: La moneda del intento de cargo - example: "CLP" - amount: - type: number - format: float - description: El monto a cobrar especificado con 4 decimales - example: 90000.0000 - errorCode: - type: number - description: El código del error que se produjo en el intento de cargo - example: 1605 - errorDescription: - type: string - description: La descripción del error producido en el intento de cargo - example: "This commerceOrder 1883 has been previously paid" - Merchant: - type: object - description: Objeto de comercio asociado - properties: - id: - type: string - description: Id de comercio asociado - example: NEG-A - name: - type: string - description: Nombre de comercio asociado - example: Negocio A - url: - type: string - description: Url del comercio asociado - example: https://flow.cl - createdate: - type: string - description: Fecha de creación - example: "02-04-2020 11:52" - status: - type: number - description: "Estado del comercio. Valores posibles:\n\n0: Pendiente de aprobación\n\n1: Aprobado\n\n2: Rechazado" - example: "0" - verifydate: - type: string - nullable: true - description: Fecha de aprobación/rechazo - example: "02-04-2020 11:52" - MerchantDeleteResponse: - type: object - description: Objeto de comercio asociado - properties: - status: - type: string - description: Estado de la operacion - example: ok - message: - type: string - description: Mensaje asociado a la operacion - example: Merchant X deleted -``` diff --git a/docs/apiclient-payment.md b/docs/apiclient-payment.md new file mode 100644 index 0000000..e628aea --- /dev/null +++ b/docs/apiclient-payment.md @@ -0,0 +1,7 @@ +# Payment + +La clase Payment proporciona métodos para interactuar con la API de pagos de Flow.cl. Permite realizar operaciones como obtener el estado de un pago, obtener una lista de pagos, crear un nuevo pago y crear un pago por correo electrónico. + +## Metodos + +::: pyflowcl.Payment diff --git a/docs/apiclient-refund.md b/docs/apiclient-refund.md new file mode 100644 index 0000000..82c3072 --- /dev/null +++ b/docs/apiclient-refund.md @@ -0,0 +1,3 @@ +# Refund + +::: pyflowcl.Refund diff --git a/docs/apiclient.md b/docs/apiclient.md index 69c08f9..132d512 100644 --- a/docs/apiclient.md +++ b/docs/apiclient.md @@ -1,5 +1,3 @@ -::: pyflowcl.Clients +# ApiClient -::: pyflowcl.Payment - -::: pyflowcl.Refund +::: pyflowcl.Clients.ApiClient diff --git a/docs/changelog.md b/docs/changelog.md index 4ab25ad..8edb141 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Futuros Cambios] +## [2024.9.23] - Cambios Importantes + +### Cambiado + +- Sistema de versiones a fecha para facil seguimiento [AÑO.MES.DIA] del commit. +- Deprecacion Python 3.8 +- Inicio Deprecacion OpenApi3 introducido en **1.1.0** +- Actualizacion documentacion + ## [1.2.2] - 2023-08-10 ### Cambiado diff --git a/docs/cli.md b/docs/cli.md deleted file mode 100644 index 2831b51..0000000 --- a/docs/cli.md +++ /dev/null @@ -1,75 +0,0 @@ -# Operaciones CLI - -## Descripción - -La aplicación CLI para Flow Chile es una herramienta que te permite interactuar con la API de Flow a través de la línea de comandos. Esta aplicación está basada en Typer, lo que hace que su uso sea muy sencillo y fácil de entender. - - -## Comandos Disponibles - -### Listar Operaciones - -Muestra las operaciones disponibles en un recurso de la API de Flow. - -```shell -flow-cli listar-operaciones -``` - -### Buscar Operaciones - -Muestra las operaciones disponibles en un recurso de la API de Flow. - -```shell -flow-cli buscar-operaciones [STRING] -``` - -### Información de Operación - -Muestra información de una operación específica de la API de Flow. - -```shell -flow-cli info-operacion -``` - - -## Ejemplos de Uso - -### Listar Operaciones - -Para listar las operaciones disponibles en un recurso específico de la API de Flow, ejecuta el siguiente comando: - -``` -flow-cli listar-operaciones -``` - -Esto mostrará una tabla con las operaciones disponibles. - -### Buscar Operaciones - -Si quieres buscar todas las operaciones relacionadas con correos, ejecuta el siguiente comando: - -``` -flow-cli buscar-operaciones email -``` - -Esto mostrará una tabla con las operaciones disponibles que contengan el nombre `email`. - -### Información de Operación - -Para obtener información detallada sobre una operación específica de la API de Flow, ejecuta el siguiente comando: - -``` -flow-cli info-operacion payment_create -``` - -Esto mostrará la descripción y otros detalles de la operación "payment_create". - -## Configuración - -La aplicación CLI utiliza las siguientes variables de entorno para la autenticación con la API de Flow: - -- `PYFLOWCL_API_KEY`: Clave de API para autenticación. -- `PYFLOWCL_API_SECRET`: Secreto de API para autenticación. -- `PYFLOWCL_ENDPOINT`: El entorno de las llamadas a la API. Puede ser "live" o "sandbox" (valor por defecto: live). - -Asegúrate de configurar estas variables de entorno antes de utilizar la aplicación. diff --git a/docs/django-payments.md b/docs/django-payments.md index b87df7d..20cbdb9 100644 --- a/docs/django-payments.md +++ b/docs/django-payments.md @@ -1 +1 @@ -# Usar con Django-Payments +# Integración con Django-Payments diff --git a/docs/flowapi.md b/docs/flowapi.md deleted file mode 100644 index c4f3dca..0000000 --- a/docs/flowapi.md +++ /dev/null @@ -1 +0,0 @@ -::: pyflowcl.FlowAPI diff --git a/docs/index.md b/docs/index.md index c3564ba..1114c94 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,44 +1,46 @@ # API de Conexion para Flow.cl -Cliente API para operaciones con el servicio de pagos Flow.cl [FlowAPI-3.0.1](https://www.flow.cl/docs/api.html) -Frunciona como wrapper sobre cliente [OpenAPI3](https://github.com/Dorthu/openapi3) - +pyflowcl es una biblioteca de Python que proporciona una interfaz para interactuar con la API de Flow en Chile. Con pyflowcl, puedes realizar diversas operaciones, como crear pagos, obtener información de pagos, realizar reembolsos y más. ## Instalación -Este proyecto está desarrollado para Python 3.8 y superior. + +Este proyecto está desarrollado para Python 3.9 y superior. Este proyecto es administrado por Poetry. === "Usando Poetry" - ```shell +`shell poetry add pyflowcl - ``` + ` === "Usando pip" - ```shell +`shell pip install pyflowcl - ``` + ` ## Uso Básico Aquí hay un ejemplo básico de cómo usar pyflowcl para crear un pago: ```python -from pyflowcl import FlowAPI -from pyflowcl.utils import genera_parametros - -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") -parametros = { - "apiKey": api.api_key, - "amount": 10000, - "currency": "CLP", - "subject": "Ejemplo de Pago", - "email": "correo@example.com", - "urlConfirmation": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "urlReturn": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "commerceOrder": "order_1234", - } -pago = api.objetos.call_payment_create(parameters=genera_parametros(parametros, api.api_secret)) -print(pago) -> { "flowOrder": 123456, "url": "https://www.flow.cl/app/pay.php", "token": "tok_123456" } +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient + +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) +pago = { + "subject": "Asunto Email", + "commerceOrder": "1234", + "amount": 5000, + "email": "mariofix@pm.me", + "urlConfirmation": "https://mariofix.com", + "urlReturn": "https://mariofix.com", +} + +llamada = Payment.create(api, pago) +print(f"{llamada = }") +> llamada = { "flowOrder": 123456, "url": "https://www.flow.cl/app/pay.php", "token": "tok_123456" } # Obtiene la URL de pago print(f"URL de pago: {pago.url}?token={pago.token}") @@ -47,4 +49,12 @@ print(f"URL de pago: {pago.url}?token={pago.token}") ## Siguientes pasos -Puedes revisar la [guia de uso](uso.md) o las [opciones avanzadas](uso-avanzado.md) para obtener mas información. +Puedes revisar la [guia de uso](uso.md) o las integraciones con [Django Payments](django-payments.md) o [Merchants](merchants.md) para obtener mas información. + +## ¿Por que el cambio? + +**TL;DR**: Por la falta de mantencion en openapi3 he decidido deprecar su soporte. + +Hace aproximadamente 10 años comencé a desarrollar esta librería con el objetivo de crear una herramienta simple y funcional para el sistema en el que estaba trabajando. Aunque el primer commit es de hace 4 años, la he estado utilizando desde entonces, refinándola según las necesidades. Inicialmente, implementé el manejo de pagos y reembolsos, y en ese momento, funcionaba perfectamente. Sin embargo, cuando intenté añadir soporte para suscripciones y otras características más complejas, me encontré con que la API era mucho más extensa de lo que esperaba. Además, surgió un problema de formato en el archivo que impidió que se pudiera leer correctamente. + +Investigando soluciones, descubrí la librería Dorthu/openapi3, que permitía generar automáticamente una API a partir del archivo YAML proporcionado por Flow, lo que parecía ideal para simplificar el proceso en Python. Implementé el soporte completo para la API, logrando que funcionara en un 90%, aunque todavía no es completamente usable. Intenté contribuir con una solución para un bug, pero no fue aceptada. Además, el mantenedor no ha realizado actualizaciones en los últimos dos años. Por eso, he decidido dejar de dar soporte a FlowAPI y migrar hacia FlowClient, actualizando la documentación en consecuencia. Los pasos para realizar esta transición están detallados en la documentación. diff --git a/docs/merchants.md b/docs/merchants.md new file mode 100644 index 0000000..81fc400 --- /dev/null +++ b/docs/merchants.md @@ -0,0 +1 @@ +# Integración con Merchants diff --git a/docs/models.md b/docs/models.md new file mode 100644 index 0000000..769658a --- /dev/null +++ b/docs/models.md @@ -0,0 +1,3 @@ +# Modelos + +::: pyflowcl.models diff --git a/docs/overrides/partials/integrations/analytics/matomo.html b/docs/overrides/partials/integrations/analytics/matomo.html deleted file mode 100644 index 4a5bbf6..0000000 --- a/docs/overrides/partials/integrations/analytics/matomo.html +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/docs/uso-avanzado.md b/docs/uso-avanzado.md deleted file mode 100644 index f350b6e..0000000 --- a/docs/uso-avanzado.md +++ /dev/null @@ -1 +0,0 @@ -# Uso Avanzado diff --git a/docs/uso.md b/docs/uso.md index cbd077f..b2df759 100644 --- a/docs/uso.md +++ b/docs/uso.md @@ -1,160 +1,152 @@ -# Cómo usar +# Cómo Usar la API de Flow -## Instalación +Este ejemplo muestra cómo realizar diversas operaciones usando la API de Flow para pagos en Chile. -=== "Usando Poetry" - ```shell - poetry add pyflowcl - ``` -=== "Usando pip" - ```shell - pip install pyflowcl - ``` -=== "Clonar con git" - ```shell - git clone https://github.com/mariofix/pyflowcl.git - ``` +## Requisitos +Antes de comenzar, asegúrate de tener las siguientes cosas configuradas: + +- Una cuenta activa en Flow.cl +- Tu `ApiKey` y `ApiSecret` proporcionados por Flow +- Python 3.9 o superior ## Configuración -La aplicación CLI utiliza las siguientes variables de entorno para la autenticación con la API de Flow: +Define las credenciales de tu API y la URL base de la API de Flow. Estas deben ser proporcionadas por Flow cuando configures tu cuenta: -- `PYFLOWCL_API_KEY`: Clave de API para autenticación. -- `PYFLOWCL_API_SECRET`: Secreto de API para autenticación. -- `PYFLOWCL_ENDPOINT`: El entorno de las llamadas a la API. Puede ser "live" o "sandbox" (valor por defecto: live). +```python +from pyflowcl.Clients import ApiClient -Asegúrate de configurar estas variables de entorno antes de utilizar la aplicación. +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) +``` -## Operaciones disponibles +## Crear un Pago + +Para crear un pago, debes definir los detalles del mismo en un diccionario. Aquí tienes un ejemplo: + +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient + +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) +pago = { + "subject": "Asunto Email", + "commerceOrder": "1234", + "amount": 5000, + "email": "mariofix@pm.me", + "urlConfirmation": "https://mariofix.com", + "urlReturn": "https://mariofix.com", +} -Luego de inicializar la clase con -``` py title="Inicialización Clase" -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") +llamada = Payment.create(api, pago) +print(f"{llamada = }") ``` -puedes llamarla con cualquiera de las operaciones disponibles, por ejemplo para obtener el estado de un pago +## Enviar Pago por Email + +Puedes enviar un pago por correo electrónico utilizando el siguiente código: + +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient + +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) +pago = { + "subject": "Asunto Email", + "commerceOrder": "1234", + "amount": 5000, + "email": "mariofix@pm.me", + "urlConfirmation": "https://mariofix.com", + "urlReturn": "https://mariofix.com", +} -``` py title="Inicialización Clase" -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") -status = api.objetos.call_payment_getstatus(parameters={"token": "token_del_pago_a_consultar"}) +llamada = Payment.createEmail(api, pago) +print(f"{llamada = }") ``` -Cada operacion tiene sus parametros definidos, te sugerimos revisar [la API de flow](https://www.flow.cl/docs/api.html) para ver cuales son - -| Operación | Uso | Descripción | -| ----------|-----| ----------- | -| payment_getstatus | ```api.objetos.call_payment_getstatus()``` | Este método se utiliza para obtener el estado de un pago. -| payment_getstatusbycommerceid | ```api.objetos.call_payment_getstatusbycommerceid()``` | Este método permite obtener el estado de un pago en base al ... | -| payment_getstatusbyfloworder|```api.objetos.call_payment_getstatusbyfloworder()```|Este método permite obtener el estado de un pago en base -| payment_getpayments|```api.objetos.call_payment_getpayments()```|Este método permite obtener la lista paginada de pagos -| payment_getstatusextended|```api.objetos.call_payment_getstatusextended()```|Este método se utiliza para obtener el estado de un pago. -| payment_getstatusbyfloworderextended |```api.objetos.call_payment_getstatusbyfloworderextended()``` |Este método permite obtener el estado de un pago en base -| payment_create|```api.objetos.call_payment_create()```|Este método permite crear una orden de pago a **Flow** y -| payment_createemail|```api.objetos.call_payment_createemail()```|Permite generar un cobro por email. **Flow** emite un email -| refund_create|```api.objetos.call_refund_create()```|Este servicio permite crear una orden de reembolso. Una vez -| refund_cancel|```api.objetos.call_refund_cancel()```|Este servicio permite cancelar una orden de reembolso -| refund_getstatus|```api.objetos.call_refund_getstatus()```|Permite obtener el estado de un reembolso solicitado. -| customer_create|```api.objetos.call_customer_create()```|Permite crear un nuevo cliente. -| customer_edit|```api.objetos.call_customer_edit()```|Este servicio permite editar los datos de un client -| customer_delete|```api.objetos.call_customer_delete()```|Permite eliminar un cliente. Para eliminar un cliente, -| customer_get|```api.objetos.call_customer_get()```|Permite obtener los datos de un cliente en base a su **custo... | -| customer_list|```api.objetos.call_customer_list()```|Permite obtener la lista de clientes paginada de acuerdo a l... | -| customer_register|```api.objetos.call_customer_register()```|Envía a un cliente a registrar su tarjeta de crédito para po... | -| customer_getregisterstatus|```api.objetos.call_customer_getregisterstatus()```|Elte servicio retorna el resultado del registro de la tarjet... | -| customer_unregister|```api.objetos.call_customer_unregister()```|Este servicio permite eliminar el registro de la tarjeta de ... | -| customer_charge|```api.objetos.call_customer_charge()```|Este servicio permite efectuar un cargo automático en la tar... | -| customer_collect|```api.objetos.call_customer_collect()```|Este servicio envía un cobro a un cliente. Si el cliente tie... | -| customer_batchcollect|```api.objetos.call_customer_batchcollect()```|Este servicio envía de forma masiva un lote de cobros a clie... | -| customer_getbatchcollectstatus|```api.objetos.call_customer_getbatchcollectstatus()```|Este servicio permite consultar el estado de un lote de cobr... | -| customer_reversecharge|```api.objetos.call_customer_reversecharge()```|Este servicio permite reversar un cargo previamente efectuad... | -| customer_getcharges|```api.objetos.call_customer_getcharges()```|Este servicio obtiene la lista paginada de los cargos efectu... | -| customer_getchargeattemps|```api.objetos.call_customer_getchargeattemps()```|Este servicio obtiene la lista paginada de los intentos de c... | -| customer_getsubscriptions|```api.objetos.call_customer_getsubscriptions()```|Este servicio obtiene la lista paginada de las suscripciones... | -| plans_create|```api.objetos.call_plans_create()```| Este servicio permite crear un nuevo Plan de Suscripción... | -| plans_get|```api.objetos.call_plans_get()```|Este servicio permite obtener los datos de un Plan de Suscri... | -| plans_edit|```api.objetos.call_plans_edit()```|Este servicio permite editar los datos de un Plan de Suscrip... | -| plans_delete|```api.objetos.call_plans_delete()```|Este servicio permite eliminar un Plan de Suscripción. El el... | -| plans_list|```api.objetos.call_plans_list()```|Permite obtener la lista de planes de suscripción paginada d... | -| subscription_create|```api.objetos.call_subscription_create()```|Este servicio permite crear una nueva suscripción de un clie... | -| subscription_get|```api.objetos.call_subscription_get()```|Este servicio permite obtener los datos de una suscripción.... | -| subscription_list|```api.objetos.call_subscription_list()```|Permite obtener la lista de suscripciones paginada de acuerd... | -| subscription_changetrial|```api.objetos.call_subscription_changetrial()```|Este servicio permite modificar los días de Trial de una sus... | -| subscription_cancel|```api.objetos.call_subscription_cancel()```|Este servicio permite cancelar una suscripción. Existen form... | -| subscription_addcoupon|```api.objetos.call_subscription_addcoupon()```|Este servicio permite agregar un descuento a la suscripción.... | -| subscription_deletecoupon|```api.objetos.call_subscription_deletecoupon()```|Este servicio permite eliminar el descuento que tenga -| coupon_create|```api.objetos.call_coupon_create()```|Este servicio permite crear un cupón de -| coupon_edit|```api.objetos.call_coupon_edit()```|Este servicio permite editar un cupón de descuento. -| coupon_delete|```api.objetos.call_coupon_delete()```|Este servicio permite eliminar un cupón de descuento. -| coupon_get|```api.objetos.call_coupon_get()```|Este servicio permite obtener los datos de un cupón de -| coupon_list|```api.objetos.call_coupon_list()```|Este servicio permite la lista de cupones de -| invoice_get|```api.objetos.call_invoice_get()```|Este servicio permite obtener los datos de un -| invoice_cancel|```api.objetos.call_invoice_cancel()```|Este servicio permite cancelar un Importe (Invoice) -| invoice_outsidepayment|```api.objetos.call_invoice_outsidepayment()```|Este servicio permite dar por pagado un Importe (Invoice) -| invoice_getoverdue|```api.objetos.call_invoice_getoverdue()```|Este servicio permite obtener la lista de invoices -| invoice_retrytocollect|```api.objetos.call_invoice_retrytocollect()```|Este servicio permite reintentar el cobro de un Invoice -| settlement_getbydate|```api.objetos.call_settlement_getbydate()```|Este método se utiliza para obtener la liquidación de la -| settlement_getbyid|```api.objetos.call_settlement_getbyid()```|Este método se utiliza para obtener el objeto Settlement -| settlement_search|```api.objetos.call_settlement_search()```|Este método se utiliza para obtener el(los) encabezado(s) -| settlement_getbyidv2|```api.objetos.call_settlement_getbyidv2()```|Este método se utiliza para obtener el objeto -| merchant_create|```api.objetos.call_merchant_create()```|Este método permite crear un nuevo comercio asociado -| merchant_edit|```api.objetos.call_merchant_edit()```|Este método permite modificar un comercio asociado -| merchant_delete|```api.objetos.call_merchant_delete()```|Este método permite eliminar un comercio asociado -| merchant_get|```api.objetos.call_merchant_get()```|Este método permite obtener la información de un comercio -| merchant_list|```api.objetos.call_merchant_list()```|Permite obtener la lista de comercios paginada de acuerdo a - -## Crear un pago - -La API nos entrega dos opciones para generar un pago: - -* payment_create -* payment_createemail - -Usaremos `payment_create` para simular la operacion mas común. - -``` py title="Generacion de un pago" -from pyflowcl import FlowAPI -from pyflowcl.utils import genera_parametros - -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") -parametros = { - "apiKey": api.api_key, - "amount": 10000, - "currency": "CLP", - "subject": "Ejemplo de Pago", - "email": "correo@example.com", - "urlConfirmation": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "urlReturn": "https://mariofix.github.io/pyflowcl/uso/#crear-un-pago", - "commerceOrder": "order_1234", -} -pago = api.objetos.call_payment_create(parameters=genera_parametros(parametros, api.api_secret)) -print(pago) -> { "flowOrder": 123456, "url": "https://www.flow.cl/app/pay.php", "token": "tok_123456" } +## Consultar Estado del Pago + +Para verificar el estado de un pago, puedes utilizar el token del pago, el ID de comercio o el número de orden de Flow. + +### Estado por Token + +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient + +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) + +llamada = Payment.getStatus(api, "token") +print(f"{llamada = }") +``` + +### Estado por ID de Comercio + +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient -# Obtiene la URL de pago -print(f"URL de pago: {pago.url}?token={pago.token}") -> URL de pago: https://www.flow.cl/app/pay.php?token=tok_123456 +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) + +llamada = Payment.getStatusByCommerceId(api, "commerce-id") +print(f"{llamada = }") ``` -## Obtener estado de un pago +### Estado por Número de Orden de Flow + +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient -Existen varias operaciones que nos permiten obtener el estado de un pago: +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) -* payment_getstatus -* payment_getstatusbycommerceid -* payment_getstatusbyfloworder -* payment_getstatusextended -* payment_getstatusbyfloworderextended +llamada = Payment.getStatusByFlowOrder(api, "flow-order") +print(f"{llamada = }") +``` + +## Obtener Todos los Pagos + +Para obtener una lista de pagos, utiliza las siguientes configuraciones: -Usaremos `payment_getstatusbycommerceid` para buscar el estado del pago generado en el paso anterior. +```python +from pyflowcl import Payment +from pyflowcl.Clients import ApiClient -``` py -from pyflowcl import FlowAPI -from pyflowcl.utils import genera_parametros +api = ApiClient( + api_url="https://www.flow.cl/api", + api_key="tu_api_key", + api_secret="tu_api_secret", +) -api = FlowAPI(api_key="tu llave flow", api_secret="tu secreto flow") -parametros = {"apiKey": api.api_key, "token": "tok_123456"} -estado = api.objetos.call_get_payment_getstatus(parameters=genera_parametros(parametros, api.secretKey)) -print(estado) -> { "flowOrder": 123456, "commerceOrder": "com_123456", "status": 2, ...} +data = {"apiKey": "tu_api_key", "date": "yyyy-mm-dd"} +llamada = Payment.getPayments(api, data) +print(f"{llamada = }") ``` + +## Resumen + +Este ejemplo cubre cómo configurar la API de Flow y realizar varias operaciones relacionadas con pagos. Asegúrate de tener tus credenciales correctas y de probar las funcionalidades antes de implementarlas en producción. diff --git a/docs/utils.md b/docs/utils.md deleted file mode 100644 index 9c065cd..0000000 --- a/docs/utils.md +++ /dev/null @@ -1 +0,0 @@ -::: pyflowcl.utils diff --git a/flow_client.py b/flow_client.py index 041981d..6b006b2 100755 --- a/flow_client.py +++ b/flow_client.py @@ -1,45 +1,45 @@ -import logging -from typing import Any, Dict +from typing import Any from pyflowcl import Payment from pyflowcl.Clients import ApiClient -logging.basicConfig(level=logging.DEBUG) - API_URL = "https://sandbox.flow.cl/api" -API_KEY = "key" -API_SECRET = "secret" +API_KEY = "5C627F95-4523-4AEB-9FBC-7883B1FL43E5" +API_SECRET = "c08a5046b3bc357bf1cd3db9286e7560b4451501" + +api = ApiClient( + api_url=API_URL, + api_key=API_KEY, + api_secret=API_SECRET, +) -api = ApiClient(API_URL, API_KEY, API_SECRET) -pago: Dict[str, Any] = { +pago = { "subject": "Asunto Email", "commerceOrder": "1234", "amount": 5000, "email": "mariofix@pm.me", "urlConfirmation": "https://mariofix.com", "urlReturn": "https://mariofix.com", + "currency": "CLP", } llamada = Payment.create(api, pago) -print(llamada) -del llamada +print(f"{llamada = }") llamada = Payment.createEmail(api, pago) -print(llamada) -del llamada +print(f"{llamada = }") llamada = Payment.getStatus(api, "token") -print(llamada) -del llamada +print(f"{llamada = }") + llamada = Payment.getStatusByCommerceId(api, "commerce-id") -print(llamada) -del llamada +print(f"{llamada = }") + llamada = Payment.getStatusByFlowOrder(api, "flow-order") -print(llamada) -del llamada +print(f"{llamada = }") + -data: Dict[str, Any] = {"apiKey": "", "date": "yyyy-mm-dd"} +data: dict[str, Any] = {"apiKey": "", "date": "yyyy-mm-dd"} llamada = Payment.getPayments(api, data) -print(llamada) -del llamada +print(f"{llamada = }") diff --git a/mkdocs.yml b/mkdocs.yml index 5181160..600c716 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,28 +4,27 @@ repo_url: https://github.com/mariofix/pyflowcl repo_name: mariofix/pyflowcl site_description: Documentacion para pyFlowCl site_author: mariofix -copyright: "©2023 - Mario Hernández" +copyright: "MIT License" edit_uri: "" theme: - custom_dir: docs/overrides name: material language: es palette: - - media: '(prefers-color-scheme: light)' - scheme: default - primary: indigo - accent: teal - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - media: '(prefers-color-scheme: dark)' - scheme: slate - primary: deep purple - accent: blue grey - toggle: - icon: material/weather-night - name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + accent: teal + toggle: + icon: material/weather-sunny + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: deep purple + accent: blue grey + toggle: + icon: material/weather-night + name: Switch to light mode features: - navigation.tracking - content.tabs.link @@ -42,34 +41,20 @@ theme: plugins: - mkdocstrings - - git-authors nav: - Inicio: index.md - Cómo Usar: uso.md - - CLI: cli.md - Referencia: - - FlowAPI: flowapi.md - - Utils: utils.md - - apiFlow.yaml.md # Agregar Swagger - - APIClient: apiclient.md - - Uso Avanzado: uso-avanzado.md + - ApiClient: apiclient.md + - Payment: apiclient-payment.md + - Refund: apiclient-refund.md + - Modelos: models.md - Django Payments: django-payments.md + - Merchants: merchants.md - Colabora: contributing.md - Registro de Cambios: changelog.md -extra: - analytics: - provider: matomo - site_id: 3 -# alternate: -# - link: -# name: es - Español -# lang: es -# - link: /en/ -# name: en - English -# lang: en - markdown_extensions: toc: permalink: true @@ -82,9 +67,9 @@ markdown_extensions: extra: pymdownx.superfences: custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format '' + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format "" pymdownx.tabbed: alternate_style: true attr_list: diff --git a/pyflowcl/Clients.py b/pyflowcl/Clients.py index a98cd34..90d918a 100644 --- a/pyflowcl/Clients.py +++ b/pyflowcl/Clients.py @@ -1,104 +1,66 @@ -# pyflowcl/Clients.py -""" -##Este Cliente será deprecado en favor de FlowAPI. -Cliente API genérico. - -Este modulo contiene - -- `ApiClient` - Objeto Principal - -__Uso Básico__: -```python -API_URL = "https://www.flow.cl/api" -API_KEY = "your_key" -API_SECRET = "your_secret" -FLOW_TOKEN = "your_payment_token" -api = ApiClient(API_URL, API_KEY, API_SECRET) -``` -""" import hashlib import hmac -import logging -import warnings from dataclasses import dataclass -from typing import Any, Dict +from typing import Any import requests @dataclass class ApiClient: - """Clase ApiClient con los objetos para realizar llamadas - - Implementa todos los métodos de ``dataclass``. + """ + Una clase para interactuar con la API de Flow.cl. Attributes: - api_url: URL de API Flow (live o sandbox) - api_key: APIKey entregado por Flow - api_secret: SecretKey entregado por Flow + api_url (str): La URL base de la API. Por defecto es "https://www.flow.cl/api". + api_key (str): La clave de la API proporcionada por Flow.cl. + api_secret (str): El secreto de la API proporcionado por Flow.cl. """ api_url: str = "https://www.flow.cl/api" api_key: str = "" api_secret: str = "" - def __post_init__(self): - warnings.warn( - "ApiClient está deprecado, porfavor usa FlowAPI", - DeprecationWarning, - stacklevel=2, - ) - - def make_signature(self, params: Dict[str, Any]) -> str: - """Crea el Hash de validacion para ser enviado con la informacion + def make_signature(self, params: dict[str, Any]) -> str: + """ + Genera una firma HMAC-SHA256 para los parámetros dados. Args: - params: Parametros para crear la firma + params (dict[str, Any]): Un diccionario de parámetros para firmar. Returns: - Hash de validacion + str: La firma generada como una cadena hexadecimal. """ string = "" for k, d in params.items(): if d is not None: string = string + f"{k}{d}" - logging.debug(f"String to Hash: {string}") hash_string = hmac.new(self.api_secret.encode(), string.encode(), hashlib.sha256).hexdigest() return hash_string - def get(self, url: str, query_string: Dict[str, Any]) -> Dict[str, Any]: - """Reimplementa get + def get(self, url: str, query_string: dict[str, Any]) -> dict[str, Any]: + """ + Realiza una solicitud GET a la API. Args: - url: URL a obtener - query_string: diccionario con parametros get + url (str): La URL específica para la solicitud GET. + query_string (dict[str, Any]): Los parámetros de consulta para la solicitud. Returns: - El objeto `requests` + dict[str, Any]: La respuesta de la API como un diccionario. """ return requests.get(url, params=query_string) - def post(self, url: str, post_data: Dict[str, Any]) -> Dict[str, Any]: - """Reimplementa post - - Args: - url: URL a obtener - post_data: diccionario con parametros post - - Returns: - El objeto `requests` + def post(self, url: str, post_data: dict[str, Any]) -> dict[str, Any]: """ - return requests.post(url, data=post_data) - - def put(self, url: str, put_data: Dict[str, Any]) -> Dict[str, Any]: - """Reimplementa put + Realiza una solicitud POST a la API. Args: - url: URL a obtener - put_data: diccionario con parametros post + url (str): La URL específica para la solicitud POST. + post_data (dict[str, Any]): Los datos a enviar en el cuerpo de la solicitud POST. Returns: - El objeto `requests` + dict[str, Any]: La respuesta de la API como un diccionario. """ - return requests.put(url, data=put_data) + return requests.post(url, data=post_data) diff --git a/pyflowcl/Payment.py b/pyflowcl/Payment.py index 6384e7a..0d10fd5 100644 --- a/pyflowcl/Payment.py +++ b/pyflowcl/Payment.py @@ -1,6 +1,5 @@ -import logging from dataclasses import asdict -from typing import Any, Dict, cast +from typing import Any, cast from .Clients import ApiClient from .models import ( @@ -13,85 +12,83 @@ ) -def getStatus( - apiclient: ApiClient, - token: str, -) -> PaymentStatus: - """Obtiene el estado de un pago previamente creado, el parametro token +def getStatus(apiclient: ApiClient, token: str) -> PaymentStatus: + """ + Obtiene el estado de un pago previamente creado, el parametro token hace referencia a notification id, el cual se recibe luego de procesado un pago + + Args: + apiclient: ApiClient + token: str + + Returns: + PaymentStatus """ url = f"{apiclient.api_url}/payment/getStatus" - params: Dict[str, Any] = {"apiKey": apiclient.api_key, "token": token} + params: dict[str, Any] = {"apiKey": apiclient.api_key, "token": token} signature = apiclient.make_signature(params) params["s"] = signature - logging.debug("Before Request:" + str(params)) response = apiclient.get(url, params) if response.status_code == 200: - return PaymentStatus.from_dict(cast(Dict[str, Any], response.json())) + return PaymentStatus.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def getStatusByCommerceId( - apiclient: ApiClient, - commerceId: str, -) -> PaymentStatus: - """Obtiene el estado de un pago previamente creado, el parametro token +def getStatusByCommerceId(apiclient: ApiClient, commerceId: str) -> PaymentStatus: + """ + Obtiene el estado de un pago previamente creado, el parametro token hace referencia a notification id, el cual se recibe luego de procesado un pago """ url = f"{apiclient.api_url}/payment/getStatusByCommerceId" - params: Dict[str, Any] = {"apiKey": apiclient.api_key, "commerceId": commerceId} + params: dict[str, Any] = {"apiKey": apiclient.api_key, "commerceId": commerceId} signature = apiclient.make_signature(params) params["s"] = signature - logging.debug("Before Request:" + str(params)) response = apiclient.get(url, params) if response.status_code == 200: - return PaymentStatus.from_dict(cast(Dict[str, Any], response.json())) + return PaymentStatus.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def getStatusByFlowOrder( - apiclient: ApiClient, - flowOrder: int, -) -> PaymentStatus: - """Obtiene el estado de un pago previamente creado, el parametro token +def getStatusByFlowOrder(apiclient: ApiClient, flowOrder: int) -> PaymentStatus: + """ + Obtiene el estado de un pago previamente creado, el parametro token hace referencia a notification id, el cual se recibe luego de procesado un pago """ url = f"{apiclient.api_url}/payment/getStatusByFlowOrder" - params: Dict[str, Any] = {"apiKey": apiclient.api_key, "flowOrder": flowOrder} + params: dict[str, Any] = {"apiKey": apiclient.api_key, "flowOrder": flowOrder} signature = apiclient.make_signature(params) params["s"] = signature - logging.debug("Before Request:" + str(params)) response = apiclient.get(url, params) if response.status_code == 200: - return PaymentStatus.from_dict(cast(Dict[str, Any], response.json())) + return PaymentStatus.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def getPayments(apiclient: ApiClient, payment_info: Dict[str, Any]) -> PaymentList: +def getPayments(apiclient: ApiClient, payment_info: dict[str, Any]) -> PaymentList: """ Este método permite obtener la lista paginada de pagos recibidos en un día.Los objetos pagos de la lista tienen la misma estructura de @@ -102,20 +99,19 @@ def getPayments(apiclient: ApiClient, payment_info: Dict[str, Any]) -> PaymentLi payment_info["apiKey"] = apiclient.api_key signature = apiclient.make_signature(payment_info) payment_info["s"] = signature - logging.debug("Before Request:" + str(payment_info)) response = apiclient.get(url, payment_info) if response.status_code == 200: - return PaymentList.from_dict(cast(Dict[str, Any], response.json())) + return PaymentList.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def create(apiclient: ApiClient, payment_data: Dict[str, Any]) -> PaymentResponse: +def create(apiclient: ApiClient, payment_data: dict[str, Any]) -> PaymentResponse: """ 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 @@ -126,25 +122,27 @@ def create(apiclient: ApiClient, payment_data: Dict[str, Any]) -> PaymentRespons 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. + + Example: + from pyflowcl import Payment """ url = f"{apiclient.api_url}/payment/create" payment = PaymentRequest.from_dict(payment_data) if not payment.apiKey: payment.apiKey = apiclient.api_key payment.s = apiclient.make_signature(asdict(payment)) - logging.debug("Before Request:" + str(payment)) response = apiclient.post(url, asdict(payment)) if response.status_code == 200: - return PaymentResponse.from_dict(cast(Dict[str, Any], response.json())) + return PaymentResponse.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def createEmail(apiclient: ApiClient, payment_data: Dict[str, Any]) -> PaymentResponse: +def createEmail(apiclient: ApiClient, payment_data: dict[str, Any]) -> PaymentResponse: """ 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 @@ -158,16 +156,13 @@ def createEmail(apiclient: ApiClient, payment_data: Dict[str, Any]) -> PaymentRe payment.apiKey = apiclient.api_key payment.s = apiclient.make_signature(asdict(payment)) - - logging.debug("Before Request:" + str(payment)) - response = apiclient.post(url, asdict(payment)) if response.status_code == 200: - return PaymentResponse.from_dict(cast(Dict[str, Any], response.json())) + return PaymentResponse.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) diff --git a/pyflowcl/Refund.py b/pyflowcl/Refund.py index 4edfec1..ccdd602 100644 --- a/pyflowcl/Refund.py +++ b/pyflowcl/Refund.py @@ -1,12 +1,11 @@ -import logging from dataclasses import asdict -from typing import Any, Dict, cast +from typing import Any, cast from .Clients import ApiClient from .models import GenericError, RefundRequest, RefundStatus -def create(apiclient: ApiClient, refund_data: Dict[str, Any]) -> RefundStatus: +def create(apiclient: ApiClient, refund_data: dict[str, Any]) -> RefundStatus: """ Este servicio permite crear una orden de reembolso. Una vez que el receptor del reembolso acepte o rechaze el reembolso, Flow @@ -21,22 +20,18 @@ def create(apiclient: ApiClient, refund_data: Dict[str, Any]) -> RefundStatus: if refund.apiKey is None: refund.apiKey = apiclient.api_key refund.s = apiclient.make_signature(asdict(refund)) - logging.debug("Before Request:" + str(refund)) response = apiclient.post(url, asdict(refund)) if response.status_code == 200: - return RefundStatus.from_dict(cast(Dict[str, Any], response.json())) + return RefundStatus.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) -def getStatus( - apiclient: ApiClient, - token: str, -) -> RefundStatus: +def getStatus(apiclient: ApiClient, token: str) -> RefundStatus: """ 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 @@ -44,16 +39,15 @@ def getStatus( """ url = f"{apiclient.api_url}/refund/getStatus" - params: Dict[str, Any] = {"apiKey": apiclient.api_key, "token": token} + params: dict[str, Any] = {"apiKey": apiclient.api_key, "token": token} signature = apiclient.make_signature(params) params["s"] = signature - logging.debug("Before Request:" + str(params)) response = apiclient.get(url, params) if response.status_code == 200: - return RefundStatus.from_dict(cast(Dict[str, Any], response.json())) + return RefundStatus.from_dict(cast(dict[str, Any], response.json())) elif response.status_code == 400: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) elif response.status_code == 401: - raise GenericError(cast(Dict[str, Any], response.json())) + raise GenericError(cast(dict[str, Any], response.json())) else: raise GenericError({"code": response.status_code, "message": response}) diff --git a/pyflowcl/cli.py b/pyflowcl/cli.py index 752b3a2..1da0431 100644 --- a/pyflowcl/cli.py +++ b/pyflowcl/cli.py @@ -5,7 +5,7 @@ from .openapi3 import FlowAPI -app = typer.Typer(help="CLI para Flow Chile") +app = typer.Typer(help="CLI para Flow Chile - No usar.") @app.command("listar-operaciones", help="Muestra las operaciones disponibles.") diff --git a/pyflowcl/models.py b/pyflowcl/models.py index 053cf22..2c19eff 100644 --- a/pyflowcl/models.py +++ b/pyflowcl/models.py @@ -1,11 +1,5 @@ -""" -pyflowcl.models -~~~~~~~~~~~~~~~~ -Modelos de distintos objetos del paquete -""" - from dataclasses import dataclass -from typing import Any, Dict, List, Optional, cast +from typing import Any, Optional class GenericError(BaseException): @@ -20,7 +14,31 @@ def __str__(self): @dataclass class PaymentStatus: - """Objeto para obtener el estado de un pago""" + """ + Representa el estado de un pago en el sistema Flow.cl. + + Esta clase contiene información detallada sobre un pago, incluyendo su estado, + detalles de la transacción y datos del pagador. + + Attributes: + flow_order (Optional[int]): Número de orden asignado por Flow. + commerce_order (Optional[str]): Número de orden asignado por el comercio. + request_date (Optional[str]): Fecha y hora de la solicitud del pago. + status (Optional[int]): Estado actual del pago. Los valores posibles son: + 1 (Pagado), 2 (Rechazado), 3 (Pendiente), 4 (Anulado). + subject (Optional[str]): Asunto o descripción del pago. + currency (Optional[str]): Código de la moneda utilizada en el pago (ej. CLP, USD). + amount (Optional[float]): Monto del pago. + payer (Optional[str]): Correo electrónico o identificación del pagador. + optional (Optional[str]): Campo para información adicional definida por el comercio. + pending_info (Optional[dict[Any, Any]]): Información adicional para pagos pendientes. + payment_data (Optional[dict[Any, Any]]): Datos adicionales relacionados con el método de pago. + merchant_id (Optional[str]): Identificador único del comercio en Flow. + + Note: + Todos los campos son opcionales ya que pueden no estar presentes en todas las + respuestas de la API de Flow, dependiendo del estado y tipo de pago. + """ flow_order: Optional[int] = None commerce_order: Optional[str] = None @@ -31,12 +49,12 @@ class PaymentStatus: amount: Optional[float] = None payer: Optional[str] = None optional: Optional[str] = None - pending_info: Optional[Dict[Any, Any]] = None - payment_data: Optional[Dict[Any, Any]] = None + pending_info: Optional[dict[Any, Any]] = None + payment_data: Optional[dict[Any, Any]] = None merchant_id: Optional[str] = None @staticmethod - def from_dict(d: Dict[str, Any]) -> "PaymentStatus": + def from_dict(d: dict[str, Any]) -> "PaymentStatus": flow_order = d.get("flowOrder") commerce_order = d.get("commerceOrder") request_date = d.get("requestDate") @@ -68,10 +86,35 @@ def from_dict(d: Dict[str, Any]) -> "PaymentStatus": @dataclass class PaymentRequest: - """Objeto para generar una URL de pago""" + """ + Representa una solicitud de pago para ser procesada por Flow.cl. + + Esta clase contiene todos los detalles necesarios para iniciar una transacción + de pago a través de la API de Flow. + + Attributes: + amount (float): Monto del pago. Valor por defecto es 0. + commerceOrder (str): Número de orden único asignado por el comercio. + currency (Optional[str]): Moneda del pago. Si no se especifica, se utilizará + el valor de payment_currency. + email (str): Correo electrónico del pagador. Valor por defecto es "correo@ejemplo.cl". + merchantId (Optional[str]): Identificador único del comercio en Flow. + optional (Optional[str]): Campo opcional para información adicional definida por el comercio. + payment_currency (str): Moneda en la que se realizará el pago. Valor por defecto es "CLP". + payment_method (Optional[int]): Método de pago a utilizar. Los valores posibles dependen + de la configuración del comercio en Flow. + subject (str): Asunto o descripción del pago. + timeout (Optional[int]): Tiempo máximo (en segundos) para completar el pago. + urlConfirmation (str): URL a la que Flow enviará la confirmación del pago. + urlReturn (str): URL a la que se redirigirá al usuario después del pago. + + Note: + Los campos opcionales (currency, merchantId, optional, payment_method, timeout) + pueden omitirse si no son necesarios para la transacción específica. + """ amount: float = 0 - apiKey: str = "API_KEY" + apiKey: str | None = None commerceOrder: str = "" currency: Optional[str] = None email: str = "correo@ejemplo.cl" @@ -86,7 +129,7 @@ class PaymentRequest: s: str = "" @staticmethod - def from_dict(d: Dict[str, Any]) -> "PaymentRequest": + def from_dict(d: dict[str, Any]) -> "PaymentRequest": amount = d.get("amount") apiKey = d.get("apiKey") commerceOrder = d.get("commerceOrder") @@ -122,7 +165,37 @@ def from_dict(d: Dict[str, Any]) -> "PaymentRequest": @dataclass class PaymentRequestEmail: - """Objeto para generar un correo electronico de pago""" + """ + Representa una solicitud de pago por correo electrónico para ser procesada por Flow.cl. + + Esta clase contiene todos los detalles necesarios para iniciar una transacción de pago + por correo electrónico a través de la API de Flow. Flow enviará un correo electrónico + al pagador con la información del pago y un enlace para completar la transacción. + + Attributes: + amount (float): Monto del pago. Valor por defecto es 0. + commerceOrder (str): Número de orden único asignado por el comercio. + currency (Optional[str]): Moneda del pago. Si no se especifica, se utilizará + el valor de payment_currency. + email (str): Correo electrónico del pagador. Valor por defecto es "correo@ejemplo.cl". + forward_days_after (Optional[int]): Número de días después de los cuales se enviará + un recordatorio si el pago no se ha completado. + forward_times (Optional[int]): Número de veces que se enviará el recordatorio. + merchantId (Optional[str]): Identificador único del comercio en Flow. + optional (Optional[str]): Campo opcional para información adicional definida por el comercio. + payment_currency (Optional[str]): Moneda en la que se realizará el pago. + subject (Optional[str]): Asunto o descripción del pago. + timeout (Optional[int]): Tiempo máximo (en segundos) para completar el pago. + urlConfirmation (str): URL a la que Flow enviará la confirmación del pago. + urlReturn (str): URL a la que se redirigirá al usuario después del pago. + + Note: + Los campos opcionales (currency, forward_days_after, forward_times, merchantId, + optional, payment_currency, subject, timeout) pueden omitirse si no son necesarios + para la transacción específica. + Los campos forward_days_after y forward_times son específicos para el envío + de recordatorios por correo electrónico. + """ amount: float = 0 apiKey: str = "API_KEY" @@ -141,7 +214,7 @@ class PaymentRequestEmail: s: str = "" @staticmethod - def from_dict(d: Dict[str, Any]) -> "PaymentRequestEmail": + def from_dict(d: dict[str, Any]) -> "PaymentRequestEmail": amount = d.get("amount") apiKey = d.get("apiKey") commerceOrder = d.get("commerceOrder") @@ -179,14 +252,31 @@ def from_dict(d: Dict[str, Any]) -> "PaymentRequestEmail": @dataclass class PaymentResponse: - """Objeto respuesta de una creacion de pago""" + """ + Representa la respuesta a una solicitud de pago procesada por Flow.cl. + + Esta clase contiene la información devuelta por Flow después de iniciar + una transacción de pago, incluyendo la URL de pago y el token de la transacción. + + Attributes: + url (Optional[str]): URL a la que se debe redirigir al usuario para completar el pago. + Puede ser None si la respuesta no incluye una URL. + token (Optional[str]): Token único que identifica la transacción en el sistema de Flow. + Puede ser None si la respuesta no incluye un token. + flowOrder (Optional[int]): Número de orden asignado por Flow a esta transacción. + Puede ser None si la respuesta no incluye un número de orden. + + Note: + Todos los campos son opcionales ya que pueden no estar presentes en todas las + respuestas de la API de Flow, dependiendo del tipo de solicitud y su estado. + """ url: Optional[str] = None token: Optional[str] = None - flowOrder: Optional[float] = None + flowOrder: Optional[int] = None @staticmethod - def from_dict(d: Dict[str, Any]) -> "PaymentResponse": + def from_dict(d: dict[str, Any]) -> "PaymentResponse": url = d.get("url") token = d.get("token") flowOrder = d.get("flowOrder") @@ -200,14 +290,37 @@ def from_dict(d: Dict[str, Any]) -> "PaymentResponse": @dataclass class PaymentList: - """Lista de pagos""" - - total: Optional[float] = None + """ + Representa una lista paginada de pagos obtenida de Flow.cl. + + Esta clase contiene información sobre un conjunto de pagos, incluyendo + el número total de pagos, si hay más páginas disponibles, y los datos + de los pagos en la página actual. + + Attributes: + total (Optional[int]): El número total de pagos en todas las páginas. + Puede ser None si la información no está disponible. + hasMore (Optional[bool]): Indica si hay más páginas de pagos disponibles. + True si hay más páginas, False si es la última página, None si no se proporciona. + data (Optional[list[dict[Any, Any]]]): Una lista de diccionarios, donde cada diccionario + contiene los detalles de un pago individual. Puede ser None si no hay datos disponibles. + + Note: + - Todos los campos son opcionales ya que pueden no estar presentes en todas las + respuestas de la API de Flow, dependiendo del contexto de la solicitud. + - El campo 'data' contiene una lista de diccionarios. Cada diccionario representa + un pago y su estructura dependerá de la configuración específica de Flow y del + tipo de información solicitada. + - Esta clase es útil para manejar respuestas paginadas de la API de Flow, + permitiendo una fácil navegación a través de múltiples pagos. + """ + + total: Optional[int] = None hasMore: Optional[bool] = None - data: Optional[List[Dict[Any, Any]]] = None + data: Optional[list[dict[Any, Any]]] = None @staticmethod - def from_dict(d: Dict[str, Any]) -> "PaymentList": + def from_dict(d: dict[str, Any]) -> "PaymentList": total = d.get("total") hasMore = d.get("hasMore") data = d.get("data") @@ -221,8 +334,6 @@ def from_dict(d: Dict[str, Any]) -> "PaymentList": @dataclass class RefundRequest: - """Refund Request object""" - amount: float = 0 apiKey: str = "API_KEY" commerceTrxId: Optional[str] = None @@ -233,7 +344,7 @@ class RefundRequest: s: str = "" @staticmethod - def from_dict(d: Dict[str, Any]) -> "RefundRequest": + def from_dict(d: dict[str, Any]) -> "RefundRequest": amount = d.get("amount") apiKey = d.get("apiKey") commerceTrxId = d.get("commerceTrxId") @@ -257,8 +368,6 @@ def from_dict(d: Dict[str, Any]) -> "RefundRequest": @dataclass class RefundStatus: - """Refund object""" - flowRefundOrder: int = 0 date: str = "" status: str = "" @@ -266,7 +375,7 @@ class RefundStatus: fee: float = 0 @staticmethod - def from_dict(d: Dict[str, Any]) -> "RefundStatus": + def from_dict(d: dict[str, Any]) -> "RefundStatus": flowRefundOrder = d.get("flowRefundOrder") date = d.get("date") status = d.get("status") @@ -280,392 +389,3 @@ def from_dict(d: Dict[str, Any]) -> "RefundStatus": amount=amount, fee=fee, ) - - -@dataclass -class Customer: - """Customer Object""" - - created: str = "" - creditCardType: Optional[str] = None - customerId: str = "" - email: str = "" - externalId: Optional[str] = None - last4CardDigits: Optional[str] = None - name: str = "" - pay_mode: Optional[str] = None - registerDate: Optional[str] = None - status: int = 0 - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "Customer": - created = d.get("created") - creditCardType = d.get("creditCardType") - customerId = d.get("customerId") - email = d.get("email") - externalId = d.get("externalId") - last4CardDigits = d.get("last4CardDigits") - name = d.get("name") - pay_mode = d.get("pay_mode") - registerDate = d.get("registerDate") - status = d.get("status") - - return Customer( - created=created, - creditCardType=creditCardType, - customerId=customerId, - email=email, - externalId=externalId, - last4CardDigits=last4CardDigits, - name=name, - pay_mode=pay_mode, - registerDate=registerDate, - status=status, - ) - - -@dataclass -class CustomerRequest: - """CustomerRequest Object""" - - apiKey: str = "" - customerId: str = "" - email: str = "" - externalId: str = "" - name: str = "" - s: str = "" - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CustomerRequest": - apiKey = d.get("apiKey") - customerId = d.get("customerId") - email = d.get("email") - externalId = d.get("externalId") - name = d.get("name") - s = d.get("s") - - return CustomerRequest( - apiKey=apiKey, - customerId=customerId, - email=email, - externalId=externalId, - name=name, - s=s, - ) - - -@dataclass -class CustomerList: - """Lista de Clientes""" - - total: Optional[float] = None - hasMore: Optional[bool] = None - data: Optional[List[Dict[Any, Any]]] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CustomerList": - total = d.get("total") - hasMore = d.get("hasMore") - data = d.get("data") - - return CustomerList( - total=total, - hasMore=hasMore, - data=data, - ) - - -@dataclass -class CustomerRegisterResponse: - """Objeto respuesta""" - - url: Optional[str] = None - token: Optional[str] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CustomerRegisterResponse": - url = d.get("url") - token = d.get("token") - - return CustomerRegisterResponse( - url=url, - token=token, - ) - - -@dataclass -class CustomerRegisterStatusResponse: - """Objeto respuesta""" - - creditCardType: str = "" - customerId: str = "" - last4CardDigits: str = "" - status: int = 0 - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CustomerRegisterStatusResponse": - creditCardType = d.get("creditCardType") - customerId = d.get("customerId") - last4CardDigits = d.get("last4CardDigits") - status = d.get("status") - - return CustomerRegisterStatusResponse( - creditCardType=creditCardType, - customerId=customerId, - last4CardDigits=last4CardDigits, - status=status, - ) - - -@dataclass -class CustomerChargeRequest: - """Objeto para generar una URL de pago""" - - amount: float = 0 - apiKey: str = "API_KEY" - commerceOrder: str = "" - currency: Optional[str] = None - optionals: Optional[str] = None - subject: str = "" - s: str = "" - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CustomerChargeRequest": - amount = d.get("amount") - apiKey = d.get("apiKey") - commerceOrder = d.get("commerceOrder") - currency = d.get("currency") - optionals = d.get("optionals") - subject = d.get("subject") - s = d.get("s") - - return CustomerChargeRequest( - amount=amount, - apiKey=apiKey, - commerceOrder=commerceOrder, - currency=currency, - optionals=optionals, - subject=subject, - s=s, - ) - - -@dataclass -class CollectResponse: - """Objeto para CollectResponse""" - - commerce_order: Optional[str] = None - flow_order: Optional[float] = None - paymen_result: Optional[PaymentStatus] = None - status: Optional[int] = None - token: Optional[str] = None - type: Optional[float] = None - url: Optional[str] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CollectResponse": - type = d.get("type") - commerce_order = d.get("commerceOrder") - flow_order = d.get("flowOrder") - url = d.get("url") - token = d.get("token") - status = d.get("status") - paymen_result = None - if d.get("paymenResult") is not None: - paymen_result = PaymentStatus.from_dict(cast(Dict[str, Any], d.get("paymenResult"))) - - return CollectResponse( - type=type, - commerce_order=commerce_order, - flow_order=flow_order, - url=url, - token=token, - status=status, - paymen_result=paymen_result, - ) - - -@dataclass -class CollectRequest: - """Objeto para generar un correo electronico de pago""" - - amount: float = 0 - apiKey: str = "API_KEY" - byEmail: Optional[int] = None - commerceOrder: str = "" - currency: Optional[str] = None - customerId: str = "" - forward_days_after: Optional[int] = None - forward_times: Optional[int] = None - ignore_auto_charging: Optional[int] = None - merchantId: Optional[str] = None - optionals: Optional[str] = None - paymentMethod: Optional[int] = 9 - subject: Optional[str] = None - timeout: Optional[int] = None - urlConfirmation: str = "" - urlReturn: str = "" - s: str = "" - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CollectRequest": - amount = d.get("amount") - apiKey = d.get("apiKey") - byEmail = d.get("byEmail") - commerceOrder = d.get("commerceOrder") - currency = d.get("currency") - forward_days_after = d.get("forward_days_after") - forward_times = d.get("forward_times") - ignore_auto_charging = d.get("ignore_auto_charging") - merchantId = d.get("merchantId") - optionals = d.get("optionals") - subject = d.get("subject") - timeout = d.get("timeout") - urlConfirmation = d.get("urlConfirmation") - urlReturn = d.get("urlReturn") - s = d.get("s") - - return CollectRequest( - amount=amount, - apiKey=apiKey, - byEmail=byEmail, - commerceOrder=commerceOrder, - currency=currency, - ignore_auto_charging=ignore_auto_charging, - forward_days_after=forward_days_after, - forward_times=forward_times, - merchantId=merchantId, - optionals=optionals, - subject=subject, - timeout=timeout, - urlConfirmation=urlConfirmation, - urlReturn=urlReturn, - s=s, - ) - - -@dataclass -class CollectObject: - """Objeto de cobro para un lote de cobros""" - - customer_id: str - commerce_order: str - subject: str - amount: float - currency: Optional[str] = None - payment_method: Optional[float] = None - optional: Optional[str] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "CollectObject": - customer_id = d.get("customerId") - commerce_order = d.get("commerceOrder") - subject = d.get("subject") - amount = d.get("amount") - currency = d.get("currency") - payment_method = d.get("paymentMethod") - optional = d.get("optional") - - return CollectObject( - customer_id=customer_id, - commerce_order=commerce_order, - subject=subject, - amount=amount, - currency=currency, - payment_method=payment_method, - optional=optional, - ) - - -@dataclass -class BatchCollectRequest: - apiKey: str = "API_KEY" - batchRows: str = "" - byEmail: int = 0 - forward_days_after: Optional[int] = None - forward_times: Optional[int] = None - timeout: Optional[int] = None - urlCallBack: str = "" - urlConfirmation: str = "" - urlReturn: str = "" - s: str = "" - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "BatchCollectRequest": - apiKey = d.get("apiKey") - batchRows = d.get("batchRows") - byEmail = d.get("byEmail") - forward_days_after = d.get("forward_days_after") - forward_times = d.get("forward_times") - timeout = d.get("timeout") - urlCallBack = d.get("urlCallBack") - urlConfirmation = d.get("urlConfirmation") - urlReturn = d.get("urlReturn") - s = d.get("s") - - return BatchCollectRequest( - apiKey=apiKey, - batchRows=batchRows, - byEmail=byEmail, - forward_days_after=forward_days_after, - forward_times=forward_times, - timeout=timeout, - urlCallBack=urlCallBack, - urlConfirmation=urlConfirmation, - urlReturn=urlReturn, - s=s, - ) - - -@dataclass -class BatchCollectRejectedRow: - customerId: Optional[str] = None - commerceOrder: Optional[str] = None - rowNumber: Optional[int] = None - parameter: Optional[str] = None - errorCode: Optional[int] = None - errorMsg: Optional[str] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "BatchCollectRejectedRow": - customerId = d.get("customerId") - commerceOrder = d.get("commerceOrder") - rowNumber = d.get("rowNumber") - parameter = d.get("parameter") - errorCode = d.get("errorCode") - errorMsg = d.get("errorMsg") - - return BatchCollectRejectedRow( - customerId=customerId, - commerceOrder=commerceOrder, - rowNumber=rowNumber, - parameter=parameter, - errorCode=errorCode, - errorMsg=errorMsg, - ) - - -@dataclass -class BatchCollectResponse: - token: Optional[str] = None - receivedRows: Optional[int] = None - acceptedRows: Optional[int] = None - rejectedRows: Optional[List[BatchCollectRejectedRow]] = None - - @staticmethod - def from_dict(d: Dict[str, Any]) -> "BatchCollectResponse": - token = d.get("token") - receivedRows = d.get("receivedRows") - acceptedRows = d.get("acceptedRows") - rejectedRows = [] - for rejected_row in d.get("rejectedRows") or []: - rejected_row_item = BatchCollectRejectedRow.from_dict(rejected_row) - - rejectedRows.append(rejected_row_item) - - return BatchCollectResponse( - token=token, - receivedRows=receivedRows, - acceptedRows=acceptedRows, - rejectedRows=rejectedRows, - ) diff --git a/pyflowcl/openapi3.py b/pyflowcl/openapi3.py index 43f6ef0..17155b6 100644 --- a/pyflowcl/openapi3.py +++ b/pyflowcl/openapi3.py @@ -3,6 +3,7 @@ from functools import lru_cache from pathlib import Path from typing import Any, Union +from warnings import warn import fsutil import yaml @@ -20,6 +21,13 @@ class FlowAPI: _openapi3: Union[None, OpenAPI] = field(init=False) def __post_init__(self): + warn( + """ + Lamentablemente el proyecto OpenAPI3 que era la base de este proyecto ha sido + abandonado por su mantenedor, he decidio deprecar esta version y volver a la clase + estable de este proyecto. Por favor mira la documentacion sobre como proseguir. + """ + ) if not self.api_key: self.api_key = os.getenv("PYFLOWCL_API_KEY", None) if not self.api_secret: diff --git a/pyflowcl/utils.py b/pyflowcl/utils.py index a27b601..730a788 100644 --- a/pyflowcl/utils.py +++ b/pyflowcl/utils.py @@ -1,32 +1,21 @@ -# pyflowcl/utils.py -""" -Utilidades para pyflow - -Este modulo contiene - -- `genera_firma()` - Funcion para generar hash de validacion -- `genera_parametros()` - Funcion para generar parametros a enviar - -""" import hashlib import hmac +from typing import Any from .exceptions import ParamsException -def genera_firma(params: dict = None, flow_secret: str = None) -> str: - """Crea el Hash de validacion +def firma_request(params: Any, secret: str) -> str: - Args: - params: Parametros para crear la firma - flow_secret: secretKey de Flow + print(f"{params = }") + string = "" + for k, d in params.iter(): + string = f"{string}{k}{d}" + hash_string = hmac.new(secret.encode(), string.encode(), hashlib.sha256).hexdigest() + return hash_string - Returns: - Hash de validacion - Raises: - ParamsException: Si `params` o `flow_key` no están definidos - """ +def genera_firma(params: dict = None, flow_secret: str = None) -> str: if not params or not flow_secret: raise ParamsException("Se necesita 'params' y 'flow_secret' para usar esta función") string = "" @@ -38,21 +27,6 @@ def genera_firma(params: dict = None, flow_secret: str = None) -> str: def genera_parametros(params: dict = None, flow_secret: str = None) -> dict: - """Normaliza y genera los parametros para las llamadas - - Este esta funcion verifica que los parametros se encuentren ordenados - alfabéticamente, para luego generar el hash de validacion - - Args: - params: Parametros para crear la firma - flow_secret: secretKey de Flow - - Returns: - `dict` ordenado alfabeticamente con `apiKey` y `s` incorporados - - Raises: - ParamsException: Si `params` o `flow_secret` no están definidos - """ if not params or not flow_secret or "apiKey" not in params: raise ParamsException("Se necesita 'params' y 'flow_secret' para usar esta función") diff --git a/pyflowcl/version.py b/pyflowcl/version.py index a955fda..4d13425 100644 --- a/pyflowcl/version.py +++ b/pyflowcl/version.py @@ -1 +1 @@ -__version__ = "1.2.1" +__version__ = "2024.9.23" diff --git a/pyproject.toml b/pyproject.toml index 964d628..64d99ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,8 @@ [tool.poetry] name = "pyflowcl" -version = "1.2.2" +version = "2024.9.23" description = "Cliente para comunicacion con flowAPI-3 de flow.cl" -authors = [ - "Mario Hernandez " -] +authors = ["Mario Hernandez "] license = "MIT" readme = "README.md" repository = "https://github.com/mariofix/pyflowcl" @@ -25,68 +23,63 @@ keywords = [ "mastercard", "transbank", ] -classifiers=[ - "Development Status :: 4 - Beta", +classifiers = [ + "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules", ] -packages = [ - {include = "pyflowcl"} -] +packages = [{ include = "pyflowcl" }] [tool.poetry.dependencies] -python = "^3.8.5" -certifi = "*" -requests = "*" -openapi3 = "^1.8.1" -python-fsutil = "*" +python = "^3.9" +certifi = "^2024.8.30" +requests = { version = "^2.32.3", extras = ["security"] } +typer = { version = "^0.12.5", extras = ["all"] } +pydantic = "^2.9.2" + +# para deprecar python-slugify = "*" +python-fsutil = "*" +openapi3 = "^1.8.1" pyyaml = "^6.0" -typer = {extras = ["all"], version = "^0.9.0"} + [tool.poetry.scripts] flow-cli = "pyflowcl.cli:app" [tool.poetry.group.dev] -optional = true +optional = false [tool.poetry.group.dev.dependencies] -pytest = "^7.4.0" -coverage = "^7.2.7" -black = "^23.7.0" -mkdocs = {version = "^1.4.3", extras = ["i18n"]} -mkdocs-material = "^9.1.19" -mkdocstrings = {version = ">=0.22,<0.25", extras = ["python"]} -mkdocs-git-authors-plugin = "^0.7.2" -pre-commit = "^3.3.3" -mkdocs-markdownextradata-plugin = "^0.2.5" +pytest = "^8.3.3" +coverage = "^7.6.1" +black = "^24.8.0" +pre-commit = "^3.8.0" +datamodel-code-generator = "^0.26.0" +mkdocs-material = "^9.5.35" +mkdocstrings = { version = "^0.26.1", extras = ["python"] } mdx-include = "^1.4.2" -pillow = "^10.0.0" -cairosvg = "^2.7.0" +rich = "^13.8.1" [tool.pytest.ini_options] minversion = "6.0" addopts = "-ra" -testpaths = [ - "tests", -] -python_files =[ - "test*.py" -] +testpaths = ["tests"] +python_files = ["test*.py"] [tool.black] line-length = 119 -target-version = ['py38'] +target-version = ['py39'] [tool.isort] profile = "black" multi_line_output = 3 -py_version = 38 +py_version = 39 [build-system] requires = ["poetry-core"]