我正在为woocommerce构建一个支付网关插件,它需要通过cURL
, 使用私钥加密。
我正在使用以下代码:
$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;
问题是
curl
无论我使用什么路径,都找不到证书或密钥文件-我尝试了绝对路径和相对路径
我更改了
.pem
和
.key
文件位置(已尝试的主题目录、插件目录和根目录)
我已将权限更改为“完全”。
但我还是得到了错误58: unable to use client certificate (no key found or wrong pass phrase?)
这意味着该文件未被找到或损坏,而我确信它没有,因为when I copy this code to a php file outside WordPress and run it, it works.
我可以通过将用户重定向到WordPress之外的页面来克服这个问题,但我更愿意从一个地方运行它
如何做到这一点?
最合适的回答,由SO网友:vegu 整理而成
基于@Mamaduka评论;以下更改可解决此问题:
使用plugin_dir_path()
要获取文件系统目录路径,请执行以下操作:
$certfile = plugin_dir_path(__FILE__) . \'/clientcert.pem\';
$keyfile = plugin_dir_path(__FILE__) . \'/clientkey.key\';
然后删除
getcwd()
.
如果您想在主题中使用它,请使用TEMPLATEPATH
我还想提到的是,之前使用以下路径did not 工作:
WP_PLUGIN_URL . "/" . plugin_basename( dirname(__FILE__) ) . \'/clientkey.key\'
否:
get_bloginfo(\'template_directory\') . \'/lib/cert/clientcert.pem\'
否:
\'http://my-web-site.com/clientcert.pem\'