业务逻辑:商城用户下单未付款,15分钟自动给用户退款
我的方法:在宝塔写计划任务,自动执行查询未付款的订单,并执行微信退款流程
这是我的curl请求微信支付的方法
private function postXmlSSLCurl($xml,$url,$second = 30){
$ch = curl_init ();
$MENU_URL=$url;
//证书路径,示例:/upload/wechat/123456.pem
$sslcert = getcwd().$this->payConfig['client_cert'];
//密钥路径,示例:/upload/wechat/123456.pem
$sslkey = getcwd().$this->payConfig['client_key'];
curl_setopt ( $ch, CURLOPT_URL, $MENU_URL );
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt($ch,CURLOPT_SSLCERT,$sslcert);
curl_setopt($ch,CURLOPT_SSLKEY,$sslkey);
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
$data = curl_exec ($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
}else{
//return false;
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."<br>";
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
addExceptionLog('退款curl请求错误','错误码:'.$error);
curl_close($ch);
return false;
}
}
上述方法在计划任务中报错58,提示客户端路径不对。
但是在控制器中调用没问题,后来在计划任务使用getcwd()来拼接相对路径,还是不行。
最后在计划任务中输入发现getcwd()输出是/usr/bin/server文件夹,在控制器中输入就是站点目录,
恍然大悟,后来将证书和密码写成绝对路径就行了
$sslcert = '/www/wwwroot/www.bdt177.com/public/upload/wechat/cert.pem';
$sslkey = '/www/wwwroot/www.bdt177.com/public/upload/wechat/key.pem';
不然不这样写的话,curl时加载证书和密钥的路径会报错。