Passar arquivos .pem e .key em cURL não funciona no WordPress

4

Estou criando um plug-in de gateway de pagamento para woocommerce , que exige o envio de uma solicitação XML por meio de cURL , criptografado com chave privada.

Estou usando o seguinte 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;

O problema é que curl não pode encontrar o certificado ou os arquivos de chave, não importa qual caminho eu use - tentei caminhos absolutos e relativos.
Eu mudei as localizações dos arquivos .pem e .key (tentei o diretório do tema, o diretório do plugin e o root). Alterei as permissões para total.

Mas ainda recebo o erro de 58: unable to use client certificate (no key found or wrong pass phrase?)

O que significa que o arquivo não foi encontrado ou está corrompido, enquanto eu tenho certeza que não é, desde que quando copio este código para um arquivo php fora do WordPress e o rode, ele funciona . / p>

Posso superar esse problema redirecionando o usuário para uma página fora do WordPress, mas prefiro executar tudo em um só lugar.
Como isso pode ser feito?

    
por vegu 14.04.2013 / 15:32

1 resposta

1

Baseado no comentário de @Mamaduka; as seguintes alterações resolvem-no:

Use plugin_dir_path() para obter o caminho do diretório do sistema de arquivos:

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

Em seguida, remova getcwd() .

Se você quiser usá-lo no seu tema, use TEMPLATEPATH

Também quero mencionar que usando os seguintes caminhos anteriormente não funcionam:

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

nem:

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

nem:

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

Tags