/**
* 微信支付请求接口(POST)
* @param string $openid openid
* @param string $body 商品简单描述
* @param string $order_sn 订单编号
* @param string $total_fee 金额
* @param string $notify_url 回调地址
* @return json的数据
*/
public function wxpay($openid,$total_fee,$body,$order_sn,$notify_url){
$config = $this->config;
//统一下单参数构造
$unifiedorder = array(
'appid' => $config['appid'],
'mch_id' => $config['mch_id'],
'nonce_str' => self::getNonceStr(),
'body' => $body,
'out_trade_no' => $order_sn,
'total_fee' => $total_fee * 100,
'spbill_create_ip' => self::getip(),
'notify_url' => 'http://'.$_SERVER['HTTP_HOST'].'/notify.php',
'trade_type' => 'JSAPI',
'openid' => $openid
);
$unifiedorder['sign'] = self::makeSign($unifiedorder);
//return $unifiedorder;
//请求数据,统一下单
$xmldata = self::array2xml($unifiedorder);
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$res = self::curl_post_ssl($url, $xmldata);
Log::record("curl_post_ssl 返回");
Log::record($res);
if(!$res){
return array('status'=>0, 'msg'=>"Can't connect the server" );
}
// 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了
//file_put_contents('./log.txt',$res,FILE_APPEND);
$content = self::xml2array($res);
if(strval($content['result_code']) == 'FAIL'){
return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des']));
}
if(strval($content['return_code']) == 'FAIL'){
return array('status'=>0, 'msg'=>strval($content['return_msg']));
}
$time = time();
settype($time, "string"); //jsapi支付界面,时间戳必须为字符串格式
$resdata = array(
'appId' => strval($content['appid']),
'nonceStr' => strval($content['nonce_str']),
'package' => 'prepay_id='.strval($content['prepay_id']),
'signType' => 'MD5',
'timeStamp' => $time
);
$resdata['paySign'] = self::makeSign($resdata);
return json_encode($resdata);
}
/**
* 微信支付发起请求
*/
protected function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
$config = $this->config;
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLCERT,$config['api_cert']);
curl_setopt($ch,CURLOPT_SSLCERT, ROOT_PATH.'/public/wxcert/'. 'apiclient_cert.pem');
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
//curl_setopt($ch,CURLOPT_SSLKEY,$config['api_key']);
curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH.'/public/wxcert/'. 'apiclient_key.pem');
//curl_setopt($ch,CURLOPT_CAINFO,$config['rootca']);
Log::record("call api_cert, api_cert:".$config['api_cert']);
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
**$data = curl_exec($ch);**
if($data){
curl_close($ch);
return $data;
}else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
** Log::record("call faild, errorCode:".$error);**//此处返回:58错误代码
curl_close($ch);
return false;
}
}
#根据错误代码查看:
Not used in modern versions
CURLE SSL CERTPROBLEM (58)
problem with the local client certificate.
SSL CURLE CLPHER (59)
各位,这个问题如何解决啊