Je construis un plugin de passerelle de paiement pour woocommerce qui nécessite l'envoi d'une requête XML via cURL
, chiffré avec une clé privée.
J'utilise le code suivant:
$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;
Le problème est que curl
ne peut pas trouver le certificat ou les fichiers de clé, quel que soit le chemin que j'utilise. J'ai essayé des chemins absolus et relatifs.
J'ai changé les emplacements des fichiers .pem
et .key
(répertoire du thème essayé, répertoire du plugin et racine).
J'ai changé les permissions en full.
Mais j'ai toujours l'erreur58: unable to use client certificate (no key found or wrong pass phrase?)
Ce qui signifie que le fichier n'est pas trouvé ou corrompu, alors que je suis sûr qu'il ne l'est pas, car lorsque je copie ce code dans un fichier php en dehors de WordPress et que je l'exécute, cela fonctionne .
Je peux résoudre ce problème en redirigeant l'utilisateur vers une page extérieure à WordPress, mais je préférerais que tout soit exécuté à partir du même endroit.
Comment cela peut-il être fait?
Basé sur le commentaire de @Mamaduka; les modifications suivantes le résolvent:
Utilisez plugin_dir_path()
pour obtenir le chemin du répertoire du système de fichiers:
$certfile = plugin_dir_path(__FILE__) . '/clientcert.pem';
$keyfile = plugin_dir_path(__FILE__) . '/clientkey.key';
Ensuite, supprimez getcwd()
.
Si vous voulez l'utiliser dans votre thème, utilisez TEMPLATEPATH
Je tiens également à mentionner que l'utilisation des chemins suivants précédemment n'a pas travail:
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'