首先声明一点,这个错误可能在你的开发生涯中不会遇到,除非你直接复制了微信公众平台的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