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?