Página de Respuesta

La Página de Respuesta es una página obligatoria que te permite mostrar el resultado de la transacción al pagador. Nuestro sistema redirecciona al pagador a esta página una vez la transacción haya sido realizada. La información de los resultados del pago es enviada a tu sistema a través del método HTTP GET.
Esta página es invocada para todos los estados de la transacción: aprobada, rechazada, en validación, esperando el pago (para pagos en efectivo), etc.

Consideraciones

  • Algunos proveedores de hosting tienen configuraciones que no permite enviar URLs como valores de parámetros. Por ejemplo: &merchant_url=http%3A%2F%2Fwww.mitienda.com
  • Para cuentas de Brasil, no hay redirección a la página de respuesta.
  • No dependas de la página de respuesta para actualizar tu base de datos o ejecutar procesos ya que es posible que el usuario no regrese a la misma; utiliza la página de confirmación.
  • Si quieres mostrar información relacionada con la transacción, te sugerimos mostrar como mínimo lo siguiente: estado, referencia, valor, moneda y fecha.
  • Se recomienda enviar el parámetro responseUrl en el formulario de pago o configurarlo en el Módulo PayU; tiene mayor prioridad el enviado como parámetro. Si PayU no encuentra ninguno, el proceso de pago finaliza en el Webcheckout.

Variables

Variables enviadas a la Página de respuesta.

Variables enviadas a la Página de respuesta
Campo Tipo Tamaño Descripción Aplica para
merchantId Numérico 12 Identificador de tu tienda en el sistema de PayU, puedes encontrar este número en el correo de creación de tu cuenta.
transactionState Numérico 2 Indica el estado de la transacción en el sistema.
Ver los estados de la transacción en la columna respectiva.
risk Decimal (#.00) Riesgo asociado con la transacción. Los posibles valores están entre 0 y 1.
Entre mayor sea el valor, mayor es el riesgo.
Formato ###.00.
polResponseCode Alfanumérico 64 Código de respuesta.
Ver los códigos de respuesta en la columna respectiva.
referenceCode Alfanumérico 255 Referencia de la venta o la orden. Debe ser única por cada transacción enviada al sistema.
reference_pol Alfanumérico 255 Referencia o número de transacción generado por PayU.
signature Alfanumérico 255 Firma digital creada por cada transacción.
polPaymentMethod Alfanumérico 255 Identificador interno utilizado por los métodos de pago.
polPaymentMethodType Numérico 2 Método de pago utilizado.
Ver los códigos de los métodos de pago.
installmentsNumber Numérico 2 Número de cuotas en las cuales se difirió el pago con tarjeta crédito.
TX_VALUE Numérico 14,2 Valor total de la transacción. Puede contener dos dígitos decimales. Por ejemplo 10000.00 o 10000.
TX_TAX Numérico 14,2 Valor del IVA de la transacción, si no se envió IVA, el sistema aplica el 19% automáticamente.
Puede contener dos dígitos decimales. Por ejemplo 19000.00.
En caso de que no tenga IVA, debe enviarse 0.
buyerEmail Alfanumérico 255 Campo que contiene el correo electrónico del comprador para notificar el resultado de la transacción. Se recomienda validarlo cuando se toma este valor del formulario.
processingDate Fecha (AAAA-MM-DD HH:mm:ss) Fecha en la que se realizó la transacción.
currency Alfanumérico 3 Moneda respectiva en la que se hace el pago. El proceso de conciliación se realiza en pesos colombianos a la tasa representativa del día.
cus Alfanumérico 255 El CUS, Código Único de Seguimiento, es la referencia de pago dentro del banco, aplica solo para pagos con PSE. PSE Colombia.
pseBank Alfanumérico 255 Nombre del banco, aplica solo para pagos con PSE. PSE Colombia.
lng Alfanumérico 2 Idioma en el que se quiere mostrar la pasarela de pagos.
description Alfanumérico 255 Descripción de la venta.
lapResponseCode Alfanumérico 64 Código de Respuesta entregado por PayU.
Ver los códigos de respuesta en la columna respectiva.
lapPaymentMethod Alfanumérico 255 Método de pago utilizado, por ejemplo VISA.
lapPaymentMethodType Alfanumérico 255 Tipo del método de pago utilizado, por ejemplo CREDIT_CARD.
lapTransactionState Alfanumérico 32 Estado de la transacción.
Ver los estados de la transacción en la columna respectiva.
message Alfanumérico 255 Descripción del estado de la transacción.
extra1 Alfanumérico 255 Campo adicional para enviar información relacionada con la compra.
extra2 Alfanumérico 255 Campo adicional para enviar información relacionada con la compra.
extra3 Alfanumérico 255 Campo adicional para enviar información relacionada con la compra.
authorizationCode Alfanumérico 12 Código de autorización de la venta.
merchant_address Alfanumérico 255 Dirección del comercio.
merchant_name Alfanumérico 255 Nombre del comercio.
merchant_url Alfanumérico 255 URL de la página web del comercio.
orderLanguage Alfanumérico 2 Idioma de la orden (ISO-639-1).
pseCycle Numérico Identificador generado por PSE. PSE Colombia
pseReference1 Alfanumérico 255 Referencia no. 1 por PSE payments. PSE Colombia
pseReference2 Alfanumérico 255 Referencia no. 2 por PSE payments. PSE Colombia
pseReference3 Alfanumérico 255 Referencia no. 3 por PSE payments. PSE Colombia
telephone Alfanumérico 20 Teléfono del comercio.
transactionId Alfanumérico 36 Identificador del comercio.
trazabilityCode Alfanumérico 64 Código de trazabilidad de la venta en la página web del comercio.
TX_ADMINISTRATIVE_FEE Decimal (#.00) Valor de la tarifa administrativa.
TX_TAX_ADMINISTRATIVE _FEE Decimal (#.00) Valor del impuesto de la tarifa administrativa.
TX_TAX_ADMINISTRATIVE _FEE_RETURN_BASE Decimal (#.00) Valor base de la tarifa administrativa para reintegro de impuestos.
action_code_description Alfanumérico 255 Descripción del código de respuesta de VISANET. VISANET Perú
cc_holder Alfanumérico 150 Nombre del tarjetahabiente. VISANET Perú
cc_number Alfanumérico Número de la tarjeta de crédito. VISANET Perú
processing_date_time Fecha (AAAA-MM-DD) Fecha de procesamiento de la venta. VISANET Perú
request_number Alfanumérico 9 Número de Orden + identificador de la transacción. VISANET Perú

Integrar la página de respuesta

El siguiente es un ejemplo en PHP de cómo integrar la página de respuesta:

<?php
$ApiKey = "4Vj8eK4rloUd272L48hsrarnUA";
$merchant_id = $_REQUEST['merchantId'];
$referenceCode = $_REQUEST['referenceCode'];
$TX_VALUE = $_REQUEST['TX_VALUE'];
$New_value = number_format($TX_VALUE, 1, '.', '');
$currency = $_REQUEST['currency'];
$transactionState = $_REQUEST['transactionState'];
$firma_cadena = "$ApiKey~$merchant_id~$referenceCode~$New_value~$currency~$transactionState";
$firmacreada = md5($firma_cadena);
$firma = $_REQUEST['signature'];
$reference_pol = $_REQUEST['reference_pol'];
$cus = $_REQUEST['cus'];
$extra1 = $_REQUEST['description'];
$pseBank = $_REQUEST['pseBank'];
$lapPaymentMethod = $_REQUEST['lapPaymentMethod'];
$transactionId = $_REQUEST['transactionId'];

if ($_REQUEST['transactionState'] == 4 ) {
	$estadoTx = "Transacción aprobada";
}

else if ($_REQUEST['transactionState'] == 6 ) {
	$estadoTx = "Transacción rechazada";
}

else if ($_REQUEST['transactionState'] == 104 ) {
	$estadoTx = "Error";
}

else if ($_REQUEST['transactionState'] == 7 ) {
	$estadoTx = "Pago pendiente";
}

else {
	$estadoTx=$_REQUEST['mensaje'];
}


if (strtoupper($firma) == strtoupper($firmacreada)) {
?>
	<h2>Resumen de la transacción</h2>
	<table>
	<tr>
	<td>Estado de la transacción</td>
	<td><?php echo $estadoTx; ?></td>
	</tr>
	<tr>
	<tr>
	<td>ID de la transacción</td>
	<td><?php echo $transactionId; ?></td>
	</tr>
	<tr>
	<td>Referencia de venta</td>
	<td><?php echo $reference_pol; ?></td>
	</tr>
	<tr>
	<td>Referencia de la transacción</td>
	<td><?php echo $referenceCode; ?></td>
	</tr>
	<tr>
	<?php
	if($pseBank != null) {
	?>
		<tr>
		<td>cus </td>
		<td><?php echo $cus; ?> </td>
		</tr>
		<tr>
		<td>Banco </td>
		<td><?php echo $pseBank; ?> </td>
		</tr>
	<?php
	}
	?>
	<tr>
	<td>Valor total</td>
	<td>$<?php echo number_format($TX_VALUE); ?></td>
	</tr>
	<tr>
	<td>Moneda</td>
	<td><?php echo $currency; ?></td>
	</tr>
	<tr>
	<td>Descripción</td>
	<td><?php echo ($extra1); ?></td>
	</tr>
	<tr>
	<td>Entidad:</td>
	<td><?php echo ($lapPaymentMethod); ?></td>
	</tr>
	</table>
<?php
}
else
{
?>
	<h1>Error validando la firma digital.</h1>
<?php
}
?>

Ejemplo GET enviado a la página de respuesta.

http://mypaginadeprueba.com/response.php?&merchantId=508029&merchant_name=Test+PayU+Test&merchant_address=Av+123+Calle+12&telephone=7512354&merchant_url=http%3A%2F%2Fpruebaslapv.xtrweb.com&transactionState=6&lapTransactionState=DECLINED&message=Declinada&referenceCode=2015-05-27+13%3A04%3A37&reference_pol=7069375&transactionId=f5e668f1-7ecc-4b83-a4d1-0aaa68260862&description=test_payu_01&trazabilityCode=&cus=&orderLanguage=es&extra1=&extra2=&extra3=&polTransactionState=6&signature=e1b0939bbdc99ea84387bee9b90e4f5c&polResponseCode=5&lapResponseCode=ENTITY_DECLINED&risk=1.00&polPaymentMethod=10&lapPaymentMethod=VISA&polPaymentMethodType=2&lapPaymentMethodType=CREDIT_CARD&installmentsNumber=1&TX_VALUE=100.00&TX_TAX=.00&currency=USD&lng=es&pseCycle=&buyerEmail=test%40payulatam.com&pseBank=&pseReference1=&pseReference2=&pseReference3=&authorizationCode=&TX_ADMINISTRATIVE_FEE=.00&TX_TAX_ADMINISTRATIVE_FEE=.00&TX_TAX_ADMINISTRATIVE_FEE_RETURN_BASE=.00

Validación de la firma

La validación de la firma te permite comprobar la integridad de los datos, debes generar la firma con los datos que encuentras en la página de respuesta y compararla con la información del parámetro signature.

Para validar la firma en la página de respuesta debes tener en cuenta:

  • Para obtener el nuevo valor new_value se debe aproximar TX_VALUE siempre a un decimal con el método de redondeo Round half to even:
    • Si el primer decimal es par y el segundo es 5, redondéalo hacia el menor valor.
    • Si el primer decimal es impar y el segundo es 5, redondéalo hacia el mayor valor.
    • Si no, debes redondearlo al decimal más cercano.
  • Obten los parámetros para generar la firma (merchantId, referenceCode, TX_VALUE, currency y transactionState) de la página de respuesta, no de la base de datos.
  • Debes guardar tu ApiKey de forma segura.
  • Crea la firma así:
"ApiKey~merchantId~referenceCode~new_value~currency~transactionState"

Ejemplos:

Primer decimal es par y el segundo es 5

Your apiKey: 4Vj8eK4rloUd272L48hsrarnUA
Parámetros obtenidos de la página de respuesta:
- merchantId = 508029
- referenceCode = TestPayU04
- TX_VALUE = 150.25
- currency = USD
- transactionState = 6

La firma se genera así:
MD5(4Vj8eK4rloUd272L48hsrarnUA~508029~TestPayU04~150.2~USD~6) = 00286dc735bd9eaa8ae3a3a4cbb40688

signature = 00286dc735bd9eaa8ae3a3a4cbb40688

Primer decimal es impar y el segundo es 5

Your apiKey: 4Vj8eK4rloUd272L48hsrarnUA 
Parámetros obtenidos de la página de respuesta:
- merchantId = 508029
- referenceCode = TestPayU04
- TX_VALUE = 150.35
- currency = USD
- transactionState = 6

La firma se genera así:
MD5(4Vj8eK4rloUd272L48hsrarnUA~508029~TestPayU04~150.4~USD~6) = 9df2bb60e2838170009040982967923f

signature = 9df2bb60e2838170009040982967923f 

Otros casos

Your apiKey: 4Vj8eK4rloUd272L48hsrarnUA 
Parámetros obtenidos de la página de respuesta:
- merchantId = 508029
- referenceCode = TestPayU04
- TX_VALUE = 150.34
- currency = USD
- transactionState = 6

La firma se genera así:
MD5(4Vj8eK4rloUd272L48hsrarnUA~508029~TestPayU04~150.3~USD~6) = 779f163be9347a691bcdb25064644795

signature = 779f163be9347a691bcdb25064644795 

Compara tu firma

Algoritmo:  

 ( ~ ~ ~ ~ ~ )


Resultado: 

Esta calculadora te permite generar la firma utilizando alguno de los métodos de cifrado disponibles.

Última modificación 24 de junio de 2022: clon issue (d73e43fe5)