提交數據到https時,需要pem證書來加密。
我們使用瀏覽器訪問https的時候,瀏覽器會自動加載網站的安全證書進行加密。但是你用curl請求https時,沒有通過瀏覽器,就只有自己手動增加一個安全證書進行加密。
curl 請求一共分四步,初始化,設置屬性,執行並獲取結果,釋放句柄
一 需要驗證:
1 function httpGet($url) { 2 $curl = curl_init(); 3 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 4 curl_setopt($curl, CURLOPT_TIMEOUT, 500); 5 // 為保證第三方服務器與微信服務器之間數據傳輸的安全性,所有微信接口采用https方式調用,必須使用下面2行代碼打開ssl安全校驗。 6 // 如果在部署過程中代碼在此處驗證失敗,請到 http://curl.haxx.se/ca/cacert.pem 下載新的證書判別文件。 7 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); 8 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); 9 curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');//這是根據http://curl.haxx.se/ca/cacert.pem 下載的證書,添加這句話之后就運行正常了 10 curl_setopt($curl, CURLOPT_URL, $url); 11 12 $res = curl_exec($curl); 13 curl_close($curl); 14 15 return $res; 16 }
二 不需要驗證:
1 function getCurl($url) { 2 // 創建一個新cURL資源 3 $ch = curl_init(); 4 5 // 設置URL和相應的選項 6 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 跳過證書驗證(https)的網站無法跳過,會報錯 7 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書驗證 8 curl_setopt($ch, CURLOPT_URL, $url); 9 curl_setopt($ch, CURLOPT_HEADER, 0); 10 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回的數據不打印 11 // 抓取URL並把它傳遞給瀏覽器 12 $rs = curl_exec($ch); 13 if($rs === false) { 14 return 'Curl error: ' . curl_error($ch); 15 } 16 // 關閉cURL資源,並且釋放系統資源 17 curl_close($ch); 18 return $rs; 19 }
/**
* 發送http請求獲取結果json字符串
*
* @param $url
* @param null $data
* @param string $method
* @return mixed
*/
function sendHTTPRequest($url, $data = null,$method = 'post') {
// 1.初始化
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 跳過證書驗證(https)的網站無法跳過,會報錯
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書驗證
// 2.設置url
curl_setopt($ch, CURLOPT_URL, $url);
// 2.1 設置返回是字符串形式
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 2.2 支持POST
if (!empty($data)) {
if($method === 'post') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
} elseif($method === 'get') {
//設置頭文件的信息作為數據流輸出
curl_setopt($ch, CURLOPT_HEADER, 0);
}
// 3.發送接收
$res = curl_exec($ch);
// 4.關閉
curl_close($ch);
return $res;
}
知識點摘要:
CURLOPT_SSL_VERIFYPEER 設置為FALSE 禁止 cURL 驗證對等證書(peer’s certificate)。要驗證的交換證書可以在 CURLOPT_CAINFO 選項中設置,或在 CURLOPT_CAPATH中設置證書目錄。
CURLOPT_CAINFO 一個保存着1個或多個用來讓服務端驗證的證書的文件名。這個參數僅僅在和CURLOPT_SSL_VERIFYPEER一起使用時才有意義。可能需要絕對路徑。
CURLOPT_CAPATH 一個保存着多個CA證書的目錄。這個選項是和CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_SSL_VERIFYHOST 設置為 1 是檢查服務器SSL證書中是否存在一個公用名(common name)。譯者注:公用名(Common Name)一般來講就是填寫你將要申請SSL證書的域名 (domain)或子域名(sub domain)。 設置成 2,會檢查公用名是否存在,並且是否與提供的主機名匹配。 在生產環境中,這個值應該是 2(默認值)。