Boton de pago
Cajita de pagos | RecomendadoBotón de pago por redirecciónTokenizaciónSplit de Pagos
Plugins
WoocommercePrestashop
APIs
Links de PagoAPI SalePagos MasivosWebViewNotificación ExternaAPI UserConsulta por LotesPre-registro de comerciosCatálogo de Errores
Soporte
visita payphone.app
  • 🔹📎 ¿Cómo funciona el cobro por app?

  • 🔹🔑 Configuración del ambiente

  • 🔹🛠️ Implementación del Api

  • 🔹🧾 Consultar respuesta de transacción

  • 🔹🎞️ Video Tutorial

  • 🔹↩️ Cancelación y Reverso

  • 🔹🔰 Pruebas y paso a producción

Cobro a través de la app Payphone
API Sale

📎¿Cómo funciona el cobro mediante API Sale Payphone?

Imagina poder cobrar a tus clientes directamente desde tu aplicación o sitio web, ¡y que ellos puedan pagar con sus métodos favoritos dentro de Payphone! La API Sale de Payphone te permite hacer precisamente eso de una manera eficiente y segura. Olvídate de procesos engorrosos, con nuestra API, la experiencia de pago de tus clientes será fluida y rápida.

🚀¿Cómo Funciona?

La API Sale permite generar una solicitud de cobro que se procesa exclusivamente dentro de la app Payphone Personal del cliente. El usuario puede confirmar y pagar la transacción usando su método preferido.

  • Tarjetas de crédito y débito : Visa y Mastercard (sin importar dónde te encuentres).
  • Gift Cards: Tarjetas de regalo precargadas.
  • Saldo disponible: Saldo presente en la cuenta de Payphone del cliente.

🔧Arquitectura Inteligente: API REST

Nuestra API Sale se basa en la arquitectura REST, lo que significa que utiliza estándares web conocidos y fáciles de entender. Principalmente, trabajamos con dos tipos de solicitudes HTTP:

  • POST: Para enviar la información del cobro en formato JSON (un formato de datos ligero y fácil de leer por máquinas y humanos).
  • GET: Para preguntar sobre el estado de una transacción específica que ya enviaste. La respuesta también viene en formato JSON, indicándote el estado ("Pendiente", "Aprobado", "Rechazado").

🔄 Flujo de Implementación

Aquí te mostramos los pasos clave para empezar a recibir pagos con la API Sale:

  1. Solicitud de Cobro (Vía POST): Tu aplicación o servidor envía una solicitud POST a la URL de la API de Payphone con todos los detalles necesarios de la transacción.
  2. Notificación al Cliente (Automática por Payphone): Payphone se encarga de notificar al cliente en su aplicación. ¡Tú no tienes que hacer nada aquí!
  3. ✅ Pago del Cliente (En la App Payphone): El cliente selecciona su método de pago y confirma la transacción dentro de la app de Payphone.
  4. Consulta del Estado (Vía GET): Tu aplicación o servidor realiza una solicitud GET a la URL de la API de Payphone, proporcionando el ID de la transacción, para conocer su estado actual.

📌 Consideraciones

  • ⚠️Límite de Consultas: Para mantener la estabilidad del servicio, el endpoint GET para consultar el estado de las transacciones tiene un límite de 30 llamadas por minuto. ¡Optimiza tus consultas!
  • ⚙️Entorno de Desarrollo: ¡Fundamental! Configura un entorno de pruebas adecuado antes de lanzarte a producción. Esto te permitirá experimentar sin afectar a tus clientes reales.
  • 🛡️Manejo de Errores Robusto: Implementa un sistema inteligente para detectar y gestionar errores que puedan ocurrir durante la comunicación con la API. Muestra mensajes claros a tus usuarios para que sepan qué está pasando.
  • 🔒Seguridad Ante Todo: Asegúrate de que todas las comunicaciones con la API se realicen a través de HTTPS.
  • 🧪¡Prueba, Prueba y Vuelve a Probar!: Realiza pruebas exhaustivas en tu entorno de desarrollo para garantizar que la integración funcione a la perfección antes de pasar a producción. ¡Esto te ahorrará muchos dolores de cabeza!
  • 🏢Cuenta en Payphone Business Activa: Necesitas una cuenta en Payphone Business. ¡Regístrate si aún no lo has hecho!
  • 👨💻Usuario con Rol de Desarrollador: Dentro de tu cuenta, crea un usuario con el rol de "Desarrollador". Él será quien gestione la configuración técnica.
  • 🔑Obtención de Credenciales: Accede a la plataforma para desarrolladores de Payphone. Crea una nueva configuración de aplicación. Esto te permitirá generar las credenciales específicas para tu integración. TOKEN de autenticación (Bearer Token), STOREID asociado a tu comercio.

🔑Configuración del Ambiente y Obtención de Credenciales

¡Prepara tu plataforma para recibir pagos de forma segura, fácil y eficiente con Payphone! 🛒💳 Sigue estos pasos y empieza a procesar transacciones en minutos:

🚀 Lo primero es configurar tu ambiente

Para que Payphone funcione correctamente, necesitas establecer una conexión segura entre tu sistema y nuestra plataforma.

Esto incluye obtener dos credenciales clave:

Token y StoreID


🛠️ ¿Cómo hacerlo?

  1. Configura tu API. Desde tu cuenta de Payphone Developer asegúrate de haber creado una aplicación de tipo: "API"
  2. Obtén tus credenciales. Estos datos son esenciales para autenticarte con Payphone. Encuéntralos al configurar tu aplicación.
  3. Establece tu entorno de desarrollo y pruebas. Esto te permitirá realizar simulaciones antes de pasar a la producción.

🎯 ¿Por qué es importante?

  1. Seguridad: Tus transacciones estarán encriptadas y protegidas contra accesos no autorizados.
  2. Personalización: Adapta los métodos de pago según las necesidades de tu negocio.
  3. Funcionalidad: Garantiza que los pagos se procesen correctamente.


✨ ¡Comienza ahora!

Haz clic en el siguiente botón, sigue las instrucciones para obtener tus credenciales:


📑 Configuración de Ambiente y Obtención de Credenciales


⚠️NOTA:

👉 Sin esta configuración, no podrás procesar pagos a través de nuestra plataforma.

🛠️Guía de Integración: API Sale

🧩POST API Sale

Para cobrar a través de la aplicación de Payphone, usa API SALE, que te permite solicitar el pago y verificar el estado de la transacción.

🔗URL de la solicitud POST

https://pay.payphonetodoesposible.com/api/Sale

📦 Estructura del Cuerpo de la Solicitud:

El cuerpo de la solicitud debe ser un objeto JSON con la siguiente estructura:

{
    "phoneNumber": "0984111222", 
    "countryCode": "593",
    "amount": 315,
    "amountWithoutTax": 200,
    "amountWithTax": 100,
    "tax": 15, 
    "service": 0,
    "tip": 0,
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",    
    "reference": "Motivo de cobro con Sale", 
    "storeId": "your_storeId",
    "currency": "USD",  
    "timeZone": -5, 
    "lat": "-1.831239",    
    "lng": "-78.183406",    
    "clientUserId": "idUserClient.001", 
    "optionalParameter1": "Informacion Adicional 1", 
    "optionalParameter2": "Informacion Adicional 2", 
    "optionalParameter3": "Informacion Adicional 3", 
    "responseUrl": "https://your_domain.com/webhook/resultParameters",    
    //URL de respuesta donde nuestro servidor adjunta 2 parametros id y clientTransactionID
    "order": {
        "billTo": { //datos de facturacion
            "billToId": 12,
            "address1": "Colorado Springs",
            "address2": "Denver",
            "country": "EC",
            "state": "Azuay",
            "locality": "Cuenca",
            "firstName": "Elisabeth",
            "lastName": "Sobeck",
            "phoneNumber": "+593999999999",
            "email": "aloy@mail.com",
            "postalCode": "EC090108",
            "customerId": "idUserClient.001",
            "ipAddress": "127.0.0.1"
        },
        "lineItems": [  //datos de productos o servicios
            {
                "productName": "Producto Vendido",
                "unitPrice": 100,
                "quantity": 1,
                "totalAmount": 115,
                "taxAmount": 15,
                "productSKU": "3342.0004",
                "productDescription": "Descripción Producto"              
            }
        ]
    }
}

Este JSON completo describe un cobro mixto: 1 USD con impuesto del 15% y 2 USD sin impuesto.

🔐 Es fundamental incluir las siguientes cabeceras en la solicitud:

  • Authorization: bearer TU_TOKEN (Token de autenticación de la aplicación, precedido por la palabra "Bearer").
  • Content-type: application/json (Formato de los datos: JSON).

📌 Importante:


📟 Cálculo del monto total (amount)

El campo amount debe ser la suma de todos los valores monetarios

amount = amountWithoutTax + amountWithTax  + tax + service + tip

Aunque los campos individuales son opcionales, debe haber al menos uno presente que respalde el valor total amount


💵 Valores monetarios en centavos:

Todos los montos deben expresarse como enteros. Multiplica el valor en dólares por 100:


💵 Valor en USD 🪙 Valor en centavos
$ 1.00 100
$ 1.50 150
$ 10.00 1000
$ 12.68 1268



Ejemplos de solicitudes mínimas

A continuación, se muestran ejemplos de objetos JSON con los campos mínimos para diferentes tipos de cobro:

Montos Con Impuestos
Montos Sin Impuestos
Montos Mixtos

Este objeto JSON define el cobro de $1 con un impuesto del 15%.

{    
    "phoneNumber": "0984111222", 
    "countryCode": "593",
    "amount": 115,
    "amountWithTax": 100,
    "tax": 15, 
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",    
    "reference": "Motivo de cobro con Sale", 
    "storeId": "your_storeId",
    "currency": "USD"  
}

El objeto JSON define el cobro de $2 sin impuesto.

{    
    "phoneNumber": "0984111222", 
    "countryCode": "593",
    "amount": 200,
    "amountWithoutTax": 200,
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",      
    "reference": "Motivo de cobro con Sale", 
    "storeId": "your_storeId",
    "currency": "USD"  
}

Este objeto JSON define el cobro de $3.15, divididos en $1 con un impuesto del 15% y $2 sin impuesto.

{    
    "phoneNumber": "0984111222", 
    "countryCode": "593",
    "amount": 315,
    "amountWithoutTax": 200,
    "amountWithTax": 100,
    "tax": 15, 
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",   
    "reference": "Motivo de cobro con Sale",
    "storeId": "your_storeId",
    "currency": "USD"  
}

Esta estructura permite una flexibilidad completa para manejar transacciones con impuestos, sin impuestos o mixtas, adaptándose a las necesidades del comercio.

📋Descripción de parámetros en la petición

A continuación se detallan los parámetros que puedes utilizar en una transacción, incluyendo los montos a cobrar, la moneda, los datos del cliente y otros campos opcionales que puedes incluir en la solicitud

    Nombre

    Descripción

    Tipo de Dato

    Opcional

    phoneNumber

    Número de teléfono registrado en Payphone (ej: 0984111222)

    String

    ❌ No

    countryCode

    Código de país estándar E.164 (ej: 593)

    String

    ❌ No

    amount

    Valor total a cobrar. Debe ser igual a la suma de todos los montos individuales

    Int

    ❌ No

    amountWithoutTax

    Monto que no está sujeto a impuestos.

    Int

    ❌ No

    amountWithTax

    Monto que incluye el valor sujeto a impuestos, excluyendo el propio impuesto.

    Int

    ✅ Sí

    tax

    Monto del impuesto aplicado a la transacción.

    Int

    ✅ Sí

    service

    Monto asociado al servicio proporcionado.

    Int

    ✅ Sí

    tip

    Monto de la propina otorgada por el cliente.

    Int

    ✅ Sí

    currency

    Código de moneda ISO 4217. (ej:USD)

    String

    ❌ No

    clientTransactionId

    Identificador único asignado a la transacción para su seguimiento.

    String

    ❌ No

    storeId

    Identificador de la sucursal que efectúa el cobro (se obtiene en Payphone Developer).

    String

    ✅ Sí

    reference

    Motivo o referencia específica del pago.

    String

    ✅ Sí

    responseUrl

    Url de respuesta donde nuestro servidor envía dos parámetros: id, clientTransactionID

    String

    ✅ Sí

    timeZone

    Zona horaria, (ej: -5)

    Int

    ✅ Sí

    lat

    latitud en formato decimal: -1.831239

    String

    ✅ Sí

    lng

    longitud en formato decimal: -78.183406

    String

    ✅ Sí

    optionalParameter1

    Información adicional para la transacción.

    String

    ✅ Sí

    optionalParameter2

    Información adicional para la transacción.

    String

    ✅ Sí

    optionalParameter3

    Información adicional para la transacción.

    String

    ✅ Sí

    clientUserId

    Identificador del cliente otorgada por el comercio

    String

    ✅ Sí

    order

    Arreglos con datos de facturación y detalle de artículos o servicios.

    Array

    ✅ Sí

    🛑 Advertencia:


    Campos obligatorios: Aunque muchos de los campos son opcionales, algunos parámetros como phoneNumber, countryCode, amount, currency y clientTransactionId son necesarios para procesar una transacción correctamente.


    Formato de datos: Asegúrate de seguir el formato de datos especificado para cada campo.

    📋 Desglose del campo order

    El campo order se divide en dos arreglos principales: BillTo y LineItems‍

    🧾BillTo (Datos de facturación):

    El campo billTo es un arreglo que contiene la información de facturación asociada a la transacción.

    Nombre

    Descripción

    Tipo de Dato

    billToId

    Identificador para los datos de facturación (Opcional)

    Int

    address1

    Dirección de facturación 1

    String

    address2

    Dirección de facturación 2

    String

    country

    El código de país según la norma ISO 3166-1 alfa-2.
    (EJ: EC)

    String

    state

    Nombre de Provincia

    String

    locality

     Nombre de Ciudad

    String

    firstName

    Nombre del cliente.

    String

    lastName

    Apellido del cliente.

    String

    phoneNumber

    Número de teléfono del titular; se solicitará si no se proporciona.
    Formato: Símbolo(+) + Código País + numero telefónico.
    Ej. +593984111222

    String

    email

    Correo electrónico del cliente.

    String

    postalCode

    Código Postal: dirección numérica de un lugar específico.

    String

    customerId

    Identificador del cliente otorgada por el comercio

    String

    ipAddress

    Dirección IP del dispositivo

    String


    📦 LineItems (Detalle del pedido):

    El campo lineItems es un conjunto de arreglos que contiene la información de los servicios o productos entregados

    Nombre

    Descripción

    Tipo de Dato

    productName

    Nombre del producto o servicio

    Array

    unitPrice

    Precio Unitario

    Int

    quantity

    Cantidad vendida

    Int

    totalAmount

    Total a pagar por este servicio

    Int

    taxAmount

    Impuesto a pagar

    Int

    productSKU

    Identificador del producto o servicio

    Int

    productDescription

    Descripcion corta del producto

    String

    🧱 Ejemplos de solicitud POST a API Sale

    A continuación, se presenta varios ejemplos de cómo realizar solicitudes POST:

    PHP
    JQUERY
    FETCH
    <?php 
        date_default_timezone_set('America/Guayaquil');
    
        //Funcion q ejecuta una solicitud http POST
        function curlPost($urlAPI, $headers,$body) {
            //Iniciar solicitud curl: POST 
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $urlAPI);
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $body);    
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $curl_response = curl_exec($curl);
            //Finaliza solicitud curl: POST
            curl_close($curl);
            //Respuesta en formato JSON
            return json_decode($curl_response);
        }
    
        /*## Credenciales como variables para la solicitud ##*/
        $token="your_token";
        $storeId="your_storeId";
        //Datos de usuario de Payphone Personal
        $phoneNumber = "0984111222";
        $countryCode = "593";     
        //Dato Unico por transaccion 
        $clientTransactionID = substr((date("ymd-Hi-s").gettimeofday()["usec"]),0, 15);
    
        /*## Preparar informacion para la solicitud POST ##*/
        //URL del servicio payphone
        $url="https://pay.payphonetodoesposible.com/api/Sale";
        //Cabecera para la solicitud
        $headers[] = 'Authorization: Bearer '.$token ;//CREDENCIALES DE CONFIGURACION
        $headers[] = 'Content-Type: application/json' ;//TIPO DE APLICACION 
    
        //Preparar objeto JSON para solicitud
        $data = array(
            "phoneNumber"=> $phoneNumber, 
            "countryCode"=> $countryCode,
            "amount" => 315,
            "amountWithoutTax" => 200,
            "amountWithTax" => 100,
            "tax" => 15,
            "storeId" => $storeId,
            "clientTransactionId" => $clientTransactionID,
            "currency" => "USD",
            "reference" => "Pago con API Sale"
        );
        $bodyJSON = json_encode($data);
    
        //realizar solicitud http POST
        $result=curlPost($url, $headers,$bodyJSON);
    
        //Mostrar Resultado en Pantalla
        echo "<h1>Prueba de API Sale</h1> <br>";
        echo "POST: <pre>".$url."</pre>";  
        echo "Cuerpo Solicitud : <pre>".json_encode($data,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";    
        echo "Respuesta : <pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
    
        
    ?>
    
    <html lang="es">
        <head>
            <meta charset="utf-8">
            <title>Solicitud POST con jQuery</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> 
        </head>    
        <body>
            <h1>Solicitud POST con jQuery</h1>
            <a>POST: <strong id="url"></strong></a><br><br>
            <a><strong>Cuerpo: </strong></a><pre id="bodyJSON"></pre>
            <a><strong>Respuesta : </strong></a><pre id="result"></pre>    
    
            <script>
                //Credenciales de autorizacion
                const token = "your_token";
                const storeId="your_storeId";
                //Datos de usuario de Payphone Personal
                const phoneNumber = "0984112233";
                const countryCode = "593"; 
                //Dato Unico por transaccion 
                const clientTransactionID = Date.now();
                /*## Preparar informacion para la solicitud POST ##*/
                //URL del servicio payphone
                const urlAPI="https://pay.payphonetodoesposible.com/api/Sale";
    
                const headersAPI= {
                    "Content-Type": "application/json",
                    "Authorization": "Bearer "+token
                };
    
                const bodyJSON={
                    "phoneNumber": phoneNumber, 
                    "countryCode": countryCode,
                    "amount" : 315,
                    "amountWithoutTax" : 200,
                    "amountWithTax" : 100,
                    "tax" : 15,
                    "storeId" : storeId,
                    "clientTransactionId" : clientTransactionID,
                    "currency" : "USD",
                    "reference" : "Pago con API Sale"
                };
    
                /*## Mostrar Datos en Pantalla ##*/                       
                document.getElementById("url").innerHTML=urlAPI; 
                document.getElementById("bodyJSON").innerHTML=JSON.stringify(bodyJSON, null, 2); 
    
                /*## Solicitud POST con jQuery ##*/ 
                $(document).ready(function() {
                    $.ajax({
                        url: urlAPI,
                        type: "POST",
                        headers: headersAPI,
                        data: JSON.stringify(bodyJSON),
                        success: function(response) {
                            $("#result").html(
                                "<pre>" + JSON.stringify(response, null, 2) + "</pre>"
                            );
                        },
                        error: function(error) {
                            $("#result").html(
                                "Error en la solicitud : <pre>" + JSON.stringify(error, null, 2) + "</pre>"
                            );
                        }
                    });
                });
            </script>    
        </body>
    </html>
    <html lang="es">
        <head>
            <meta charset="utf-8">
            <title>Solicitud POST con Fetch</title>
        </head>    
        <body>
            <h1>Solicitud POST con Fetch</h1>
            <a>POST: <strong id="url"></strong></a><br><br>
            <a><strong>Cuerpo: </strong></a><pre id="bodyJSON"></pre>
            <a><strong>Respuesta : </strong></a>    
    
            <script>
                //Credenciales de autorizacion
                const token = "your_token";
                const storeId="your_storeId";
                //Datos de usuario de Payphone Personal
                const phoneNumber = "0984112233";
                const countryCode = "593"; 
                //Dato Unico por transaccion 
                const clientTransactionID = Date.now();
                /*## Preparar informacion para la solicitud POST ##*/
                //URL del servicio payphone
                const urlAPI="https://pay.payphonetodoesposible.com/api/Sale";
    
                const headersAPI= {
                    "Content-Type": "application/json",
                    "Authorization": "Bearer "+token
                };
    
                const bodyJSON={
                    "phoneNumber": phoneNumber, 
                    "countryCode": countryCode,
                    "amount" : 315,
                    "amountWithoutTax" : 200,
                    "amountWithTax" : 100,
                    "tax" : 15,
                    "storeId" : storeId,
                    "clientTransactionId" : clientTransactionID,
                    "currency" : "USD",
                    "reference" : "Pago con API Sale"
                };
    
                /*## Mostrar Datos en Pantalla ##*/                       
                document.getElementById("url").innerHTML=urlAPI; 
                document.getElementById("bodyJSON").innerHTML=JSON.stringify(bodyJSON, null, 2); 
    
                /*## Solicitud POST con Fetch ##*/ 
                fetch(urlAPI, {
                    method: "POST",
                    headers: headersAPI,
                    body: JSON.stringify(bodyJSON)
                })
                .then((res) => res.json())
                .catch((error) => {                           
                    const container = document.createElement("div");
                    const jsonResult = document.createElement("pre");    
    
                    jsonResult.textContent = JSON.stringify(error, null, 2);
                    container.appendChild(jsonResult);
                    document.body.appendChild(container);
                })
                .then((data) => {
                    const container = document.createElement("div");
                    const jsonResult = document.createElement("pre");
    
                    jsonResult.textContent = JSON.stringify(data, null, 2);
                    container.appendChild(jsonResult);
                    document.body.appendChild(container);
                });
            </script>    
        </body>
    </html>

    📬Respuesta a la solicitud POST

    Al realizar la solicitud POST, recibirás una respuesta en formato JSON con la siguiente estructura:

    ✅ Respuesta exitosa

    {
        "transactionId": 45441137
    }

    En caso de éxito, la respuesta incluirá el campo transactionId, que es un identificador único para la transacción. Este identificador te permitirá consultar el estado de la transacción, el cual puede ser uno de los siguientes: Pendiente, Aceptado o Cancelado.

    ❌ Respuesta a error en la solicitud POST

    Si la transacción no se puede crear, recibirás una respuesta de error con la siguiente estructura:

    1{
    2    "message": "La transacción no pudo ser creada por favor inténtelo de nuevo",
    3    "errorCode": 22,
    4    "errors": [
    5        {
    6            "message": "El cliente tiene transacciones pendientes con su local",
    7            "errorCode": 2061
    8        }
    9    ]
    10}

    Al manejar errores, muestra al usuario el mensaje específico contenido en el arreglo errors, en lugar del mensaje general. Por ejemplo, deberías mostrar "El cliente tiene transacciones pendientes con su local" en lugar de "La transacción no pudo ser creada por favor inténtelo de nuevo".

    🔔 Notificación en la aplicación de Payphone del usuario

    Después de enviar la solicitud POST, el proceso para el usuario de Payphone continúa de la siguiente manera:

    • El usuario de Payphone recibe una notificación push en su aplicación móvil.
    • La notificación contiene los detalles de la transacción, incluyendo el monto a pagar y el comercio solicitante.
    • Al abrir la notificación, el usuario puede seleccionar su método de pago preferido.
    • Para confirmar el pago, el usuario debe autenticarse utilizando uno de los métodos biométricos o de seguridad (Huella dactilar, Reconocimiento facial o Contraseña)

    📌 Consideraciones

    La solicitud de pago desde la aplicación Payphone tiene una ventana de tiempo de 5 minutos para completarse. Si transcurre este tiempo, la solicitud expirará y la transacción será cancelada

    🌐 Uso del campo responseUrl (Webhook)

    Si configuras el campo responseUrl en la solicitud inicial, nuestro servidor enviará una respuesta a esa URL con dos parámetros:

    • id: Identificador de la transacción
    • clientTransactionID: Identificador de la transacción proporcionado por el comercio

    Esta respuesta solo se enviará en dos casos de acción:

    • Cuando el usuario aprueba el pago
    • Cuando el usuario rechaza el pago

    Es importante que tu servidor esté preparado para recibir y procesar esta respuesta en la URL especificada.

    🧾Consultar respuesta de transacción

    Una vez iniciada una transacción, es crucial poder verificar su estado. Este documento detalla el proceso de consulta de transacciones en Payphone, utilizando tanto el transactionId como el clientTransactionId.

    Existen dos métodos para consultar el estado de una transacción:

    • Consultar por transactionId. api/Sale/{transactionId}
    • Consultar por clientTransactionId. api/Sale/client/{clientTransactionId}

    A continuación se detalla los dos métodos de consulta:

    🔑 Consultar por el ID de Transacción de Payphone (transactionId):

    Payphone asigna un ID único a cada transacción. Si tienes este ID, puedes usarlo para consultar los detalles específicos de esa operación.

    Se debe realizar una solicitud GET a la siguiente URL incluyendo el identificador de transacción:

    https://pay.payphonetodoesposible.com/api/Sale/45441137 

    🏷️ Consultar por tu Propio ID de Transacción (clientTransactionId):

    Para facilitar el seguimiento desde tu sistema, puedes usar el ID único que tú generaste al iniciar la transacción.

    Se debe realizar una solicitud GET a la siguiente URL incluyendo el identificador otorgado por el comercio:

    https://pay.payphonetodoesposible.com/api/Sale/client/ID_UNICO_X_TRANSACCION-001 

    🔐 Es fundamental incluir las siguientes cabeceras en cada una de las solicitudes:

    • Authorization: bearer TU_TOKEN (Esta cabecera debe contener el token de autenticación de tu aplicación, precedido por la palabra “Bearer”. Este token es el mismo que utilizaste al preparar la transacción inicialmente).
    • Content-type: application/json (Formato de los datos: JSON).

    📬Respuesta satisfactoria de solicitud POST

    Si la solicitud es correcta, recibirás un objeto JSON con el detalle de la transacción. Los parámetros recibidos son:‍

    1{
    2    "email": "aloy@mail.com",
    3    "cardType": "Credit",
    4    "bin": "530219",
    5    "lastDigits": "XX17",
    6    "deferredCode": "00000000",
    7    "deferredMessage": "0 Meses sin Intereses",
    8    "deferred": false,
    9	"cardBrandCode": "51",
    10    "cardBrand": "Mastercard Produbanco/Promerica",
    11    "amount": 315,
    12    "clientTransactionId": "12345678.008",
    13    "phoneNumber": "593999999999",
    14    "statusCode": 3,
    15    "transactionStatus": "Approved",
    16    "authorizationCode": "W45441137",
    17    "message": null,
    18    "messageCode": 0,
    19    "transactionId": 45441137,
    20    "document": "1234567890",
    21    "currency": "USD",
    22    "optionalParameter1": "Informacion Adicional 1",
    23    "optionalParameter2": "Informacion Adicional 2",
    24    "optionalParameter3": "Informacion Adicional 3",
    25    "storeName": "Tienda Payphone",
    26    "date": "2025-01-28T11:28:23.833",
    27    "regionIso": "EC",
    28    "transactionType": "Store to Customer",
    29    "reference": "Motivo de cobro con Sale",
    30    "canBypassRedirection": true,
    31    "pan": ""
    32}

    📝Descripción de parámetros de respuesta

    La respuesta exitosa se recibe en formato JSON, conteniendo los siguientes campos:‍

    Nombre

    Descripción

    statusCode

    Código de estado de la transacción.
    2 = Cancelado
    3 = Aprobada

    transactionStatus

    Estado de la transacción (Approved o Canceled).

    clientTransactionId

    Identificador de transacción que enviaste en la petición.

    authorizationCode

    Código de autorización bancario.

    transactionId

    Identificador de transacción asignado por Payphone.

    email

    El correo electrónico registrado en el formulario para el pago.

    phoneNumber

    Número de teléfono registrado en el formulario para el pago.

    document

    Número de cédula registrado en el formulario para el pago.

    amount

    Monto total pagado.

    cardType

    Tipo de tarjeta utilizada (crédito o débito).

    cardBrandCode

    Código de la marca de la tarjeta.

    cardBrand

    Marca de la tarjeta.

    bin

    Primeros 6 dígitos de la tarjeta utilizada.

    lastDigits

    Últimos dígitos de la tarjeta utilizada.

    deferredCode

    Código de diferido empleado por el usuario.

    deferredMessage

    Mensaje del diferido.

    deferred

    Indica si se usó un diferido (booleano).

    message

    Mesaje de error, si corresponde

    messageCode

    Código de mensaje.

    currency

    Moneda utilizada para el pago.

    reference

    Motivo de la transacción

    optionalParameter3

    Parámetro opcional

    optionalParameter4

    Nombre del titular si el pago es con tarjeta

    storeName

    Nombre de la tienda que cobro

    date

    Fecha de cobro en formato ISO 8601

    regionIso

    Códigos de país en ISO 3166-1

    transactionType

    Tipo de Transacción


    🛑 Aviso:

    • Se recomienda implementar una rutina que consulte el estado de la transacción cada minuto para mantener actualizada la información en su plataforma.
    • Si se configuró el campo responseUrl, puede realizar la consulta con los parámetros recibidos para verificar si el pago fue aprobado o cancelado.

    El campo statusCode, define el codigo de estado de una transacción

    • statusCode: 1, La transacción está pendiente; aún no se ha tomado ninguna acción.
    • statusCode: 2, La transacción fue rechazada; no fue efectiva.
    • statusCode: 3, La transacción fue aprobada y el monto correspondiente se agregó a tu saldo.

    📬Respuesta con error de solicitud POST

    Si la solicitud contiene algún error, recibirás un objeto JSON con el detalle del error. Los parámetros recibidos son:‍

    1{
    2    "message": "Lo sentimos, este número no está registrado en Payphone",
    3    "errorCode": 120
    4}

    📤Ejemplo de Implementación API Sale de Consulta

    A continuación, se presenta varios ejemplos de cómo realizar solicitudes GET de consulta:‍

    PHP
    JQUERY
    FETCH
    <?php
        //Funcion q ejecuta una solicitud http GET
        function curlGet($urlAPI, $headers) {
            //Iniciar solicitud curl: GET 
            $curl = curl_init();        
            curl_setopt($curl, CURLOPT_URL, $urlAPI);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $curl_response = curl_exec($curl);
            //Finaliza solicitud curl: GET
            curl_close($curl);        
            //Respuesta en formato JSON
            return json_decode($curl_response);
        }
        
        /*## Credenciales como variables para la solicitud ##*/
        $token="your_token";
        
        /*## Preparar informacion de transaccion ##*/
        $id="52639407";
        /*## Preparar informacion para la solicitud GET ##*/
        //URL del servicio payphone
        $url="https://pay.payphonetodoesposible.com/api/Sale/".$id;
        //Cabecera para la solicitud
        $headers[] = "Authorization: Bearer ".$token ;//CREDENCIALES DE CONFIGURACION
        $headers[] = "Accept-language: es " ;
        
        //realizar solicitud http GET
        $result=curlGet($url, $headers);
    
        //Mostrar Resultado en Pantalla
        echo "<h1>Solicitud GET con PHP</h1>";    
        echo "<a>ID de transaccion: <strong>".$id."</strong></a><br><br>";         
        echo "<a>GET: <strong>".$url."</strong></a><br><br>"; 
        echo "Respuesta : <pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
    ?>
    <html lang="es">
        <head>
            <meta charset="utf-8">
            <title>Solicitud GET con jQuery</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>   
    
        </head>    
        <body>
            <h1>Solicitud GET con jQuery</h1>      
            <a>ID de transaccion: <strong id="id"></strong></a><br><br>  
            <a>GET: <strong id="url"></strong></a><br><br>
            <a><strong>Respuesta : </strong></a><pre id="result"></pre>
            <script>
                /*## Preparar credenciales como variables para la solicitud ##*/
                const token="your_token";
                /*## Preparar informacion del comercio ##*/
                const id="52639407";             
                /*## Cabecera para solicitud ##*/
                const  headersAPI = {
                    "Accept-language": "es",
                    "Authorization": "Bearer "+token                
                };
                //URL del servicio payphone
                const  urlAPI = "https://pay.payphonetodoesposible.com/api/Sale/"+id;
                /*## Mostrar Datos en Pantalla ##*/ 
                document.getElementById("id").innerHTML=id;
                document.getElementById("url").innerHTML=urlAPI;            
                /*## Solicitud GET con jQuery ##*/  
                $(document).ready(function() {
                    $.ajax({
                        url: urlAPI,
                        type: "GET",
                        headers: headersAPI,
                        success: function(response) {
                            $("#result").html(
                                "<pre>" + JSON.stringify(response, null, 2) + "</pre>"
                            );
                        },
                        error: function(error) {
                            $("#result").html(
                                "Error en la solicitud : <pre>" + JSON.stringify(error, null, 2) + "</pre>"
                            );
                        }
                    });
                });
            </script>
        
        </body>
    </html>
    <html lang="es">
        <head>
            <meta charset="utf-8">
            <title>Solicitud GET con Fetch</title> 
        </head>    
        <body>
            <h1>Solicitud GET con Fetch</h1>      
            <a>ID de transaccion: <strong id="id"></strong></a><br><br>  
            <a>GET: <strong id="url"></strong></a><br><br>
            <a><strong>Respuesta : </strong></a>
            <script>
                /*## Preparar credenciales como variables para la solicitud ##*/
                const token="your_token";
                /*## Preparar informacion del comercio ##*/
                const id="52639407";             
                /*## Cabecera para solicitud ##*/
                const  headersAPI = {
                    "Accept-language": "es",
                    "Authorization": "Bearer "+token                
                };
                //URL del servicio payphone
                const  urlAPI = "https://pay.payphonetodoesposible.com/api/Sale/"+id;
                /*## Mostrar Datos en Pantalla ##*/ 
                document.getElementById("id").innerHTML=id;
                document.getElementById("url").innerHTML=urlAPI; 
                /*## Solicitud GET con fetch ##*/  
                fetch(urlAPI, {
                    method: "GET",
                    headers: headersAPI
                })
                .then((res) => res.json())
                .catch((error) => {                           
                    const container = document.createElement("div");
                    const jsonResult = document.createElement("pre");    
    
                    jsonResult.textContent = JSON.stringify(error, null, 2);
                    container.appendChild(jsonResult);
                    document.body.appendChild(container);
                })
                .then((data) => {
                    const container = document.createElement("div");
                    const jsonResult = document.createElement("pre");
    
                    jsonResult.textContent = JSON.stringify(data, null, 2);
                    container.appendChild(jsonResult);
                    document.body.appendChild(container);
                });
            </script>
        </body>
    </html>

    ¡Y Listo! Con la petición y consulta tendrás implementado nuestro API Sale. Esto te permite ofrecer a tus usuarios transparencia y control en tiempo real sobre sus pagos.

    🎞️ Video Tutorial

    En el siguiente video puedes ver como integrar nuestro API

    📵Cancelación y Reverso de Transacciones

    🚫API Cancel

    A veces las cosas cambian, y necesitas detener un pago que ya iniciaste. La API de Cancelación de Payphone te da ese poder. Te permite revertir una solicitud de pago hecha a través de la API Sale, siempre y cuando se haga a tiempo.

    ¡Es como tener un botón de "deshacer" para tus cobros!

    Para gestionar la cancelación de solicitudes de pago es necesario contar con el transactionID o el clientTransactionID. Estos identificadores son cruciales para localizar y manipular la transacción específica.

    Casos de uso

    Imagina estas situaciones:

    • ❌ El cliente se arrepiente: Iniciaste el cobro, pero el cliente cambió de opinión antes de pagar.
    • ⚠️ Error en la orden: Hubo un problema con el pedido (artículo agotado, error en el precio), y necesitas detener el pago.
    • ⏱️ Sesión expirada: Por alguna razón, no se notificó el cobro a tiempo, y quieres liberar la solicitud.

    📓 Información detallada

    Para obtener una explicación detallada sobre el proceso de cancelación a través de la API consulte nuestra documentación.


    GUIA DE API CANCEL PAYPHONE


    ⚠️ Consideraciones

    Es crucial tener en cuenta la siguiente restricción para las cancelación de solicitudes:

    • 🔐Token de autenticación: Debe ser el mismo que usaste al generar el pago. Si no coincide, no se podrá generar la cancelación.
    • ⏱️ Límite de tiempo: 5 minutos: Solo puedes cancelar una solicitud de pago si han pasado menos de 5 minutos desde su creación. Después de eso:
      • Si el cliente no realiza ninguna accion, la solicitud se cancela automáticamente
      • Si el cliente ya pagó, no se puede cancelar

    ↩️API Reverse

    Este proceso permite deshacer una transacción que ya ha sido procesada, devolviendo los fondos al cliente.

    Para gestionar reverso o anulación de transacciones, es necesario contar con el transactionID o el clientTransactionID. Estos identificadores son cruciales para localizar y manipular la transacción específica.


    Casos de uso

    El método de reverso es útil en diferentes situaciones:

    • Cuando se generó transacciones erróneas.
    • Cuando el cliente realiza solicitudes de reembolso.
    • Cuando su plataforma no puede confirmar el estado de la transacción.
    • Por razones de seguridad, cuando un pago necesita ser reversado.

    📓 Información detallada

    Para obtener una explicación detallada sobre el proceso de reverso a través de la API o para realizar reversos directamente desde la plataforma Payphone Business, consulte nuestra documentación.


    📑 GUIA DE REVERSO PAYPHONE


    ⚠️ Consideraciones

    Es crucial tener en cuenta la siguiente restricción temporal para los reversos de transacciones:

    • Los reversos solo pueden ejecutarse el mismo día de la transacción original.
    • El período de reversión está limitado hasta las 20:00 del día en que se realizó la transacción.

    🔰Pruebas y paso a producción

    En Payphone, tienes el control total de tu integración: tú decides cuándo probar y cuándo lanzar. No necesitas pasar por procesos de certificación, ni depender de terceros para poner tu aplicación en línea. Solo integras, pruebas y lanzas. Así de simple.

    Payphone pone a tu disposición dos entornos listos para usar:


    1. 🧪 Entorno de PRUEBAS

    Espacio seguro y controlado para el desarrollo, integración y validación de tu aplicación. Aquí puedes realizar todas las pruebas necesarias sin afectar a usuarios reales ni realizar cobros reales.

    • Todas las transacciones se aprueban.
    • No se conecta con entidades bancarias.
    • Puedes usar datos reales (sin cobro) o datos ficticios válidos.
    • Compatible con herramientas como Postman o curl para pruebas automatizadas.

    Probadores en App Payphone

    Invita usuarios personales de Payphone como “probadores” para simular pagos reales desde la app. Ideal para validar la experiencia completa del cliente.


    2. 🖥️ Entorno de PRODUCCIÓN

    Ambiente en el que tus usuarios finales realizarán pagos reales. Todas las transacciones aquí son efectivas y se procesan a través de la red bancaria.

    • El dinero se transfiere directamente a tu cuenta Payphone.
    • Todas las transacciones se reflejan en tiempo real.


    📓 Información detallada

    Consulta la guía detallada sobre cómo usar ambos entornos, con ejemplos, recomendaciones técnicas y configuraciones paso a paso:


    📑Guia Entorno de Pruebas y Produccion


    ⚠️ Consideraciones importantes

    • Realiza pruebas exhaustivas antes de pasar a producción.
    • En entorno de producción, usa únicamente datos reales y verificados.
    • Utiliza herramientas de visualización:
      • En Pruebas: revisa transacciones en Payphone Developer > Probadores> Transacciones.
      • En Producción: consulta tu historial en Payphone Business > Ventas.
    • Nuestro sistema tiene estrictos protocolos de seguridad: asegúrate de cumplir con las normas para evitar rechazos o bloqueos.

    Una vez que tu aplicación esté en producción, el proceso estará completo.
    ¡Felicidades por integrar cajita de pagos de Payphone!

    Videos tutorialesPolíticas de privacidadTérminos y condiciones
    Copyright © 2024 Payphone | Todos los derechos reservados | Términos y condiciones