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 tokenización de tarjetas?

  • 🔹🛡️ Proceso de Autorización

  • 🔹🛠️ Implementación de tokenización

  • 🔹🔧 Transacciones con cToken:

  • 🔹🔰 Pruebas y paso a producción

  • 🔹↩️ Reverso de Transacciones

Tokenización Payphone

📎¿Qué es tokenización de tarjetas?

La tokenización de tarjetas es un mecanismo de seguridad que permite a los comercios asociados a Payphone almacenar de forma segura un identificador único (cardToken) de la tarjeta de crédito o débito de un cliente, en lugar de los datos sensibles de la tarjeta. Este cardToken se utiliza para procesar pagos futuros sin la necesidad de volver a solicitar los datos completos de la tarjeta al cliente, siendo una funcionalidad adicional del botón de pago o cajita de pagos de Payphone

Flujo de tokenización 💳

🔹 1. Primera Transacción

  1. El cliente realiza una compra a través del botón de pago de Payphone.
  2. Si el comercio tiene la autorización necesaria, Payphone genera un token único para la tarjeta(cardToken) del cliente.
  3. Payphone te envía ese cardToken junto con la información necesaria para confirmar la venta.

🔹 2. Transacciones Subsiguientes

  1. El comercio usa el cardToken generado en la primera transacción para realizar nuevos cobros al cliente.
  2. Payphone procesa la transacción utilizando el cardToken en lugar de los datos completos de la tarjeta.

📥Transacciones y Obtención del cardToken

  1. Transacción Aprobada: Para que se genere y te sea entregado el token de la tarjeta (cardToken), la transacción realizada por el cliente a través del botón de pago o cajita de pagos debe ser aprobada por la entidad emisora de la tarjeta.
  2. Retorno del cardToken: Si la transacción es exitosa, el cardToken será incluido en la respuesta que Payphone envía a tu url de respuesta.

⚠️Consideraciones Importantes: ¡Puntos Clave a Tener en Cuenta!

💳 Pagos Exclusivos con Tarjeta

  1. La tokenización solo funciona para pagos directos con tarjetas de crédito o débito.
  2. No es compatible con otros métodos de pago (saldo, giftcard o pagos directos del app Payphone.).

🔐 Seguridad en el Manejo de Tokens

  1. Payphone implementa altos estándares de seguridad para proteger los tokens de las tarjetas.
  2. Sin embargo, tú también debes seguir las mejores prácticas de seguridad en el manejo de estos datos para evitar riesgos.

👥 Sistema de Gestión de Usuarios

  1. Debes contar con un sistema de gestión de usuarios activo y funcional.
  2. Este sistema es esencial para vincular los datos de tus usuarios con los tokens de tarjeta y la información del titular proporcionada por Payphone.

✅ Consentimiento del Cliente

  1. Siempre debes obtener el consentimiento explícito de tus clientes antes de almacenar los tokens de sus tarjetas.
  2. Es fundamental cumplir con las leyes y regulaciones de protección de datos.

🔁Pagos Recurrentes

  1. La tokenización de Payphone te da los cardTokens, pero no es un sistema de pagos recurrentes automático.
  2. Tú debes implementar la lógica para realizar cobros periódicos utilizando estos tokens. ¡Payphone te da la llave, tú abres la puerta de la recurrencia!

🧩 Botón de Pago Activo y Configurado

  1. Tu botón o cajita de pago debe estar correctamente configurado y operativo.
  2. Integralo siguiendo las guías proporcionadas por Payphone
Guia de botón de pagos
Guia de cajita de pagos
  1. Esta guía incluye la configuración de aplicación en Payphone developer, preparación y confirmación de la transacción.

📬 Solicita Autorizacion

  1. Una vez que el botón de pagos o cajita de pagos estén activos y funcionando correctamente, podrás realizar la solicitud de habilitación de tokenización.

🛡️Proceso de Autorización para Tokenización

El acceso al servicio de Tokenización Payphone requiere una autorización previa. A continuación, se detalla el proceso:

✉️ Solicitud de Autorización:

Para iniciar el proceso, el comercio debe enviar un correo electrónico a nuestra area comercial de Payphone con la siguiente información:

📨 Correo electrónico de contacto: Las solicitudes pueden enviarse a requests.docs@payphone.app

  1. Asunto: Activación de la funcionalidad: Tokenización
  2. Identificador del comercio: RUC, Cédula de Identidad
  3. Nombre del comercio
  4. Giro de Negocio: la actividad o conjunto de actividades principales que realiza la empresa para generar ingresos.
  5. Motivo detallado de la solicitud: Explicar el uso que se le dará al servicio y los beneficios que aportará al negocio.
  6. Información de contacto del solicitante: Nombre completo, número de teléfono y correo electrónico.
🔍Revisión y Evaluación por el Agente Comercial:

El agente comercial de Payphone revisará cuidadosamente la solicitud, analizando los siguientes aspectos:

  1. Viabilidad comercial: Se evaluará si el servicio solicitado se alinea con la estrategia y los objetivos de Payphone.
  2. Riesgos: Se identificarán y evaluarán los posibles riesgos asociados con la activación del servicio, como riesgos de seguridad o fraude.
  3. Investigación adicional: El agente comercial podrá solicitar información adicional al cliente si es necesario para completar el análisis.
  4. Reuniones: El agente comercial podrá programar reuniones con el cliente para discutir la solicitud en detalle y aclarar cualquier duda.

🏢Validación del Comercio:

Payphone realizará una verificación exhaustiva de la información del comercio, incluyendo:

  1. Verificación de identidad: Se verificará la identidad del comercio y sus representantes.
  2. Datos de contacto: Se validarán los datos de contacto proporcionados.
  3. Actividad comercial: Se analizará la actividad comercial del comercio.
  4. Evaluación de riesgos: Se evaluarán los riesgos asociados al comercio, como riesgo crediticio o riesgo de fraude.
  5. Cumplimiento normativo: Se verificará que el comercio cumple con todas las regulaciones y normativas aplicables.
  6. Firma de acuerdos: Se firmarán acuerdos de responsabilidad entre Payphone y el comercio para formalizar la relación.

📏Políticas de Seguridad:

De acuerdo con las políticas de seguridad de Payphone, se requiere que el comercio mantenga el 10% del saldo obtenido a través de la plataforma durante un período de 6 meses. Este plazo permite verificar la ausencia de transacciones no reconocidas o pagos no autorizados.

✅Aprobación de la Solicitud:
  1. Autorización: Una vez que el comercio haya sido validado y se hayan obtenido las aprobaciones internas, el agente comercial autorizará el uso del servicio de Tokenización.
  2. Activación: El área técnica de Payphone procederá a activar el servicio para el cliente.
  3. Notificación: Se notificará al cliente que el servicio ha sido activado y se le proporcionarán las instrucciones de uso.
📡Seguimiento y Monitoreo:
  1. Monitoreo continuo: Payphone realizará un seguimiento continuo del uso del servicio para asegurar su correcto funcionamiento y detectar posibles problemas.
  2. Soporte: Se brindará soporte técnico al cliente en caso de cualquier inconveniente.

🛠️Implementación de tokenización

🪪Obtención del Token de Tarjeta (cardToken):
  1. Primera Transacción: Realiza una transacción normal utilizando el botón de pago de Payphone.
  2. Respuesta con Token: Si la transacción es aprobada y tienes los permisos necesarios, recibirás un nuevo parámetro llamado ctoken en la URL de respuesta. Este ctoken es el identificador único de la tarjeta del cliente y debe almacenarse de forma segura en el sistema del comercio.

📤Parámetros Recibidos:

En la respuesta del botón de pagos, el comercio recibirá los siguientes parámetros:

  1. ID: Identificador de la transacción.
  2. ‍ClientTransactionID: Identificador único proporcionado por el cliente.
  3. ‍ctoken: Token de tarjeta si la transacción es aprobada y los permisos son adecuados.
👤Guardar Datos del Titular de la Tarjeta:

Continuando con con el proceso del botón de pagos, se realiza la confirmación de la transacción, este proceso devuelve un JSON con información de la transacción.

De estos datos obtenidos se debe almacenar de forma segura los siguientes campos:

  1. email: Correo electrónico asociado a la cuenta del titular de la tarjeta.
  2. phoneNumber: Número de teléfono registrado del titular.
  3. document: Número de documento de identidad del titular.
  4. optionalParameter4: Nombre completo del titular. (incluido solo si es pago con tarjeta)

⚠️Importante: El nombre del titular debe ser encriptado para ser utilizado en futuras solicitudes. Este dato encriptado se denomina cardHolder.

Todos estos datos te permiten tener una gestión eficiente para:

  1. Gestión de clientes: Identificar a los usuarios y sus cardToken de manera eficiente.
  2. Cumplimiento con regulaciones: Asegurar un almacenamiento adecuado de la información personal.
🔒Encriptación del nombre del titular de la tarjeta:

Para utilizar el servicio de tokenización es necesario q el nombre del titular este encriptado para posteriormente enviarlo en la solicitud de tokenización en el campo cardHolder.

Utiliza el algoritmo de encriptación AES 256 CBC sin vector de inicialización para cifrar el nombre del titular de la tarjeta antes de enviarlo en la solicitud.

  1. Clave de Encriptación: Consulta la clave de encriptación específica en la configuración de Payphone Developer.

🧱Ejemplo encriptación:

Javascript
PHP
<!DOCTYPE html>
<html lang="es">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>Encriptacion AES 256 CBC</title>  
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
</head>
<body>
    <h1>Encriptacion AES 256 CBC sin vector de inicializacion</h1>
    <div><a>Nombre del titular: <strong id="userName"></strong></a></div>
    <div><a>Valor Encriptado : <strong id="result"></strong></a></div>       

    <script>
        //funcion que encripta en AES 256 CBC sin vector de inicializacion
        function encrypted_aes(optionalParameter4) {
            var key = CryptoJS.enc.Utf8.parse('your_coding_password');
            var iv = CryptoJS.enc.Utf8.parse('');
            var encrypted = CryptoJS.AES.encrypt(optionalParameter4, key,{ iv: iv });
            var result_aes = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
            return result_aes;
        }        
        //Nombre del titular
        const userName="User Name";
        //se llama a la funcion de encriptacion
        const cardHolder=encrypted_aes(userName) ;
        //se muestra resultados
        document.getElementById("userName").innerHTML=userName;
        document.getElementById("result").innerHTML=cardHolder;        
        console.log("Valor Encriptado : "+cardHolder);
    </script>
</body>
</html>
<?php
    //funcion que encripta en AES 256 CBC sin vector de inicializacion
    function encrypt($optionalParameter4,$codingPassword) {
        error_reporting(E_ERROR | E_PARSE | E_NOTICE);
        $encrypted = base64_encode(openssl_encrypt($optionalParameter4,'AES-256-CBC',$codingPassword,OPENSSL_RAW_DATA,""));   
        error_reporting(E_ALL);
        return $encrypted;
    }
    //Nombre del titular
    $userName="User Name";
    //se llama a la funcion de encriptacion
    $cardHolder=encrypt($userName,"your_coding_password");
    //se muestra resultados
    echo "<h1>Encriptacion AES 256 CBC sin vector de inicializacion</h1>";
    echo "<a>Nombre del titular: <strong>$userName</strong></a><br>";
    echo "<a>Valor Encriptado : <strong>$cardHolder</strong></a>";

?>

Una vez implementados estos pasos, el comercio contará con una tarjeta virtual asociada a cada cliente, facilitando pagos futuros y garantizando la seguridad de la información, mediante el uso del sistema de tokenización de Payphone.

🔧Generación de nuevas transacciones con cardToken:

Para generar nuevas transacciones utilizando los datos guardados como el cardToken, se debe realizar una solicitud HTTP POST:

🧩 API transaction/web

🔗 URL de la solicitud POST

https://pay.payphonetodoesposible.com/api/transaction/web

🔐 Cabeceras Requeridas:

  • Authorization: bearer TU_TOKEN (Token de autenticación de la 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).

📦Estructura del Cuerpo de la Solicitud:

El cuerpo de la solicitud debe ser un objeto JSON que incluya los datos del titular de la tarjeta (cardToken, cardHolder, email, documentId, phoneNumber ), montos y demás información para la nueva transacción

    {
        "cardHolder": "{{cardHolder}}",
        "cardToken": "{{ctoken_user}}",
        "documentId": "1234567890",
        "phoneNumber": "593999999999",
        "email": "aloy@mail.com",
        "amount": 315,
        "amountWithoutTax": 315,
        "amountWithTax": 0,
        "tax": 0,
        "service": null,
        "tip": null,
        "clientTransactionId": "ID_UNICO_X_TRX-101",
        "currency": "USD",
        "storeId": "your_storeId",
        "optionalParameter": "Concepto o motivo de cobro",
        "order": {
            "billTo": {
            	"billToId": 12,
                "address1": "Colorado Springs",
                "address2": "Denver",
                "country": "EC",
                "state": "Azuay",
                "locality": "Cuenca",
                "firstName": "Elisabeth",
                "lastName": "Sobeck",
                "phoneNumber": "+593999999999",
                "email": "aloy@mail.com",
                "postalCode": "010202",
                "ipAddress": "127.0.0.1"
            },
            "lineItems": [
                {
                    "productName": "Producto Vendido",
                    "unitPrice": 100,
                    "quantity": 1,
                    "totalAmount": 115,
                    "taxAmount": 15,
                    "productSKU": "SKU-4242.0001",
                    "productDescription": "DETALLE PRODUCTO"
                },
                {
                    "productName": "Servicio Entregado",
                    "unitPrice": 100,
                    "quantity": 2,
                    "totalAmount": 200,
                    "taxAmount": 0,
                    "productSKU": "SKU-4242.0001",
                    "productDescription": "DETALLE SERVICIO"
                }
            ]
        }
    }

📌 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


📋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

cardHolder

Nombre y apellido del titular de la tarjeta codificado en AES 256 CBC sin vector de inicialización

String

❌ No

cardToken

cToken de tarjeta obtenido del pago aprobado desde botón de pago.

String

❌ No

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í

optionalParameter

Motivo o referencia específica del pago.

String

✅ Sí

phoneNumber

Número de teléfono del titular. Obtenido en la confirmación de transacción.
Formato:  Código País + numero telefónico.
Ej. 593984111222

String

❌ No

email

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

String

❌ No

documentId

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

String

❌ No

order

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

Array

❌ No

🛑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 que se obtuvo de la confirmación 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.

El campo Order es obligatorio en las solicitudes de Tokenizacion de Payphone.


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.
Formato: Símbolo(+) + Código País + numero telefónico.
Ej. +593984111222

String

email

Correo electrónico del titular.

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

📬Respuesta de solicitud

El resultado de una transacción exitosa incluirá el token de la tarjeta, el código de autorización, y otros detalles relevantes de la transacción

{
    "cardToken": "ctoken_user",
    "authorizationCode": "W46191086",
    "messageCode": 0,
    "status": "Approved",
    "statusCode": 3,
    "transactionId": 46191086,
    "clientTransactionId": "TOK2025-02-07T22:33:50.471Z",
    "currencyCode": "USD"
}
📝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.

message

Mensaje de error, si corresponde

messageCode

Código de mensaje.

cardToken

cToken de tarjeta obtenido del pago aprobado desde botón de pago.

currencyCode

Moneda utilizada para el pago.

🧱 Ejemplos de solicitudes POST al api transaction/web

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);
    }
    // funcion de encriptacion en AES 256 CBC sin vector de inicializacion
    function encrypt($objet) {
        error_reporting(E_ERROR | E_PARSE | E_NOTICE);
        $encrypted = base64_encode(openssl_encrypt($objet,'AES-256-CBC',"your_codingPassword",OPENSSL_RAW_DATA,""));   
        error_reporting(E_ALL);
        return $encrypted;
    } 

    /*## Preparar credenciales como variables para la solicitud ##*/
    $token="your_token";
    $storeId = "your_storeID";

    //INFORMACION DE TARJETA Y DATOS DE USUARIO
    //token de tarjeta "ctoken"
    $cardToken = "ctoken_user";
    //datos del titular obtenidos de la confirmacion de la transaccion
    $documentId = "1234567890";
    $phoneNumber = "593999999999";
    $email = "aloy@mail.com";
    //Nombre del titular
    $userName="Elisabeth Sobeck";
    //ejecutar funcion de encriptacion para obtener cardHolder
    $cardHolder=encrypt($userName);
    //separar nombre en un arreglo
    $arrayName = explode(" ", $userName); 
    //Genera Dato Unico por transaccion 
    $clientTransactionID = substr((date("ymd-Hi-s").gettimeofday()["usec"]),0, 16);

    /*## Preparar informacion para la solicitud POST ##*/
    //URL del servicio payphone
    $url="https://pay.payphonetodoesposible.com/api/transaction/web";
    //Preparar 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(
        "cardHolder"=> $cardHolder,
        "cardToken"=> $cardToken,
        "documentId"=> $documentId,
        "phoneNumber"=> $phoneNumber,
        "email"=> $email,
        "amount"=> 315,
        "amountWithoutTax"=> 315,
        "clientTransactionId"=> $clientTransactionID,
        "currency"=> "USD",
        "storeId"=> $storeId,
        "optionalParameter"=> "Concepto o motivo de cobro",
        "order"=> array(
            "billTo"=> array(
            	"billToId"=> 12,
                "address1"=> "Colorado Springs",
                "address2"=> "Denver",
                "country"=> "EC",
                "state"=> "Azuay",
                "locality"=> "Cuenca",
                "firstName"=> $arrayName[0],
                "lastName"=> $arrayName[1],
                "phoneNumber"=> "+".$phoneNumber,
                "email"=> $email,
                "postalCode"=> "010202",
                "ipAddress"=> "127.0.0.1"
            ),
            "lineItems"=> array(
                array(
                    "productName"=> "Producto o Servicio entregado",
                    "unitPrice"=> 315,
                    "quantity"=> 1,
                    "totalAmount"=> 115,
                    "taxAmount"=> 0,
                    "productSKU"=> "SKU-4242.0001",
                    "productDescription"=> "DETALLE PRODUCTO"
                )
            )
        )    
    );
    $bodyJSON = json_encode($data);

    //realizar solicitud http POST
    $result=curlPost($url, $headers,$bodyJSON);
   

     //Mostrar Resultado en Pantalla
     echo "<h1>🧩 Prueba de Transaccion con tokenizacion</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>Confirmacion con jQuery</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>   
        <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
    </head>    
    <body>
        <h1>Prueba de Transaccion con tokenizacion</h1>
        <div><a>Respuesta : <strong id="result"></strong></a></div>       

        <script>
            //funcion que encripta en AES 256 CBC sin vector de inicializacion
            function encrypted_aes(optionalParameter4) {
                var key = CryptoJS.enc.Utf8.parse('your_coding_password');
                var iv = CryptoJS.enc.Utf8.parse('');
                var encrypted = CryptoJS.AES.encrypt(optionalParameter4, key,{ iv: iv });
                var result_aes = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
                return result_aes;
            }        

            //token de tarjeta obtenido de url de respuesta "ctoken"
            const cardToken = "ctoken_user";
            //datos del titular obtenidos de la confirmacion de la transaccion
            const documentId = "1234567890";
            const phoneNumber = "593999999999";
            const email = "aloy@mail.com";
            //Nombre del titular
            const userName="Elisabeth Sobeck";
            //ejecutar funcion de encriptacion para obtener cardHolder
            const cardHolder=encrypted_aes(userName) ;
            //separar nombre en un arreglo
            const arrayName = userName.split(" ");
            //Genera Dato Unico por transaccion 
            const clientTransactionID = Date.now();

            

            $(document).ready(function() {
                $.ajax({
                    url: "https://pay.payphonetodoesposible.com/api/transaction/web",
                    type: "POST",
                    headers: {
                    "Content-Type": "application/json",
                    "Authorization": "Bearer your_token"
                    },
                    data: JSON.stringify({ 
                        "cardHolder": cardHolder,
                        "cardToken": cardToken,
                        "documentId": documentId,
                        "phoneNumber": phoneNumber,
                        "email": email,
                        "amount": 200,
                        "amountWithoutTax": 200,
                        "clientTransactionId": clientTransactionID,
                        "currency": "USD",
                        "storeId": "your_storeId",
                        "optionalParameter": "Concepto o motivo de cobro",
                        "order": {
                            "billTo": {
                                "address1": "Colorado Springs",
                                "address2": "Denver",
                                "country": "EC",
                                "state": "Azuay",
                                "locality": "Cuenca",
                                "firstName": arrayName[0],
                                "lastName": arrayName[1],
                                "phoneNumber": "+"+phoneNumber,
                                "email": email,
                                "postalCode": "010202",
                                "ipAddress": "127.0.0.1"
                            },
                            "lineItems": [
                                {
                                    "productName": "Producto o Servicio entregado",
                                    "unitPrice": 200,
                                    "quantity": 1,
                                    "totalAmount": 200,
                                    "taxAmount": 0,
                                    "productSKU": "SKU-4242.0001",
                                    "productDescription": "DETALLE PRODUCTO"
                                }
                            ]
                        }
                    }),
                    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>Tokenizacion con Fetch</title>            
        <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
    </head>    
    <body>
        <h1>Transaccion con Tokenizacion con Fetch</h1>  
        <div><a>Cuerpo : <pre id="data"></pre></a></div>
        <div><a>Respuesta : </a></div>
        <script>
             //funcion que encripta en AES 256 CBC sin vector de inicializacion
            function encrypted_aes(optionalParameter4) {
                var key = CryptoJS.enc.Utf8.parse('your_coding_password');
                var iv = CryptoJS.enc.Utf8.parse('');
                var encrypted = CryptoJS.AES.encrypt(optionalParameter4, key,{ iv: iv });
                var result_aes = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
                return result_aes;
            }        

            //token de tarjeta obtenido de url de respuesta "ctoken"
            const cardToken = "ctoken_user";
            //datos del titular obtenidos de la confirmacion de la transaccion
            const documentId = "1234567890";
            const phoneNumber = "593999999999";
            const email = "aloy@mail.com";
            //Nombre del titular
            const userName="Elisabeth Sobeck";
            //ejecutar funcion de encriptacion para obtener cardHolder
            const cardHolder=encrypted_aes(userName) ;
            //separar nombre en un arreglo
            const arrayName = userName.split(" ");
            //Genera Dato Unico por transaccion 
            const clientTransactionID = Date.now();

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

            const bodyJSON = { 
                "cardHolder": cardHolder,
                "cardToken": cardToken,
                "documentId": documentId,
                "phoneNumber": phoneNumber,
                "email": email,
                "amount": 200,
                "amountWithoutTax": 200,
                "clientTransactionId": clientTransactionID,
                "currency": "USD",
                "storeId": "your_storeId",
                "optionalParameter": "Concepto o motivo de cobro",
                "order": {
                    "billTo": {
                        "address1": "Colorado Springs",
                        "address2": "Denver",
                        "country": "EC",
                        "state": "Azuay",
                        "locality": "Cuenca",
                        "firstName": arrayName[0],
                        "lastName": arrayName[1],
                        "phoneNumber": "+"+phoneNumber,
                        "email": email,
                        "postalCode": "010202",
                        "ipAddress": "127.0.0.1"
                    },
                    "lineItems": [
                        {
                            "productName": "Producto o Servicio entregado",
                            "unitPrice": 200,
                            "quantity": 1,
                            "totalAmount": 200,
                            "taxAmount": 0,
                            "productSKU": "SKU-4242.0001",
                            "productDescription": "DETALLE PRODUCTO"
                        }
                    ]
                }
            };
            document.getElementById("data").innerHTML=JSON.stringify(bodyJSON, null, 2);

            const  url = "https://pay.payphonetodoesposible.com/api/transaction/web";

            fetch(url, {
                method: "POST",
                headers: headers,
                body: JSON.stringify(bodyJSON)
            })
            .then((res) => res.json())
            .catch((error) => {
                // Creamos las etiquetas <a>
                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) => {

                // 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>     
    </body>
</html>

¡Y eso es todo! Si has llegado a este punto, ¡felicidades! Tu integración está completada. En la siguiente sección, te explicaremos cómo realizar pruebas y pasar a producció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!

↩️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.
Videos tutorialesPolíticas de privacidadTérminos y condiciones
Copyright © 2024 Payphone | Todos los derechos reservados | Términos y condiciones