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 comercios
Soporte
visita payphone.app
  • 🔹📎 ¿Qué es el botón de pago Payphone?

  • 🔹🔑 Configuración de ambiente

  • 🔹🛠️ Preparar transacción

  • 🔹🧾 Consultar respuesta de transacción

  • 🔹🎞️ Video Tutorial

  • 🔹🔰 Pruebas y paso a producción

  • 🔹↩️ Reverso de Transacciones

  • 🔹🔧 Funcionalidades Adicionales

Botón de pago por redirección

📎¿Qué es el botón de pago Payphone?

¡Integra el botón de pago Payphone y simplifica tus transacciones! En pocos minutos tendrás activo un botón de pago que te permitirá recibir pagos de forma segura y eficiente , ya sea con tarjetas de crédito y débito (Visa , Mastercard) o saldo Payphone.

¡Integración rápida y flexible con cualquier lenguaje de programación gracias a nuestros API REST!

Flujo del Botón de pago 💳

🚀¿Cómo funciona? La integración se realiza en dos fases clave:

1. 🧩 Preparación

En esta etapa se configura el detalle de la transaccion para obtener los enlaces hacia nuestros formularios de pago:

  1. Solicitud POST: Realizar una solicitud POST a la API de Preparacion de Payphone.
  2. Detalle de la transacción: Proporciona en el cuerpo de la solicitud los detalles del pago (monto a cobrar, impuestos y detalles generales de la transacción).
  3. Obtener la URL del formulario de pago: Payphone te proporcionará una URL donde estará disponible el formulario para completar la transacción. Simplemente redirige a tu cliente a esta URL.
  4. Realizar el pago: El cliente podrá pagar utilizando su tarjeta de crédito, débito, o saldo de Payphone.

2. ✅ Confirmación

Una vez que el usuario completa el pago, Payphone redirige a tu sitio con parámetros en la URL que representan el resultado de la operación.

Tu sistema debe:

  1. Capturar los parámetros de respuesta: identificador de Payphone(ID) y identificador del comercio (clientTransactionId).
  2. Solicitud POST: Realizar una solicitud POST a la API de Confirmación de Payphone incluyendo los parametros de la transaccion.
  3. Respuesta Solicitud: Payphone te respondera con el detalle completo de la transacción (estado, monto, autorización, etc.)
  4. Mostrar Resultado: Presentar al cliente el resultado de la transaccion.

🔙 Importante: Reverso Automático

Si tu sistema no ejecuta la fase de confirmación dentro de los primeros 5 minutos después del pago, Payphone reversará automáticamente la transacción. Esto se hace para proteger tanto al comercio como al cliente, evitando:

  1. Cobros indebidos
  2. Procesos incompletos por falta de datos
  3. Conflictos o reclamos por parte del cliente

📖En resumen: Si no confirmas el pago, Payphone lo cancela automáticamente, ya que no puede garantizar que el comercio haya registrado correctamente la transacción.

⚠️ Consideraciones previas:

Antes de comenzar con la implementación de Boton de Pagos de Payphone, asegúrate de cumplir con los siguientes requisitos técnicos y administrativos:

🌐 Plataforma

  1. El Boton de Pagos está diseñada exclusivamente para entornos WEB. No está disponible para aplicaciones móviles directamente.

🔒 Dominio y entorno seguro

  1. Es indispensable contar con un dominio que tenga un certificado SSL (https://) válido para producción.
  2. Para fines de prueba o desarrollo local, puedes utilizar http://localhost sin necesidad de certificado SSL.
  3. Importante: El Boton de Pagos está vinculada directamente al dominio configurado en tu cuenta Payphone.
  4. Esto significa que solo funcionará en ese dominio específico. Si se intenta ejecutar desde otro dominio no autorizado, se mostrará un error de autorización y el proceso de pago no podrá completarse.

🏢 Cuenta en Payphone Business

  1. Debes tener una cuenta activa en Payphone Business.
  2. Si aún no la tienes, puedes registrarte en: Payphone Business

👨💻 Usuario con rol de Desarrollador

  1. Dentro de tu cuenta Payphone Business, deberás crear un usuario con el rol de Desarrollador.
  2. Este usuario tendrá acceso a las configuraciones técnicas y a la generación de credenciales para integración.

💻 Entorno de desarrollo

  1. Asegúrate de contar con un entorno de desarrollo funcional, incluyendo:
    • Editor de código (VSCode, WebStorm, etc.)
    • Navegador actualizado
    • Herramientas de prueba como Postman, Insomnia o cURL
    • Conocimientos básicos de HTML, JavaScript y consumo de APIs REST

🔑 Obtención de credenciales

  1. Desde la plataforma para desarrolladores de Payphone, deberás:
    • Crear una nueva configuración de aplicación.
    • Obtener las credenciales necesarias para la integración: TOKEN de autenticación (Bearer Token) y STOREID asociado a tu comercio

Próximos pasos

Siguiendo este flujo, podrás implementar un proceso de pago seguro y eficiente en tu aplicación WEB.
A continuación, profundizaremos en cada uno de estos pasos.

🔑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: "WEB"
  2. Al elegir aplicación de tipo "WEB", se requerirá completar dos campos nuevos: Dominio Web y URL de Respuesta.
  3. Obtén tus credenciales. Estos datos son esenciales para autenticarte con Payphone. Encuéntralos al configurar tu aplicación.
  4. 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.

🛠️Preparar la transacción

Este método permite preparar los montos e información adicional necesarios para iniciar una transacción de pago a través del botón Payphone.

🧩 API Button/Prepare

Para preparar una transacción, debes realizar una solicitud POST como se muestra a continuacion:

🔗 URL de la solicitud POST

https://pay.payphonetodoesposible.com/api/button/Prepare

📦 Estructura del Cuerpo de la Solicitud:

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

{
    "amount": 315,
    "amountWithoutTax": 200,
    "amountWithTax": 100,
    "tax": 15, 
    "service": 0,
    "tip": 0,
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",   
    "reference": "Motivo de cobro con Boton", 
    "storeId": "your_storeId",
    "currency": "USD",  
    "responseUrl": "https://your_domain.com/webhook/resultParameters",    
    "cancellationUrl": "https://tu-dominio.com/",
    "timeZone": -5, 
    "lat": "-1.831239",    
    "lng": "-78.183406",    
    "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": [
            {
                "productName": "Producto Vendido",
                "unitPrice": 100,
                "quantity": 1,
                "totalAmount": 115,
                "taxAmount": 15,
                "productSKU": "3342.0004",
                "productDescription": "Descripción Producto"
            },
            {
                "productName": "Servicio Entregado",
                "unitPrice": 100,
                "quantity": 2,
                "totalAmount": 200,
                "taxAmount": 0,
                "productSKU": "5342.0054",
                "productDescription": "Descripción Servicio"
            }
        ]
    },
    "documentId": null,
    "phoneNumber": null,
    "email": null,
    "optionalParameter": "Descripción Extra"
}

El objeto JSON mostrado define el cobro de $3.15, divididos en $1 con un impuesto del 15% y $2 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 cuerpos de solicitudes con campos mínimos

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
{ 
    "amount": 115, 
    "amountWithTax": 100,  
    "tax": 15, 
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",  
    "currency": "USD",  
    "storeId": "your_storeId", 
    "reference": "Pago con API Link",   
    "responseUrl":"https://tu-dominio.com/ConfirmacionPago" 
}

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

{ 
    "amount": 200, 
    "amountWithoutTax": 200, 
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",  
    "currency": "USD",  
    "storeId": "your_storeId",  
    "reference": "Pago con API Link",  
    "responseUrl":"https://tu-dominio.com/ConfirmacionPago"
}

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

{ 
    "amount": 315, 
    "amountWithoutTax": 200, 
    "amountWithTax": 100, 
    "tax": 15,  
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",  
    "currency": "USD",  
    "storeId": "your_storeId",  
    "reference": "Pago con API Link",   
    "responseUrl":"https://tu-dominio.com/ConfirmacionPago"
}

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

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

A continuación se detallan todos los parámetros que se pueden usar para una transacción como montos a cobra, moneda, datos del cliente y otros campos que puedes enviar.

Nombre

Descripción

Tipo de Dato

Opcional

amount

Valor total a cobrar.
Debe ser igual a la suma de todos los montos individuales ( amountWithoutTax, amountWithTax, Tax, service y tip ).

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

✅ Sí

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í

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

✅ Sí

email

Correo electrónico del cliente; se solicitará si no se proporciona.

String

✅ Sí

documentId

Número de identificación del cliente; se solicitará si no se proporciona.

String

✅ Sí

responseUrl

Url de respuesta a donde se redirecciona luego del pago.

String

❌ No

cancellationUrl

Url a donde se redirecciona si se cancela la transacción desde el icono X en el formulario.

String

✅ Sí

optionalParameter

Información adicional para la transacción.

String

✅ Sí

order

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

String

✅ Sí

lang

Idioma de Formulario:
inglés (en),
español (es).
Por defecto en español.

String

✅ Sí

timeZone

Zona horaria, (ej: -5)

String

✅ Sí

lat

latitud en formato decimal: -1.831239

String

✅ Sí

lng

longitud en formato decimal: -78.183406

String

✅ Sí

🛑 Advertencia:


Al utilizar los campos phoneNumber, email y documentId en las solicitudes a los servicios de Payphone, es crucial que se ingresen los datos del titular de la tarjeta para cada transacción individual. No se permite el uso de datos "quemados" o estáticos, ya que esto puede resultar en el rechazo de sus transacciones y el bloqueo de sus usuarios. El uso de datos falsos o repetitivos puede generar sospechas de fraude.


Payphone se compromete a proteger la seguridad y privacidad de los datos, por lo que es fundamental cumplir con esta política para garantizar un proceso de pago seguro y confiable.

📋 Desglose del campo order

El campo order se divide en dos arreglos: BillTo, LineItems

🧾BillTo (Datos de facturación):
El campo billTo es un arreglo que contiene información de facturació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 Buttom/Prepare

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

PHP
JQUERY
FETCH
<?php 
    date_default_timezone_set('America/Guayaquil');

    //Preparar cabecera para la solicitud
    $headers[] = 'Authorization: Bearer your_token' ;//CREDENCIALES DE CONFIGURACION
    $headers[] = 'Content-Type: application/json' ;//TIPO DE APLICACION 

    //Genera Dato Unico por transacción 
    $clientTransactionID = substr((date("ymd-Hi-s").gettimeofday()["usec"]),0, 16);

    //Preparar objeto JSON para solicitud
    $data = array(
        "amount" => 215,
        "amountWithoutTax" => 100,
        "amountWithTax" => 100,
        "tax" => 15,
        "service" => 0,
        "tip" => 0,
        "storeId" => "your_storeId",
        "clientTransactionId" => $clientTransactionID,
        "currency" => "USD",
        "responseUrl" => "https://your_domain.com/confirm.php",
        "reference" => "Prueba Boton por redireccion"
    );
    $objetoJSON = json_encode($data);

    //Iniciar solicitud curl: POST 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://pay.payphonetodoesposible.com/api/button/Prepare");
    curl_setopt($curl, CURLOPT_POST, 1);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $objetoJSON);    
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //Respuesta en formato JSON
    $curl_response = curl_exec($curl);
    //Finaliza solicitud curl: POST
    curl_close($curl);
    
    //Mostrar Resultado en Pantalla
    echo "<h1>Prueba Botón por redirección</h1> <br><br>";

    $result= json_decode($curl_response);

    if(isset($result->paymentId) ) {
        echo "<a href='".$result->payWithPayPhone."'>PAGAR CON PAYPHONE</a> <br><br>";
        
        echo "<a href='" .$result->payWithCard."'>PAGAR CON TARJETA VISA/MASTERCARD</a>";
    }else{
        echo "<pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>"; 
    }      
    
?>
<!DOCTYPE html>
<html>
<head>
    <title>Ejemplo de Solicitud POST con jQuery</title>  
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>  
    <script>
    	//Genera un Dato Unico por transacción
        const  redirectClientTraxID =Date.now();
        //Se realiza solicitud POST: Se prepara objeto JSON, header y presenta resultado o error
        $(document).ready(function() {
            $.ajax({
                url: "https://pay.payphonetodoesposible.com/api/button/Prepare",
                type: "POST",
                headers: {
                "Content-Type": "application/json",
                "Authorization": "Bearer your_token"
                },
                data: JSON.stringify({ 
                    "amount": 155,
                    "amountWithoutTax": 155, 
                    "amountWithTax": 0,                
                    "tax": 0, 
                    "reference": "Pago mediante Boton payphone",    
                    "currency": "USD",                 
                    "clientTransactionId": redirectClientTraxID,
                    "storeId": "your_storeId",    
                    "ResponseUrl": "https://your-domain.com/Confirm"
                }),
                success: function(response) {
                    $("#resultado").html(
                        "<a href='" + response.payWithPayPhone + "' target='_blank'>Pagar con payphone</a><br><br>" +
                        "<a href='" + response.payWithCard + "' target='_blank'>Pagar con Tarjeta Visa/MasterCard</a><br><br>"+
                        "Respuesta : <pre>" + JSON.stringify(response, null, 2) + "</pre>"
                    );
                },
                error: function(error) {
                    $("#resultado").html(
                        "Error en la solicitud : <pre>" + JSON.stringify(error, null, 2) + "</pre>"
                    );
                }
            });
        });
    </script>
</head>
<body>
    <h1>Ejemplo de Solicitud POST</h1>
    <div id="resultado"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="es">
<head>  
    <title>Ejemplo de Solicitud POST con fetch</title>  
    <script>     
        //Genera un Dato Unico por transacción   
        const  redirectClientTraxID =Date.now();
        //Preparar cabecera para la solicitud
        const  headers = {
                "Content-Type": "application/json",
                "Authorization": "Bearer your_token",
                "Referer": document.referrer
            };
        //Preparar objeto JSON para solicitud
        const bodyJSON = { 
            "amount": 180,//monto total
            "amountWithoutTax": 180,//monto que no cobrar impuestos 
            "amountWithTax": 0,//monto que cobrar impuestos excluido el impuesto                  
            "tax": 0,//monto del impuestos 
            "reference": "Prueba Boton fetch", //motivo de transaccion opcional   
            "currency": "USD",//ISO DE MONEDA                    
            "clientTransactionId": redirectClientTraxID,//id unico proporcionado por el comercio
            "storeId": "your_storeId",    
            "ResponseUrl": "https://your-domain.com/Confirm"
        };

        //Iniciar solicitud: POST 
        const  url = "https://pay.payphonetodoesposible.com/api/button/Prepare";
        fetch(url, {
            method: "POST",
            headers: headers,
            body: JSON.stringify(bodyJSON)
        })
        .then((res) => res.json())
        .catch((error) => {
                // Se crea etiqueta <pre> que contiene el error
                const jsonResult = document.createElement("pre");
                jsonResult.textContent = JSON.stringify(error, null, 2);

                // Mostrar los enlaces en el documento con un salto de línea entre ellos
                const container = document.createElement("div");
                container.appendChild(jsonResult);

                // Agregar los enlaces al body del documento o a un contenedor específico
                document.body.appendChild(container);
            })
        .then((data) => {
            // Se procesa la respuesta JSON
            const payWithPayPhone = data.payWithPayPhone;
            const payWithCard = data.payWithCard;

            // Se crea etiquetas <a> con los enlaces hacia el formulario
            const payWithPayPhoneLink = document.createElement("a");
            payWithPayPhoneLink.href = payWithPayPhone;
            payWithPayPhoneLink.textContent = "Pagar con PayPhone";

            const payWithCardLink = document.createElement("a");
            payWithCardLink.href = payWithCard;
            payWithCardLink.textContent = "Pagar con Tarjeta Visa/MasterCard";

            // Se crea etiqueta <pre> que contiene el json de respuesta
            const jsonResult = document.createElement("pre");
            jsonResult.textContent = JSON.stringify(data, null, 2);

            // Mostrar los enlaces en el documento con un salto de línea entre ellos
            const container = document.createElement("div");
            container.appendChild(payWithPayPhoneLink);
            container.appendChild(document.createElement("br")); // Salto de línea
            container.appendChild(document.createElement("br")); // Salto de línea
            container.appendChild(payWithCardLink);
            container.appendChild(document.createElement("br")); // Salto de línea
            container.appendChild(document.createElement("br")); // Salto de línea
            container.appendChild(jsonResult);

            // Agregar los enlaces al body del documento o a un contenedor específico
            document.body.appendChild(container);
        });    
    </script>
</head>
<body>
    <h1>Ejemplo de Solicitud POST con Fetch</h1>
    <div id="resultado"></div>    
</body>
</html>
📬Respuesta a la solicitud POST

Al realizar la solicitud POST, recibirás un objeto JSON que incluye los siguientes parámetros:

{
    "paymentId": "GSizecyUkIAkxTj3SQ",
    "payWithPayPhone": "https://pay.payphonetodoesposible.com/PayPhone/Index?paymentId=GSizecyUkIAkxTj3SQ",
    "payWithCard": "https://pay.payphonetodoesposible.com/Anonymous/Index?paymentId=GSizecyUkIAkxTj3SQ"
}
  • paymentId: Identificador del pago.
  • payWithPayPhone: URL del formulario para realizar el pago mediante la app de Payphone.
  • payWithCard: URL del formulario para realizar el pago directamente con su tarjeta de crédito o débito.

Al redireccionar desde el dominio hacia los enlaces del formulario se mostrará de la siguiente forma:

Los clientes pueden pagar con tarjetas de crédito y débito (Visa , MasterCard), así como con saldo Payphone. Independientemente del método de pago, recibirás la misma respuesta de transacción, ya sea aprobada o rechazada.

❌ Respuesta a error en la solicitud POST

Si algun campo no cumple con las reglas o formato en la solicitud POST, recibirás un objeto JSON que incluye el detalle del error:

{
    "message": "Validaciones fallidas",
    "errorCode": 800,
    "errors": [
        {
            "message": "Amount",
            "errorCode": 0,
            "errorDescriptions": [
                "El campo Amount no es igual a la suma de AmountWithTax, AmountWithoutTax, Tax, Service, Tip"
            ]
        }
    ]
}
📌 Consideraciones

⏱️ Tiempo de vida del formulario

  • Cada enlace como el formulario del botón de Pagos tiene una vigencia de 10 minutos desde su carga.
  • Si el usuario no completa el pago en ese tiempo, el formulario expirará y se deberá generar uno nuevo.

🚫 Error de "No Autorizado"

¿Por qué ocurre este error?

El mensaje de “Acceso denegado o dominio no permitido” al intentar cargar o ejecutar el boton de Pagos puede deberse a una de las siguientes razones:

1. 🌐 Dominio no autorizado

  • Los Formularios del Botón de Pagos solo funcionaran si son redireccionados desde el dominio registrado en tu configuración de desarrollador en Payphone Developer.
  • Si intentas redireccionar desde otro dominio o abrir el enlace directamente, se bloqueará por motivos de seguridad.
  • ✅ Solución: Asegúrate de que la redirección hacia el formulario de pago se realice desde el mismo dominio que configuraste en tu cuenta de Payphone.

2. 🛡️ Falta de identidad del sitio (Referrer-Policy)

En algunos frameworks o servidores, existe una configuración por defecto que no comparte la identidad del sitio web desde donde se hace la redirección al formulario de pago.

Esto impide que Payphone verifique el origen de la solicitud y provoca el error de acceso denegado.

La configuración detectada que puede causar el error:

  • Referrer-Policy: en las plataformas mas comunes como C# / ASP.NET, WordPress, entre otras
  • SECURE_REFERRER_POLICY: Desde Django 3.1 en adelante

📘 ¿Qué es la Referrer-Policy?

La Referrer-Policy es una política de seguridad del navegador que define qué información del origen (referencia) se envía al hacer peticiones a otros recursos.

A continuación, se muestran las opciones más comunes:

  • no-referrer: No se envía ninguna referencia. Máxima privacidad, pero puede romper funcionalidades.
  • no-referrer-when-downgrade: Envía la referencia solo si ambos sitios usan HTTPS.
  • origin: Envía solo el esquema y host del sitio (sin ruta). Nivel medio de privacidad.
  • origin-when-cross-origin: Como origin, pero solo en solicitudes entre sitios distintos.
  • strict-origin: Similar a origin, pero restringido a HTTPS.
  • strict-origin-when-cross-origin: Mayor control sobre envíos entre orígenes cruzados.
  • no-referrer: No se envía ninguna referencia. Máxima privacidad, pero puede romper funcionalidades.

✅ Recomendación de Payphone

Para garantizar el correcto funcionamiento de Boton de Pagos, recomendamos usar:

  • origin
  • origin-when-cross-origin

Esto proporciona el equilibrio ideal entre funcionalidad y privacidad, y permite a Payphone validar correctamente el origen de la solicitud.

🧾Consultar respuesta de la transacción

Una vez que el usuario completa el pago, será redirigido automáticamente a la URL de respuesta que hayas configurado previamente en la plataforma de Payphone.

Esta URL incluirá dos parámetros esenciales en la cadena:

  • id Número entero que representa el identificador único de la transacción generado por Payphone.
  • clientTransactionId Cadena de texto definida como identificador unico por tu plataforma al iniciar el pago.

Es crucial capturar estos parámetros para poder realizar una solicitud POST al método Confirm.

🔸 Ejemplo en PHP para obtener los parámetros de la URL:

$id = isset($_GET["id"])?$_GET["id"]:0;
$clientTransactionId = isset($_GET["clientTransactionId"])?$_GET["clientTransactionId"]:"";
✔️Confirmar el Estado de la Transacción API Buttom/Confirm :

Para verificar si una transacción fue aprobada, cancelada o fallida, debes realizar una solicitud POST al endpoint de confirmación.

Esto te permitirá mostrar un mensaje claro al usuario sobre el resultado.

🔗Endpoint del API Confirm

https://pay.payphonetodoesposible.com/api/button/V2/Confirm

📦 Cuerpo de la solicitud (JSON):

El cuerpo de la solicitud debe ser un objeto JSON que contenga los siguientes parámetros, los cuales son los valores que se recibió de la URL de respuesta:

{
  "id": 0,
  "clientTxId": "string"
}

🔐 Es fundamental incluir las siguientes cabeceras en la solicitud:

  • 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 (Indica que el formato de los datos enviados en el cuerpo de la solicitud es 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:

{
    "email": "aloy@mail.com",
    "cardType": "Credit",
    "bin": "530219",
    "lastDigits": "XX17",
    "deferredCode": "00000000",
    "deferred": false,
    "cardBrandCode": "51",
    "cardBrand": "Mastercard Produbanco/Promerica",
    "amount": 315,
    "clientTransactionId": "ID_UNICO_X_TRANSACCION-001",
    "phoneNumber": "593999999999",
    "statusCode": 3,
    "transactionStatus": "Approved",
    "authorizationCode": "W23178284",
    "message": null,
    "messageCode": 0,
    "transactionId": 23178284,
    "document": "1234567890",
    "currency": "USD",
    "optionalParameter3": "Descripción Extra",
    "optionalParameter4": "ELISABETH SOBECK",
    "storeName": "Tienda Payphone",
    "date": "2023-10-10T11:57:26.367",
    "regionIso": "EC",
    "transactionType": "Classic",
    "reference": "Pago por venta Fact#001"
}
📝Descripción de parámetros de respuesta

Una vez la llamada es satisfactoria obtendrás un JSON con los siguientes parámetros:

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. VISA o Mastercard y Banco Emisor

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

📬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:

{
    "message": "La transacción no existe, verifique que el identificador enviado sea correcto.",
    "errorCode": 20
}
🔙 Importante Recordar: Reverso Automático

Si tu sistema no ejecuta la fase de confirmación dentro de los primeros 5 minutos después del pago, Payphone reversará automáticamente la transacción. Esto se hace para proteger tanto al comercio como al cliente, evitando:

  • Cobros indebidos
  • Procesos incompletos por falta de datos
  • Conflictos o reclamos por parte del cliente

📖 En resumen: Si no confirmas el pago, Payphone lo cancela automáticamente, ya que no puede garantizar que el comercio haya registrado correctamente la transacción.

🧱Ejemplo de Implementación API Buttom/Confirm

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

PHP
JQUERY
FETCH
<?php
    //Obtener parametros enviados por payphone de la URL de respuesta
    $id = isset($_GET["id"])?$_GET["id"]:0;
    $clientTxId = isset($_GET["clientTransactionId"])?$_GET["clientTransactionId"]:"";

    //Preparar cabecera para la solicitud
    $headers[] = 'Authorization: Bearer your_token' ;//CREDENCIALES DE CONFIGURACION
    $headers[] = 'Content-Type: application/json' ;//TIPO DE APLICACION 

    //Preparar objeto JSON para solicitud
    $data = array(
        "id" => (int)$id,
        "clientTxId" => $clientTxId 
    );
    $objetoJSON = json_encode($data);

    //Iniciar solicitud curl: POST 
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "https://pay.payphonetodoesposible.com/api/button/V2/Confirm");
    curl_setopt($curl, CURLOPT_POST, 1);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $objetoJSON);    
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //Respuesta en formato JSON
    $curl_response = curl_exec($curl);
    //Finaliza solicitud curl: POST
    curl_close($curl);


    //Mostrar Resultado en Pantalla
    echo "<h1>Prueba Confirmacion de Transaccion</h1> <br>";

    $result= json_decode($curl_response);
    echo "Respuesta : <pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
?>
<html lang="es">
    <head>
        <meta charset="utf-8">
        <title>Confirmacion con jQuery</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>   
        <script>
            //---------Funcion que obtiene parametros de la url---------//
            function getQueryVariable(variable) {
                var query = window.location.search.substring(1);
                var vars = query.split("&");
                for (var i=0; i < vars.length; i++) {
                    var pair = vars[i].split("=");
                    if(pair[0] == variable) {
                        return pair[1];
                    }
                }
                return false;
            } 

            var id=getQueryVariable('id');
            var clientTxId=getQueryVariable('clientTransactionId');

            $(document).ready(function() {
                $.ajax({
                    url: "https://pay.payphonetodoesposible.com/api/button/V2/Confirm",
                    type: "POST",
                    headers: {
                    "Content-Type": "application/json",
                    "Authorization": "Bearer your_token"
                    },
                    data: JSON.stringify({ 
                        "id": id,
                        "clientTxId": clientTxId
                    }),
                    success: function(response) {
                        $("#resultado").html(
                            "Respuesta : <pre>" + JSON.stringify(response, null, 2) + "</pre>"
                        );
                    },
                    error: function(error) {
                        $("#resultado").html(
                            "Error en la solicitud : <pre>" + JSON.stringify(error, null, 2) + "</pre>"
                        );
                    }
                });
            });
        </script>
    </head>    
    <body>
        <h1>Ejemplo de Solicitud POST con jQuery</h1>
        <div id="resultado"></div>
    
    </body>
</html>
<html lang="es">
    <head>
        <meta charset="utf-8">
        <title>Confirmacion con Fetch</title> 
        <script>
            //---------Funcion que obtiene parametros de la url---------//
            function getQueryVariable(variable) {
                var query = window.location.search.substring(1);
                var vars = query.split("&");
                for (var i=0; i < vars.length; i++) {
                    var pair = vars[i].split("=");
                    if(pair[0] == variable) {
                        return pair[1];
                    }
                }
                return "0";
            } 

            const id=getQueryVariable('id');
            const clientTxId=getQueryVariable('clientTransactionId');

            const  headers = {
                "Content-Type": "application/json",
                "Authorization": "Bearer your_token",
                "Referer": document.referrer
            };

            const bodyJSON = { 
                "id": id,
                "clientTxId": clientTxId
            };

            const  url = "https://pay.payphonetodoesposible.com/api/button/V2/Confirm";

            fetch(url, {
                method: "POST",
                headers: headers,
                body: JSON.stringify(bodyJSON)
            })
            .then((res) => res.json())
            .catch((error) => {
                // Creamos la etiqueta <pre> que contiene el error
                const jsonResult = document.createElement("pre");
                jsonResult.textContent = JSON.stringify(error, null, 2);

                // Agregar etiqueta <pre> al <div>
                const container = document.createElement("div");
                container.appendChild(jsonResult);

                // Agregar la respuesta al body del documento o a un contenedor específico
                document.body.appendChild(container);
            })
            .then((data) => {

                // Creamos las etiquetas <a>
                const jsonResult = document.createElement("pre");
                jsonResult.textContent = JSON.stringify(data, null, 2);

                // Mostrar los enlaces en el documento con un salto de línea entre ellos
                const container = document.createElement("div");
                container.appendChild(jsonResult);

                // Agregar los enlaces al body del documento o a un contenedor específico
                document.body.appendChild(container);
            });  
        </script>
    </head>    
    <body>
        <h1>Confirmacion de Transaccion con Fetch</h1>   
    </body>
</html>

¡Listo! Si llegaste hasta aquí, ya tienes la lógica principal implementada. En la siguiente sección del manual podrás ver cómo hacer pruebas con datos simulados y pasar a producción.

🎞️ Video Tutorial

A continuación, encontrarás un video donde podrás ver cómo integrar nuestro Botón de Pago en pocos minutos.

🔰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 Boton de Pagos por redireccion de Payphone!

↩️Reverso de Transacciones

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.

↩️API Reverse y Reverso desde payphone business

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.

🔧Funcionalidades Adicionales

💳 Tokenización de Tarjetas con Payphone


La tokenización es una nueva funcionalidad de Payphone que permite a los comercios guardar de forma segura un identificador único (cardToken) asociado a la tarjeta de un cliente, sin almacenar directamente los datos sensibles de la tarjeta.

Este cardToken puede usarse para realizar pagos futuros de forma rápida y segura, sin necesidad de que el cliente vuelva a ingresar sus datos. Es una funcionalidad adicional del botón de pago o cajita de pagos de Payphone.


🔁 ¿Cómo funciona?

Primera Transacción:

  • El cliente realiza un pago usando el botón o cajita de Payphone.
  • Si el comercio está autorizado, Payphone genera un cardToken y lo devuelve junto a los parámetros de la transacción aprobada.

Transacciones siguientes:

  • El comercio utiliza el cardToken para realizar nuevos cobros al mismo cliente, sin solicitar nuevamente los datos de su tarjeta.
  • Payphone procesa estos pagos usando el token de manera segura.

💼 Casos de uso comunes

  • Plataformas de suscripción (cobros mensuales automáticos)
  • Pagos recurrentes (membresías, servicios por cuotas)
  • Compras frecuentes (e-commerce que ofrece "pago rápido")
  • Apps de delivery o transporte con usuarios registrados
  • Servicios bajo demanda (streaming, educación en línea)

📓 Información detallada

Consulta nuestra guía completa para desarrolladores sobre cómo implementar la tokenización usando nuestra API:


📑 GUIA DE TOKENIZACION PAYPHONE


📌 Importante:

  • Esta funcionalidad requiere autorización previa por parte de Payphone.
  • La tokenización de Payphone NO es un sistema de pagos recurrentes.
  • El servicio entrega los tokens de las tarjetas para que los comercios puedan implementar sus propios sistemas de recurrencia.
  • El token solo se genera si la transacción inicial es aprobada por la entidad emisora de la tarjeta.
  • La tokenización solo funciona para pagos directos con tarjetas de crédito o débito.
  • Debes contar con un sistema de gestión de usuarios activo y funcional.

➗Split de Pagos con Payphone


El Split de Pagos permite dividir un cobro entre varios usuarios Payphone al momento de realizar un pago. Esta función es ideal para plataformas o comercios que necesiten distribuir un pago entre distintos actores (por ejemplo, una empresa, un socio o un proveedor de servicios).

Esta funcionalidad está disponible a través de:

  • Botón de Pagos
  • Cajita de Pagos
  • Link de Pago por API

🔁 ¿Cómo funciona?

  • Se configura el servicio indicando el monto total, los datos de la transacción y los usuarios que recibirán un porcentaje del pago.
  • Se realiza la transacción a través del canal elegido.
  • Si la operación es aprobada y el comercio tiene el permiso, el monto se distribuye automáticamente según lo configurado.

💼 Casos de uso comunes

  • Marketplaces o Aplicaciones de Venta Multiactor: Ideal para negocios como restaurantes, servicios de delivery o compañías de transporte (como taxis), donde un cliente paga y los fondos se reparten entre el establecimiento, el repartidor y la empresa que aplica comisiones.
  • Sistemas de Recaudación: Permite dividir pagos entre un comercio principal y un beneficiario que cobra una comisión.

📓 Información detallada

Para una guía paso a paso sobre cómo integrar el Split de Pagos mediante API, consulta nuestra documentación oficial:


📑 GUIA DE SPLIT DE PAGOS PAYPHONE


📌 Importante:

  • Esta funcionalidad requiere autorización previa por parte de Payphone.
  • El valor a dividir no puede superar el total cobrado (ten en cuenta la comisión del 5.75% por pagos con tarjeta).
  • Si el monto dividido supera el valor cobrado, se usará el saldo en la wallet del comercio para cubrir la diferencia.
  • Al hacer una dispersión inmediata, el saldo se transfiere de forma definitiva. Si necesitas hacer un reverso, deberás gestionar manualmente el reembolso con cada usuario receptor.
Videos tutorialesPolíticas de privacidadTérminos y condiciones
Copyright © 2024 Payphone | Todos los derechos reservados | Términos y condiciones