Transacciones declinadas, redirección a URL de VisaNet

337 views
Skip to first unread message

Danilo Quispe Lucana

unread,
Jun 2, 2015, 11:56:59 AM6/2/15
to desarrollador...@googlegroups.com
Hola:

Estamos trabajando con el SDK de PayU para PHP. Actualmente ya hemos logrado validar exitosamente los datos de la compra y enviarlos a la plataforma de PayU. El problema es que al final las transacciones siempre terminan declinadas. La respuesta que PayU nos ha dado (para casos de pago con tarjeta Visa) fue esta:

Queremos informarte que la transacción se rechazada debido a que el cliente pagador no termina de manera correcta el proceso de pago en la plataforma de Visanet, por tanto la respuesta del medio de pago no contiene un estado final y se procede al rechazo por un periodo de tiempo.

Imaginamos que para pagos con MasterCard debe ocurrir algo similar.

Revisando la documentación de PayU para Perú he visto que se menciona algo sobre "redireccionar a la URL de VisaNet" mediante un formulario HTTP POST, poniendo como ejemplo un formulario HTML. El tema es que no sabemos dónde colocarlo o hacer la llamada.

Hasta el momento, el carrito de compras de nuestro sitio web (programado en PHP a medida) funciona así:
  1. La secuencia de pasos del carrito de compras para el cliente termina en una pantalla mostrada por un archivo carrito-confirmar.php que contiene un formulario POST con su parámetro "action" dirigido a un script do-generar-pedido.php.
  2. Cuando el cliente da clic en un botón "Confirmar pedido" el control pasa al script do-generar-pedido.php que, entre otras cosas, se conecta con PayU y envía los datos de la compra, valida la tarjeta de crédito, invoca al método PayUPayments::doAuthorizationAndCapture($params) con todos los parámetros correctos y recibe una respuesta.
  3. Si obtengo una respuesta correcta tras la llamada a PayUPayments::doAuthorizationAndCapture($params), el script redirige al cliente a una pantalla final carrito-fin.php con lo que el proceso de la compra termina. Si en algún punto del camino se generara una excepción (lo cual indicaría un error en los datos del pedido detectado por PayU), el cliente es redirigido a otra pantalla carrito-error.php mostrando el mensaje error devuelto por PayU.
¿Dónde podría colocar este formulario? Imagino que en algún punto del paso 2, pero no sabemos exactamente dónde o cómo.

Lo primero que había pensado era usar llamadas jQuery (usando AJAX) tanto para el script que se conecta con PayU como para la redirección al formulario de VisaNet, algo como esto:

$('#btn-confirmar-pedido).click(function()
{
    $.post('do-generar-pedido.php', 'redirigir', 'json');
});

function redirigir()
{
    $.post('https://www.multimerchantvisanet.com/formularioweb/formulariopago.asp', { Eticket: '0500560091711308150853133360'}, 'fin', 'json')
}

function fin()
{
    location.href = 'carrito-fin.php';
}


Pero recuerdo haber leído en algún mensaje de este foro que la conexión con PayU no funciona con llamadas AJAX. ¿Es correcto eso? ¿Funcionaría un código así? ¿O como se podría hacer?
image007.jpg

ADMIN

unread,
Jun 2, 2015, 12:56:47 PM6/2/15
to desarrollador...@googlegroups.com

Hola Danilo.


Lo primero que debes entender es que en perú los pagos con tarjetas de crédito maneja 3Dsecure (también conocido como verified by visa), lo que implica que el usuario debe salir de la tienda donde está realizando la compra, al sitio que realiza la validación de la tarjeta de crédito; por lo que nunca vas a obtener una respuesta de aprobada inmediatamente después de hacer el doAuthorizationAndCapture.

Cuando realizas una petición al API para visa en perú vas a obtener una respuesta de pendiente (state), junto con una url (VISANET_PE_URL) y el Eticket (trazabilityCode) como la siguiente:

 

stdClass Object

(

    [code] => SUCCESS

    [transactionResponse] => stdClass Object

        (

            [orderId] => 91202415

            [transactionId] => 5fa97592-b6f9-442c-a125-bb69046376e2

            [state] => PENDING

            [trazabilityCode] => 0500560091701506021128410851

            [pendingReason] => AWAITING_NOTIFICATION

            [responseCode] => PENDING_TRANSACTION_CONFIRMATION

            [operationDate] => 2015-06-02T11:29:17

            [extraParameters] => stdClass Object

                (

                    [VISANET_PE_URL] => https://www.multimerchantvisanet.com/formularioweb/formulariopago.asp

                )

 

        )

 

)

 

 

Lo que debes hacer es redirigir al usuario a un formulario, hospedado también en tu servidor, con los datos que retorna el API. Puedes incluirle un evento onload de javascript para que haga el submit automático de este formulario sin que el usuario lo perciba. En este punto ya no tienes control de lo que sucede, pues el usuario pasará al sitio de visanet o puntoWeb  (para mastercard).

<form action="https://www.multimerchantvisanet.com/formularioweb/formulariopago.asp" method="post">
<input type="hidden" value="0500560091701506021128410851" name="Eticket">
<input type="submit">
</form>



En el sitio de visanet o puntoWeb el usuario deberá ingresar los datos de la tarjeta de crédito junto con información adicional para validar el pago, una vez el usuario finalice el proceso retornará  a la página de respuesta que debiste especificar en el siguiente parámetro


PayUParameters::RESPONSE_URL=>’http://www.misitioweb.com/carrito-fin.php

Reply all
Reply to author
Forward
0 new messages