Problemas con manejo de excepciones (SDK PHP)

843 views
Skip to first unread message

Danilo Quispe Lucana

unread,
Dec 4, 2014, 4:23:24 PM12/4/14
to desarrollador...@googlegroups.com
Hola:

Tengo un problema utilizando el SDK de PayU para PHP:

Estoy utilizando el SDK para integrar PayU a un carrito de compras hecho a medida para una tienda en el Perú. Cuando hago pruebas ingresando datos "correctos" todo va bien, pero cuando ingreso intencionalmente algún dato no válido (por ejemplo un número de tarjeta de crédito no válido), el programa se cuelga. He depurado el código usando Zend Debugger y, cuando se ejecuta el código del SDK veo que detecta correctamente el dato erróneo e intenta lanzar una excepción para indicar el error, pero llegado al punto en que se lanza la excepción el programa se detiene.

Este es el código que estoy utilizando (las variables en la sección de inicialización tienen sus valores de prueba correspondientes al Perú):

// Configuración inicial de PayU
           
PayU::$apiKey = PAYU_API_KEY;
           
PayU::$apiLogin = PAYU_API_LOGIN;
           
PayU::$merchantId = PAYU_ID_COMERCIO;
           
PayU::$language = SupportedLanguages::ES;
           
PayU::$isTest = PAYU_TEST;
           
// URL de pagos
           
Environment::setPaymentsCustomUrl(PAYU_API_URL_PAGOS);
           
// Autorización y captura:
           
// Consulta de disponibilidad y o reserva del saldo en la tarjeta de crédito
           
try
           
{
                $params
= array(
               
PayUParameters::ACCOUNT_ID => PAYU_ID_CUENTA,
               
PayUParameters::REFERENCE_CODE => md5($pedido->getNombreCliente()),
               
PayUParameters::DESCRIPTION => 'Pedido desde sitio web Next Level Entertainment (nextlevel.com.pe)',
               
// Costo del pedido
               
PayUParameters::VALUE => $_POST['total'],
               
PayUParameters::CURRENCY => 'PEN',
               
// Datos del comprador
               
PayUParameters::BUYER_NAME => $pedido->getNombreCliente(),
               
PayUParameters::BUYER_EMAIL => $pedido->getEmailCliente(),
               
PayUParameters::BUYER_CONTACT_PHONE => $pedido->getTelefonoCliente(),
               
// Datos del pagador
               
PayUParameters::PAYER_NAME => $pedido->getNombreEnTarjetaCredito(),
               
PayUParameters::PAYER_EMAIL => $pedido->getEmailCliente(),
               
PayUParameters::PAYER_CONTACT_PHONE => $pedido->getTelefonoCliente(),
               
// Tarjeta de crédito
               
PayUParameters::CREDIT_CARD_NUMBER => $pedido->getNumTarjetaCredito(),
               
PayUParameters::CREDIT_CARD_EXPIRATION_DATE => str_replace('-', '/', $pedido->getFechaExpiraciontarjetaCredito()),
               
PayUParameters::CREDIT_CARD_SECURITY_CODE => $pedido->getCVC2(),
               
PayUParameters::PAYMENT_METHOD => $payu_tcred,
               
PayUParameters::PROCESS_WITHOUT_CVV2 => $pedido->getCVC2() == '',
               
PayUParameters::INSTALLMENTS_NUMBER => 1,  // Número de cuotas
               
PayUParameters::COUNTRY => PayUCountries::PE);
                $rpta_pago
= PayUPayments::doAuthorizationAndCapture($params);  // Aquí el programa se detiene...
               
if ($rpta_pago)
               
{
                    var_dump
($rpta_pago);
               
}
           
}
           
catch (PayUException $e)
           
{
                header
("Location: ../carrito.php?paso=5&error={$e->getMessage()}");
           
}



Estoy utilizando un bloque try/catch para atrapar los posibles eventos de error tras la llamada a PayUParameters::doAuthorizationAndCapture() y, en caso de algún problema, redirija a una página de error para mostrar un mensaje con el problema ocurrido; pero llegado a este punto la ejecución del programa se detiene por lo antes indicado.

¿Cómo se podría solucionar este tema? ¿O existe algún otro mecanismo para manejo de errores de validación con el SDK de PayU?

Gracias

ADMIN AP

unread,
Dec 5, 2014, 11:14:38 AM12/5/14
to desarrollador...@googlegroups.com

Hola Danilo, 

¿La respuesta del error que te sale es similar a esta?


Fatal error: Uncaught exception 'PayUException' with message 'The number of the credit card is not valid, credit card: [409744*******0043], type: [VISA]' in E:\xampp\htdocs\sdkPHP\4.5.7\lib\PayU\util\PayUApiServiceUtil.php:67 Stack trace: #0 E:\xampp\htdocs\sdkPHP\4.5.7\lib\PayU\PayUPayments.php(196): PayUApiServiceUtil::sendRequest(Object(stdClass), Object(PayUHttpRequestInfo)) #1 E:\xampp\htdocs\sdkPHP\4.5.7\lib\PayU\PayUPayments.php(84): PayUPayments::doPayment(Array, 'AUTHORIZATION_A...', NULL) #2 E:\xampp\htdocs\sdkPHP\index_prueba.php(86): PayUPayments::doAuthorizationAndCapture(Array) #3 E:\xampp\htdocs\sdkPHP\index_prueba.php(26): visaPeru() #4 {main} thrown in E:\xampp\htdocs\sdkPHP\4.5.7\lib\PayU\util\PayUApiServiceUtil.php on line 67

Adicionalmente ten en cuenta que para los medios de pago de Perú no es necesario que captures los datos de tarjeta ya que para este país manejamos 3Dsecurity, por lo tanto el proceso de pago varía un poco, mira http://desarrolladores.payulatam.com/sdk-pagos/ en la sección de procesamiento de pagos, Perú.

Danilo Quispe Lucana

unread,
Mar 24, 2015, 10:24:44 AM3/24/15
to desarrollador...@googlegroups.com
Hola:

Estoy retomando la revisión de la programación del sitio web, y ahora he agregado código adicional.

Ahora, antes de llamad a PayUParameters::doAuthorizationAndCapture() estoy llamando primero a PayUPayments::doPing(SupportedLanguages::ES) para verificar primero la disponibilidad del servicio. el caso es que ahora me devuelve una excepción con este contenido en JSON:

{"code":"ERROR","error":"No cuenta con los permisos requeridos para efectuar la operación solicitada, para mayor información comuniquese con el servicio de atención al cliente.","transactionResponse":null}

Estas pruebas las estoy haciendo con una copia del sitio web completo corriendo en un servidor local (localhost).

¿Por qué me sale ahora este nuevo error?

AdminSD

unread,
Mar 24, 2015, 6:27:17 PM3/24/15
to desarrollador...@googlegroups.com
Hola,

Esto se debe a que tu cuenta no tiene permisos para hacer peticiones y consultas Web Service.

Para dar gestión a la activación de estos permisos, sugiero que te comuniques con tu asesor comercial o si no tienes, envía un correo a s...@payulatam.com

Danilo Quispe Lucana

unread,
Apr 8, 2015, 3:37:42 PM4/8/15
to desarrollador...@googlegroups.com
Este es el código que estamos utilizando para hacer PING al servicio de PayU:

// Configuración inicial de PayU
PayU::$apiKey = PAYU_API_KEY;
PayU::$apiLogin = PAYU_API_LOGIN;
PayU::$merchantId = PAYU_ID_COMERCIO;
PayU::$language = SupportedLanguages::ES;
PayU::$isTest = PAYU_TEST;
try
{
   
// Verificando disponibilidad del servicio
    $hace_ping
= PayUPayments::doPing(SupportedLanguages::ES);
   
// Más código...

}
catch (PayUException $e)
{
    header
("Location: ../carrito.php?paso=5&error={$e->getMessage()}");
}

donde los valores de las variables de inicialización son los valores reales de la cuenta de Prado International Business (no son datos de prueba) y el de la variable PAYU_TEST es FALSE.

Pongo solamente el código del PING porque es aquí donde se genera el error.

Quedamos a la espera de su respuesta.

Danilo Quispe Lucana

unread,
Apr 8, 2015, 3:37:42 PM4/8/15
to desarrollador...@googlegroups.com
Buenos días,

Hemos hablado en repetidas ocasiones con nuestro asesor comercial de PayU y nos ha mandado correos confirmando la activación de los permisos necesarios. Aun así, seguimos con el mismo problema y el mismo mensaje (que no tenemos los permisos necesarios y que hablemos con Atención al cliente).

Este ya se ha vuelto un tema para resolver con suma urgencia. ¿Qué más se puede hacer?

ADMIN AP

unread,
Apr 9, 2015, 11:33:40 AM4/9/15
to desarrollador...@googlegroups.com
Hola Danilo, 

Te confirmo que el área encargada me indicó que ya se encuentra activa la opción de API. 

ger14

unread,
Aug 17, 2016, 5:57:25 PM8/17/16
to Desarrolladores PayU Latam
Hola buen día, lamento comentar sobre un tema antiguo, pero es exactamente mi duda..
Para manejar la excepción mencionada por Danilo, yo hago lo siguiente: (también estoy trabajando con su SDK de PHP)

try {
     $response = PayUPayments::doAuthorizationAndCapture($this->parameters);
} catch (Exception $e) {
    $response = false;
}

Entonces de esta forma ya valido mi variable $response...
El detalle es, como puedo obtener una respuesta del error que esta arrojando Payu??
Porque efectivamente, el principal motivo por el cual me ha generado error, es por el formato de datos, principalmente la fecha de nacimiento y el numero de tarjeta (q sea válido), pero de esto me di cuenta despues de varios intentos, pruebas y ...  mucho tiempo x.x
Entonces, como podría obtener una respuesta concreta de Payu de lo que me está generando error??
Saludos y quedo atento a su respuesta, gracias!!

ADMIN

unread,
Aug 17, 2016, 6:30:46 PM8/17/16
to Desarrolladores PayU Latam
Buenas tardes,

Te informamos que es posible utilizar el siguiente ejemplo para mostrar en pantalla la respuesta que obtienes del API:

$response = PayUPayments::doAuthorizationAndCapture($parameters);

if ($response) {
    $response->transactionResponse->orderId;
    $response->transactionResponse->transactionId;
    $response->transactionResponse->state;
    if ($response->transactionResponse->state == "PENDING") {
        $response->transactionResponse->pendingReason;
    }
    $response->transactionResponse->paymentNetworkResponseCode;
    $response->transactionResponse->paymentNetworkResponseErrorMessage;
    $response->transactionResponse->trazabilityCode;
    $response->transactionResponse->responseCode;
    $response->transactionResponse->responseMessage;
    $response->transactionResponse->response_message_pol;
    $response->transactionResponse->authorizationCode;
    $response->transactionResponse->operationDate;
}
print_r($response);

Con la función print_r() imprimirás la respuesta. Por ejemplo, para el caso de error por tarjeta de crédito inválida el resultado será:
Fatal error: Uncaught exception 'PayUException' with message 'El número de la tarjeta de crédito no es válido, tarjeta crédito: [412345*****1234], tipo: [VISA]' in...

De igual forma, es posible modificar tu código para imprimir la respuesta encontrada en la excepción:
try {
     $response = PayUPayments::doAuthorizationAndCapture($parameters);
} catch (Exception $e) {
    print_r($e);
    $response = false;
}

Y la respuesta presentada será:

PayUException Object ( [payUCode] => API_ERROR [message:protected] => El número de la tarjeta de crédito no es válido, tarjeta crédito: [412345*****1234], tipo: [VISA] [string:Exception:private] => [code:protected] => 0 [file:protected]...

Esperamos que la información haya sido de utilidad.

ger14

unread,
Aug 19, 2016, 4:12:01 PM8/19/16
to Desarrolladores PayU Latam
Hola buen día, primero q nada, gracias por sus respuestas.
Efectivamente, estuve indagando en las clases de su librería, y llegué a la clase que arroja las excepciones (mediante PayUExcepcion)

class PayUErrorCodes{
/** json serialization error */
const JSON_SERIALIZATION_ERROR = 'JSON_SERIALIZATION_ERROR';
/** json deserialization error */
const JSON_DESERIALIZATION_ERROR= 'JSON_DESERIALIZATION_ERROR';
/** invalid parameters for build request */
const INVALID_PARAMETERS= 'INVALID_PARAMETERS';
/** connection error */
const CONNECTION_EXCEPTION= 'CONNECTION_EXCEPTION';
/** general api error */
const API_ERROR= 'API_ERROR';
}

Y mi try-catch quedó asi:

try {
$response = PayUPayments::doAuthorizationAndCapture($this->parameters);
} catch (PayUException $e){
    $response = $e;
}
return $response;

El detalle es que veo que sólo puede regresar 5 tipo de errores; por ejemplo, les había comentado que también había tenido problemas con el formato de fecha de Nacimiento, y esto entra en la excepción de invalid_parameters, pero mi duda era si había alguna forma de retornar algo más específico para indicarle al usuario en que datos está mal.
Probaré lo que me comentan, pero como lo veo, todo recaerá en la clase que menciono al principio (PayUErrorCodes)
Saludos!
Reply all
Reply to author
Forward
0 new messages