php curl返回false填坑記-curl呼叫微信建立自定義選單返回false
阿新 • • 發佈:2018-12-29
首先宣告一點,這個錯誤可能在你的開發生涯中不會遇到,除非你直接複製了微信公眾平臺的api地址。不過這應該算是php中curl擴充套件的一個bug,為什麼是bug呢?讓我們仔細來看。
下邊是示例程式碼,程式碼的功能是呼叫微信公眾平臺的建立自定義選單介面來建立自定義選單。
建立自定義選單的業務程式碼:
$menuArr= [ 'button' => [ [ 'name' => '動物世界', 'type' => 'click', 'key' => 'alimail' ], [ 'name' => '環球活動', 'sub_button'=> [ [ 'name' => '我要冒險', 'type' => 'view', 'url' => url('index/maoxian/index','','',true) ], [ 'name' => '優惠活動', 'type' => 'scancode_push', 'key' => 'rselfmenu_0_1' ] ] ] ] ]; $accessToken = get_access_token();$url = ' https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accessToken; $result = curl_request($url,'post',json_encode($menuArr,JSON_UNESCAPED_UNICODE)); dump($result);
封裝的curl請求函式:
/** * @param $url * @param array $data * @return mixed * 模擬傳送get 和 post 請求 */ function curl_request($url, $type = "GET", $data = '') { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); curl_setopt($ch,CURLOPT_HEADER,0); $type = strtolower($type); switch ($type){ case 'get': break; case 'post': //post請求配置 curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); break; } $result = curl_exec($ch); curl_close($ch); return $result; }
問題就出在第一部分的程式碼中。第一部分的程式碼中的:
$url = ' https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accessToken;
在這行程式碼中url的開始有一個空格。這個空格導致了curl_exec($ch)的錯誤。
理論來講:curl中出現錯誤的有兩種可能,要麼是微信的api丟擲了錯誤,要麼是curl本身丟擲錯誤。
但是這兩個錯誤都是可以人為的獲取分析的。可是在curl請求的url中包含了空格。注意,是包含了
空格,也就是說在url的任何一個位置都不行。如果有則curl返回的結果就是false。然後我使用curl_error($ch)
來獲取可視獲取的結果為string ""也就是空字串。所以這個就有點兒難判斷了。最後發現是url中有了一個空格。
總結:使用curl來請求資料時curl的url地址中的任何地方不能有空格存在,不然會返回一個你琢磨不透的false