mercadopago / DEPRECATED-sdk-php

DEPRECATED - MercadoPago PHP SDK
MIT License
1 stars 10 forks source link

500 Internal Error (PHP Version PHP 5.2) #79

Open bycross028 opened 7 years ago

bycross028 commented 7 years ago

Estoy implemente MercadoPago para realizar pagos en un sistema de facturación en PHP 5.2 y estoy teniendo problemas con el servidor de producción, de modo local funcion perfectamente bajo la version de PHP 5.2.5 con Apache y 5.2.17 ejecutado por consola (Es la misma versión que en producción pero no con apache), en ambos casos funciono de modo local.

En Todas las pruebas en producción, el servidor lanza un error 500 Internal Server Error, por ejemplo cuando llamo a la funcion create_preference(...). El error se produce específicamente en la clase MPRestClient, funcion exec($request) en la linea:

$api_result = curl_exec($connect);
// file: mercadopago.php
...
/**
 * MercadoPago cURL RestClient
 */
class MPRestClient {
    const API_BASE_URL = "https://api.mercadopago.com";

    private static function build_request($request) {
        //...

        return $connect;
    }

    private static function exec($request) {
    // private static function exec($method, $uri, $data, $content_type) {

        $connect = self::build_request($request);
        // >>>>>>>>>>   Aquí se produce el error  <<<<<<<<<<<<<
        $api_result = curl_exec($connect);
        $api_http_code = curl_getinfo($connect, CURLINFO_HTTP_CODE);

        if ($api_result === FALSE) {
            throw new MercadoPagoException (curl_error ($connect));
        }

        $response = array(
            "status" => $api_http_code,
            "response" => json_decode($api_result, true)
        );

        if ($response['status'] >= 400) {
            $message = $response['response']['message'];
            if (isset ($response['response']['cause'])) {
                if (isset ($response['response']['cause']['code']) && isset ($response['response']['cause']['description'])) {
                    $message .= " - ".$response['response']['cause']['code'].': '.$response['response']['cause']['description'];
                } else if (is_array ($response['response']['cause'])) {
                    foreach ($response['response']['cause'] as $cause) {
                        $message .= " - ".$cause['code'].': '.$cause['description'];
                    }
                }
            }

            throw new MercadoPagoException ($message, $response['status']);
        }

        curl_close($connect);

        return $response;
    }
...

Probé quietando alguna de las opciones cURL en la función build_request($request), para ver si era alguna incompatible en esta versión o algo por el estilo, pero nada funciono.

No he conseguido mas información sobre el posible error, se que el error es por algo del servidor, pero no puedo cambiar la versión con la que actualmente esta en funcionamiento.

Verifique todas las extensiones, pero solo depende de cURL y tal vez de OpenSSL.

Preguntas

Fix

Para que funcione en esta versión del servidor modifique la clase MercadoPagoException en el archivo mercadopago.php

// file: mercadopago.php
...
        return self::exec($request);
    }
}

class MercadoPagoException extends Exception {
    public function __construct($message, $code = 500, Exception $previous = null) {
        // Default code 500
        parent::__construct($message, $code); //! Linea modificada.
    }
}

Información del servidor de Producción

Servidor

PHP Version     5.2.17
Server API      CGI/FastCG
Thread Safety       disabled
PHP API         20041225
PHP Extension       20060613

cURL

cURL support        enabled
cURL Information    libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2

OpenSSL

OpenSSL support     enabled
OpenSSL Version     OpenSSL 1.0.0-fips 29 Mar 2010

Código de Prueba

Aquí les dejo el código de prueba muy simple que genera el error cuando lo ejecuto en el servidor Test.zip

periplox commented 6 years ago

Hola, yo tengo el mismo problema, pero el fix propuesto no me funciona. La única diferencia es que mi versión de PHP es 5.6.31. Ya no sé qué más probar, ¿alguna idea?

Esta es la excepción que me arroja:

object(MercadoPagoException)#2 (7) { ["message":protected]=> string(24) "couldn't connect to host" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(500) ["file":protected]=> string(49) "/home/XXXX/public_html/mercadopago/mp_new.php" ["line":protected]=> int(509) ["trace":"Exception":private]=> array(3) { [0]=> array(6) { ["file"]=> string(49) "/home/XXXX/public_html/mercadopago/mp_new.php" ["line"]=> int(564) ["function"]=> string(4) "exec" ["class"]=> string(12) "MPRestClient" ["type"]=> string(2) "::" ["args"]=> array(1) { [0]=> array(4) { ["uri"]=> string(12) "/oauth/token" ["data"]=> array(3) { ["client_id"]=> string(16) "XXXX" ["client_secret"]=> string(32) "XXXXX" ["grant_type"]=> string(18) "client_credentials" } ["headers"]=> array(1) { ["content-type"]=> string(33) "application/x-www-form-urlencoded" } ["method"]=> string(4) "POST" } } } [1]=> array(6) { ["file"]=> string(49) "/home/XXXXX/public_html/mercadopago/mp_new.php" ["line"]=> int(67) ["function"]=> string(4) "post" ["class"]=> string(12) "MPRestClient" ["type"]=> string(2) "::" ["args"]=> array(1) { [0]=> array(3) { ["uri"]=> string(12) "/oauth/token" ["data"]=> array(3) { ["client_id"]=> string(16) "XXXXX" ["client_secret"]=> string(32) "XXXXX" ["grant_type"]=> string(18) "client_credentials" } ["headers"]=> array(1) { ["content-type"]=> string(33) "application/x-www-form-urlencoded" } } } } [2]=> array(6) { ["file"]=> string(47) "/home/XXXXX/public_html/mercadopago_test.php" ["line"]=> int(8) ["function"]=> string(16) "get_access_token" ["class"]=> string(2) "MP" ["type"]=> string(2) "->" ["args"]=> array(0) { } } } ["previous":"Exception":private]=> NULL }

bycross028 commented 6 years ago

Hola, perdona el mal entendido, el fix del comentario anterior es solo para la versión de 5.2.5, que no acepta el tercer parámetro en el constructor de la clase Exception, dado un error de sintaxis. La modificación propuesta fue enviar solo el mensaje y el código de error en el constructor como se muestra a continuación .

class MercadoPagoException extends Exception {
    public function __construct($message, $code = 500, Exception $previous = null) {
        // Default code 500
        parent::__construct($message, $code); //! Linea modificada.
    }
}

Por el tipo de error "couldn't connect to host" puede que el servidor tenga algún firewall o algún tipo restricción.

Puedes intentar conectarte a google para descartar eso:

how-to-resolve-curl-error-7-couldnt-connect-to-host

$ch = curl_init("http://google.com"); 
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  $data = curl_exec($ch);
  print($data);

También hacer una conexion a https://api.mercadopago.com y https://mercadopago.com para descartar que no sea algún tipo de bloqueo del servidor