Pasar archivos .pem y .key en cURL no funciona en WordPress

4

Estoy creando un complemento de pasarela de pago para woocommerce que requiere enviar una solicitud XML a través de cURL , cifrada con clave privada.

Estoy usando el siguiente código:

$xml_request    ='<?xml version="1.0" encoding="utf-8"?>';

$test_URL       = 'https://my-gateway.com';
// Here is where I change the file paths
$certfile       = '/clientcert.pem';
$keyfile        = '/clientkey.key';

$ch = curl_init();

curl_setopt( $ch, CURLOPT_URL, $test_URL );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_SSLCERT, getcwd() . $certfile );
curl_setopt( $ch, CURLOPT_SSLKEY, getcwd() . $keyfile );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: text/xml' ) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $xml_request );
$ch_result = curl_exec( $ch );


// Check for errors
if ( curl_errno($ch) ) {
    $ch_result = 'cURL ERROR -> ' . curl_errno($ch) . ': ' . curl_error($ch);
} else {
    $returnCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    switch($returnCode){
        case 200:
            break;
        default:
            $ch_result = 'HTTP ERROR -> ' . $returnCode;
            break;
    }
}

curl_close( $ch );

echo $ch_result;

El problema es que curl no puede encontrar el certificado o los archivos clave sin importar la ruta que use, he intentado rutas absolutas y relativas.
He cambiado las ubicaciones de los archivos .pem y .key (intente el directorio de temas, el directorio de complementos y la raíz).
He cambiado los permisos por completo.

Pero aún así recibo el error
58: unable to use client certificate (no key found or wrong pass phrase?)

Lo que significa que el archivo no se encuentra o está dañado, aunque estoy seguro de que no, ya que cuando copio este código en un archivo php fuera de WordPress y lo ejecuto, funciona .

Puedo superar este problema redirigiendo al usuario a una página fuera de WordPress, pero prefiero ejecutarlo todo desde un solo lugar.
¿Cómo se puede hacer esto?

    
pregunta vegu 14.04.2013 - 15:32

1 respuesta

1

Basado en el comentario de @Mamaduka; Los siguientes cambios lo resuelven:

Use plugin_dir_path() para obtener la ruta del directorio del sistema de archivos:

$certfile = plugin_dir_path(__FILE__) . '/clientcert.pem';
$keyfile = plugin_dir_path(__FILE__) . '/clientkey.key';

Luego elimina getcwd() .

Si quieres usarlo en tu tema, usa TEMPLATEPATH

También quiero mencionar que usar las siguientes rutas anteriormente no funcionó :

WP_PLUGIN_URL . "/" . plugin_basename( dirname(__FILE__) ) . '/clientkey.key'

ni:

get_bloginfo('template_directory') . '/lib/cert/clientcert.pem'

ni:

'http://my-web-site.com/clientcert.pem'
    
respondido por el vegu 14.04.2013 - 20:46

Lea otras preguntas en las etiquetas