微信创建菜单错误---Trying to get property of non-object

在最近的微信公众号学习过程中在创建菜单时报  

Notice: Trying to get property of non-object in C:\Apache24\htdocs\menu.php on line 57
菜单创建失败

代码如下:

$ch = curl_init($MENU_URL);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($data))); 
$info = curl_exec($ch);
$menu = json_decode($info);
print_r($info);		//创建成功返回:{"errcode":0,"errmsg":"ok"}

if($menu->errcode == "0"){
	echo "菜单创建成功";
}else{
	echo "菜单创建失败";
}

最后手动增加一个安全证书进行加密问题解决

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

------------------------------------------------------------------

提交数据到https时,需要pem证书来加密。
我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密。但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证书进行加密。

代码示例:

01
private function httpGet($url) {
02
    $curl = curl_init();
03
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
04
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
05
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
06
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
07
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
08
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
09
    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
}

知识点摘要:
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(默认值)。

 

以上转自:http://www.3mu.me/php%E7%9A%84curl%E9%80%89%E9%A1%B9curlopt_ssl_verifypeer%E8%AF%A6%E8%A7%A3/

-----------------------------------------------------------------

但是在CURLOPT_SSL_VERIFYHOST 中输入ture 则会报

Error 500curl_setopt(): CURLOPT_SSL_VERIFYHOST no longer accepts the value 1, value 2 will be used i

原因:

只有在cURL低于7.28.1时CURLOPT_SSL_VERIFYHOST才支持使用1表示true,高于这个版本就需要使用2表示了(true也不行)。

我的curl版本

 解决方案:

CURLOPT_SSL_VERIFYHOST的参数值使用2

以上解决办法转自:https://blog.csdn.net/leedaning/article/details/81221974

你可能感兴趣的:(微信)