Implementación de split
Para implementar el Split de pagos debes seguir los siguientes pasos:
Implementación de servicios
Integra correctamente el botón de pagos o cajita de pagos o link de pagos por API siguiendo las guías proporcionadas por Payphone, esto incluye la configuración de aplicación en Payphone Developer, preparación y confirmación de la transacción. Consulta la documentación:
Al método seleccionado se debe agregar un nuevo parametro llamado "transferTo", el cual consta de un objeto JSON encriptado en AES 256 CBC sin vector de inicialización.
El objeto JSON tiene la siguiente estructura:
[
{
"Identifier": "+593999999999",
"Type": 4,
"Amount":"100"
},
{
"Identifier": "0123456789001",
"Type": 3,
"Amount":"100"
}
]
Campo Type: es un valor entero
- 3 : para indicar q el campo Identifier recibe como valor un número de identificación del comercio
- 4 : para indicar q el campo Identifier recibe como valor un número de teléfono
Campo Identifier: identificador de usuario de Payphone Business o Payphone Personal
- Número de Identificación: en este campo se indica el identificador de un usuario de Payphone Business, puede ser RUC(019041XXXX001) o CI (019041XXXX) o el identificador con el cual el comercio se registro.
- Número de teléfono: en este campo se indica el identificador de un usuario de Payphone Personal.
Formato: Símbolo(+) + Código País + número telefónico. Ej. +59398XXXXXXX
Campo Amount: es el valor que se pagará al actor registrado.
- Número Entero: Los valores monetarios deben expresarse en enteros. Es decir, se multiplica el valor en dólares por 100
- Límite de monto: el valor que se pagará al actor registrado no debe pasar el monto total a cobrar y se debe tener en cuenta el valor de comisión del 5.75% que se descuenta al pagar con tarjeta.
Si al dividir el pago entre usuarios Payphone se supera el valor cobrado se usará el saldo disponible en la wallet del comercio.
Encriptación de objeto JSON:
Para utilizar el servicio de split de pagos es necesario que el valor del campo transferTo esté encriptado para posteriormente enviarlo en la solicitud.
Utiliza el algoritmo de encriptación AES 256 CBC sin vector de inicialización para cifrar el objeto JSON antes de enviarlo en la solicitud.
- Clave de Encriptación: Consulta la clave de encriptación específica en la configuración de Payphone Developer.

Ejemplo encriptación:
<!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>Objeto JSON: <pre id="objetJSON"></pre></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(objet) {
const key = CryptoJS.enc.Utf8.parse('your_coding_password');
const iv = CryptoJS.enc.Utf8.parse('');
const encrypted = CryptoJS.AES.encrypt(objet, key,{ iv: iv });
const result_aes = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
return result_aes;
}
let objetJSON=[
{
"Identifier":"+593999999999",
"Type": 4,
"Amount": 500
},
{
"Identifier": "0123456789001",
"Type": 3,
"Amount": 442
}
];
//ejecutar funcion de encriptacion para obtener transferTo
let myTransferTo=encrypted_aes(JSON.stringify(objetJSON));
//se muestra resultados
document.getElementById("objetJSON").innerHTML=JSON.stringify(objetJSON, null, 2);
document.getElementById("result").innerHTML=myTransferTo;
console.log("Valor Encriptado : "+myTransferTo);
</script>
</body>
</html>
<?php
//funcion que encripta en AES 256 CBC sin vector de inicializacion
function encrypt($object) {
error_reporting(E_ERROR | E_PARSE | E_NOTICE);
$encrypted = base64_encode(openssl_encrypt($object,'AES-256-CBC',"your-coding-password",OPENSSL_RAW_DATA,""));
error_reporting(E_ALL);
return $encrypted;
}
//Objeto JSON que contiene los usuarios y los montos a dividir
$objetJSON=array(
array(
"Identifier"=> "+593984112233",
"Type"=> 4,
"Amount"=>500
),
array(
"Identifier"=> "0123456789001",
"Type"=> 3,
"Amount"=>442
)
);
//ejecutar funcion de encriptacion para obtener transferTo
$transferTo=encrypt(json_encode($objetJSON));
//se muestra resultados
echo "<h1>Encriptacion AES 256 CBC sin vector de inicializacion</h1>";
echo "Respuesta : <pre>".json_encode($objetJSON,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
echo "<a>Valor Encriptado : <strong>$transferTo</strong></a>";
?>
Generación de transacciones con Split:
Una vez implementados estos pasos, el comercio podrá generar transacciones utilizando la división de montos con el parámetro transferTo, para esto se debe realizar una solicitud HTTP POST normal a cualquiera de nuestros servicios pero esta vez cuenta con la funcionalidad de split.
Las url de los endpoint y cabeceras necesarias serán los mismo que se especifican en la documentación de cada servicio.
Lo único que cambiará es la configuración del cuerpo de la solicitud.
Estructura del Cuerpo de la Solicitud:
El cuerpo de la solicitud debe ser un objeto JSON similar al que estas utilizando en el servicio seleccionado de Payphone donde se indica montos y demás información para la transacción, pero se debe agregar el nuevo parámetro transferTo como se muestra en el ejemplo a continuación:
//Ejemplo de un cobro mixto: 1 USD con impuesto del 15% y 2 USD sin impuesto
{
"amount": 315, //monto total a cobrar, debe ser igual a la suma de los montos individuales
"amountWithoutTax": 200, //Monto que no está sujeto a impuestos.
"amountWithTax": 100, //Monto sujeto a impuestos, excluyendo el propio impuesto.
"tax": 15, //Monto del impuesto aplicado a la transacción.
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
"clientTransactionId": "ID_UNICO_X_TRANSACCION-001", //
"currency": "USD", //Código de moneda ISO 4217. (ej:USD)
"storeId": "your_storeId", //Identificador de la tienda que efectúa el cobro
"reference": "Pago con Boton", //Motivo o referencia específica del pago.
"responseUrl":"https://tu-dominio.com/ConfirmacionPago",
"transferTo": "{{JSON_encriptado}}"
}
<script>
//Ejemplo de un cobro mixto: 1 USD con impuesto del 15% y 2 USD sin impuesto
window.addEventListener('DOMContentLoaded',()=>{
ppb = new PPaymentButtonBox({
token: 'ACA TU TOKEN', //credenciales de acceso, se genera en payphone developer
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
clientTransactionId: 'ID_UNICO_X_TRANSACCION-001',
amount: 315, // Valor total de la factura a cobrar
amountWithoutTax: 200, //Monto que no está sujeto a impuestos.
amountWithTax:100, //Monto que incluye el valor sujeto a impuestos, excluyendo el propio impuesto.
tax: 15, //Monto del impuesto aplicado a la transacción.
currency: "USD", //Código de moneda ISO 4217. (ej:USD)
storeId:"TU_STOREID", //Identificador único asignado a la transacción para su seguimiento.
reference:"Pago por venta Fact#001", //Motivo o referencia específica del pago.
transferTo: "{{encriptado}}" //Objeto JSON encriptado
}).render('pp-button');
})
</script>
//Ejemplo de un cobro mixto: 1 USD con impuesto del 15% y 2 USD sin impuesto
{
"amount": 315, //monto total a cobrar, debe ser igual a la suma de los montos individuales
"amountWithoutTax": 200, //Monto que no está sujeto a impuestos.
"amountWithTax": 100, //Monto sujeto a impuestos, excluyendo el propio impuesto.
"tax": 15, //Monto del impuesto aplicado a la transacción.
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
"clientTransactionId": "ID_UNICO_X_TRANSACCION-001", //
"currency": "USD", //Código de moneda ISO 4217. (ej:USD)
"storeId": "your_storeId", //Identificador de la tienda que efectúa el cobro
"reference": "Pago con API Link", //Motivo o referencia específica del pago.
"transferTo": "{{JSON_encriptado}}"
}
Proceso de pago: Con esto solo queda seguir el proceso normal de pago.
- El cliente realice el pago normalmente desde uno de los servicios Payphone pero esta vez dispone con la funcionalidad de split de pagos.
- Si la transacción es aprobada, Payphone realiza el la división de los montos de acuerdo con las configuraciones indicadas.
Ejemplos de solicitudes POST con split de pagos
A continuación, se presenta varios ejemplos de cómo realizar solicitudes POST con split de pagos:
<?php
//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);
//Respuesta en formato JSON
$curl_response = curl_exec($curl);
//Finaliza solicitud curl: POST
curl_close($curl);
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_coding_password",OPENSSL_RAW_DATA,""));
error_reporting(E_ALL);
return $encrypted;
}
/*## Preparar credenciales como variables para la solicitud ##*/
$token="your_token";
$storeId="your_storeID";
/*## Preparar Datos para la transaccion ##*/
//Genera Dato Unico por transaccion
$clientTransactionID = substr((date("ymd-Hi-s").gettimeofday()["usec"]),0, 16);
//monto total a cobrar
$totalAmount=1000;
//valor dividir entre usuarios: monto total - 5.75% de comision.
//Ej: De $10 menos el porcentaje de comision, el valor que se podria dividir es $9.42
$amountUser1=500; //montos entregado a usuario 1
$amountUser2=442; //montos entregado a usuario 2
//Objeto JSON que contiene los usuarios y los montos a dividir
$objetJSON=array(
array(
"Identifier"=> "+593999999999",
"Type"=> 4,
"Amount"=>$amountUser1
),
array(
"Identifier"=> "0123456789001",
"Type"=> 3,
"Amount"=>$amountUser2
)
);
//ejecutar funcion de encriptacion para obtener transferTo
$transferTo=encrypt(json_encode($objetJSON));
/*## Preparar informacion para la solicitud POST ##*/
//URL del servicio payphone
$url="https://pay.payphonetodoesposible.com/api/button/Prepare";
//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(
"amount"=> $totalAmount, //monto total a cobrar, debe ser igual a la suma de los montos individuales
"amountWithoutTax"=> $totalAmount, //Monto que no está sujeto a impuestos.
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
"clientTransactionId"=> $clientTransactionID, //
"currency"=> "USD", //Código de moneda ISO 4217. (ej:USD)
"storeId"=> $storeId, //Identificador de la tienda que efectúa el cobro
"reference"=> "Pago con Boton", //Motivo o referencia específica del pago.
"responseUrl"=>"https://tu-dominio.com/ConfirmacionPago",
"transferTo"=> $transferTo
);
$bodyJSON = json_encode($data); //objeto de tipo JSON
//realizar solicitud http POST
$result=curlPost($url, $headers,$bodyJSON);
//Mostrar Resultado en Pantalla
echo "<h1>Prueba de Transaccion con split</h1> <br>";
echo "Cuerpo Solicitud : <pre>".json_encode($data,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
echo "Valores a Dividir: <pre>".json_encode($objetJSON,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
echo "Respuesta : <pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
echo "<br>";
if(isset($result->payWithCard)){
echo "PAGAR CON TARJETA : <a href='".$result->payWithCard."'>CLIC AQUI</a>";
}
?>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Split con Cajita de pagos</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdn.payphonetodoesposible.com/box/v1.1/payphone-payment-box.js" type="module" ></script>
<link href="https://cdn.payphonetodoesposible.com/box/v1.1/payphone-payment-box.css" rel="stylesheet" >
</head>
<body>
<h1>Split con Cajita de pagos</h1>
<div style="display: flex;">
<div style="padding-right: 20px;border: 1px solid;">
<a>Valor a Cobrar : <strong id="monto"></strong></a><br>
<a>Valores a Dividir : <pre id="objetJSON"></pre></a>
</div>
<div>
<a>PAGAR CON CAJITA</a><br>
<div id="pp-button"></div>
</div>
</div>
<script>
//funcion que encripta en AES 256 CBC sin vector de inicializacion
function encrypted_aes(objet) {
const key = CryptoJS.enc.Utf8.parse('your_coding_password');
const iv = CryptoJS.enc.Utf8.parse('');
const encrypted = CryptoJS.AES.encrypt(objet, key,{ iv: iv });
const result_aes = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
return result_aes;
}
/*## Preparar credenciales como variables para la solicitud ##*/
const myToken="your_token";
const myStoreId="your_storeID";
/*## Preparar Datos para la transaccion ##*/
//Genera Dato Unico por transaccion
let fecha = new Date();
let myClientTransactionId=fecha.toISOString()+"-5";
//monto total a cobrar
let totalAmount=1000;
//valor dividir entre usuarios: monto total - 5.75% de comision.
//Ej: De $10 menos el porcentaje de comision, el valor que se podria dividir es $9.42
let amountUser1=500; //montos entregado a usuario 1
let amountUser2=442; //montos entregado a usuario 2
//Objeto JSON que contiene los usuarios y los montos a dividir
let objetJSON=[
{
"Identifier":"+593999999999",
"Type": 4,
"Amount": amountUser1
},
{
"Identifier": "0123456789001",
"Type": 3,
"Amount": amountUser2
}
];
//ejecutar funcion de encriptacion para obtener transferTo
let myTransferTo=encrypted_aes(JSON.stringify(objetJSON));
window.addEventListener('DOMContentLoaded',()=>{
ppb = new PPaymentButtonBox({
token: myToken, //credenciales de acceso, se genera en payphone developer
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
clientTransactionId: myClientTransactionId,
amount: totalAmount, // Valor total de la factura a cobrar
amountWithoutTax: totalAmount, //Monto que no está sujeto a impuestos.
currency: "USD", //Código de moneda ISO 4217. (ej:USD)
storeId: myStoreId, //Identificador único asignado a la transacción para su seguimiento.
reference:"Pago por venta Fact#001", //Motivo o referencia específica del pago.
transferTo: myTransferTo
}).render('pp-button');
})
// Mostrar en pnatalla datos relevantes
document.getElementById("monto").innerHTML="$"+Math.round(totalAmount/100); //Monto a cobrar
document.getElementById("objetJSON").innerHTML=JSON.stringify(objetJSON, null, 2); //montos a dividir
</script>
</body>
</html>
<?php
//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);
//Respuesta en formato JSON
$curl_response = curl_exec($curl);
//Finaliza solicitud curl: POST
curl_close($curl);
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_coding_password",OPENSSL_RAW_DATA,""));
error_reporting(E_ALL);
return $encrypted;
}
/*## Preparar credenciales como variables para la solicitud ##*/
$token="your_token";
$storeId="your_storeID";
/*## Preparar Datos para la transaccion ##*/
//Genera Dato Unico por transaccion
$clientTransactionID = substr((date("ymd-Hi-s").gettimeofday()["usec"]),0, 15);
//monto total a cobrar
$totalAmount=1000;
//valor dividir entre usuarios: monto total - 5.75% de comision.
//Ej: De $10 menos el porcentaje de comision, el valor que se podria dividir es $9.42
$amountUser1=500; //montos entregado a usuario 1 : $5
$amountUser2=442; //montos entregado a usuario 2 : $4.42
//Objeto JSON que contiene los usuarios y los montos a dividir
$objetJSON=array(
array(
"Identifier"=> "+593999999999",
"Type"=> 4,
"Amount"=>$amountUser1
),
array(
"Identifier"=> "0123456789001",
"Type"=> 3,
"Amount"=>$amountUser2
)
);
//ejecutar funcion de encriptacion para obtener transferTo
$transferTo=encrypt(json_encode($objetJSON));
/*## Preparar informacion para la solicitud POST ##*/
//URL del servicio payphone
$url="https://pay.payphonetodoesposible.com/api/Links";
//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(
"amount"=> $totalAmount, //monto total a cobrar, debe ser igual a la suma de los montos individuales
"amountWithoutTax"=> $totalAmount, //Monto que no está sujeto a impuestos.
//Identificador único asignado por el comercio a cada transacción para su seguimiento.
"clientTransactionId"=> $clientTransactionID, //
"currency"=> "USD", //Código de moneda ISO 4217. (ej:USD)
"storeId"=> $storeId, //Identificador de la tienda que efectúa el cobro
"reference"=> "Pago con Boton", //Motivo o referencia específica del pago.
"transferTo"=> $transferTo
);
$bodyJSON = json_encode($data); //objeto de tipo JSON
//realizar solicitud http POST
$result=curlPost($url, $headers,$bodyJSON);
//Mostrar Resultado en Pantalla
echo "<h1>Prueba Link de pago con split</h1>";
echo "Cuerpo Solicitud : <pre>".json_encode($data,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
echo "Valores a Dividir: <pre>".json_encode($objetJSON,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
if(is_string($result)){
echo "<h3>Link creado</h3>";
echo "<a>".$result."</a><br><br>";
echo "<a href='$result' target='_blank'>PAGAR MEDIANTE LINK</a>";
}else{
echo "<pre>".json_encode($result,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )."</pre>";
}
?>
Recuerda que en caso de boton o cajita luego del pago se realiza la confirmación de la transacción, como se encuentra en la documentación.
¡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 visualizar las transacciones con split de pagos desde Payphone Business.