代码
/**
* Curl http/https 请求
* @param string $url 请求地址
* @param string|array $data 请求数据
* @param bool $isPost 是否POST请求
* @param string $getHeaders Get请求的请求头
* @param int $execTimes 请求次数
* @param bool $makeJsonStr 是否Json数据
*
* @return mixed|array
*/
public function curlHttp($url, $data = '', $isPost = true, $getHeaders = '', $execTimes = 1, $makeJsonStr = true)
{
// 检测是不是 https
$ssl = false;
$http = parse_url($url, PHP_URL_SCHEME);
if ('https' == $http) {
$ssl = true;
}
// 检测 url 中是否已存在参数
$mark = strpos($url, '?');
// 处理 POST 请求的参数
$header = array();
if ($isPost) {
if (is_array($data) && $makeJsonStr) {
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
}
if ($makeJsonStr) {
$header = array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data)
);
}
} else { // 处理 GET 请求的参数
// 将参数转为请求字符串
if (is_array($data)) {
$data = http_build_query($data);
}
if ($getHeaders) {
$header = array($getHeaders);
}
$conn = '&';
if (false === $mark) {
$conn = '?';
}
$url .= $conn . $data;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
if ($ssl) {
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
}
if ($isPost) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
if (!empty($header)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
# 特殊接口可能会多次请求才能得到正确返回结果,例:微信APP支付
for ($i = 0; $i < $execTimes; $i++) {
$res = curl_exec($ch);
}
if (curl_errno($ch)) {
$res = curl_error($ch);
}
curl_close($ch);
return json_decode($res, true);
}