Home >Backend Development >PHP Tutorial >微信 php 自定义菜单
我申请了一个微信公众平台的测试账号,之前已经通过验证,关注后用我的微信号向测试账号发消息可以得到测试账号的正确响应,我现在想实现微信的自定义菜单,下面用***代替了我测试账号的appid和secret,我进测试账号没看到自定义菜单,请问问题出在哪?
<?php/** * wechat php test *///define your tokendefine("TOKEN", "weixin");$token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***";$data = "{ "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "type":"click", "name":"歌手简介", "key":"V1001_TODAY_SINGER" }, { "name":"菜单", "sub_button":[ { "type":"click", "name":"hello word", "key":"V1001_HELLO_WORLD" }, { "type":"click", "name":"赞一下我们", "key":"V1001_GOOD" }] }] }";$wechatObj = new wechatCallbackapiTest();$wechatObj->post($wechatObj->get_access_token(), $data);class wechatCallbackapiTest{ public function get_access_token(){ $json=http_request_json($token_url); $data=json_decode($json,true); if($data['access_token']){ return $data['access_token']; }else{ return "获取access_token错误"; } } public function http_request_json($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); return $result; } public function post($access_token, $jsonData){ $ch = curl_init("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token) ; curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS,$jsonData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); $result = curl_exec($ch) ; curl_close($ch) ; return $result; }}?>
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
我记得菜单在官方的文档有例子的
至于调试,应该官方会抛出错误编号方便你判断的吧.
刚才有2个问题找到了,一个是$data = 这里应该打单引号,另外一个http_request_json改为$this->http_request_json,但还是没有,改了这2个问题
我记得菜单在官方的文档有例子的
至于调试,应该官方会抛出错误编号方便你判断的吧.
微信官方抛的错误应该是在服务器上啊,他又不会直接抛到界面上,我就是问我在服务器哪里去看这个错误
我记得菜单在官方的文档有例子的
至于调试,应该官方会抛出错误编号方便你判断的吧.
微信官方抛的错误应该是在服务器上啊,他又不会直接抛到界面上,我就是问我在服务器哪里去看这个错误
根据我的经验 大凡API调用之后都应该有个callback...回调
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
调试在微信开发者平台有提供调试的平台,不过我感觉最好自己做好程序的抛错(exception)处理,这样会根据调试平台上的信息可以知道自己的问题出在哪里。我个人喜欢PHP,这是我的博客 http://www.ihuxu.com,希望多多交流。
1.首先查看下这个方法,是否有得到token值。
$wechatObj->get_access_token()
public function get_access_token(){ $json=http_request_json($token_url); $data=json_decode($json,true); if($data['access_token']){ return $data['access_token']; }else{ return "获取access_token错误"; } }
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
调试在微信开发者平台有提供调试的平台,不过我感觉最好自己做好程序的抛错(exception)处理,这样会根据调试平台上的信息可以知道自己的问题出在哪里。我个人喜欢PHP,这是我的博客 http://www.ihuxu.com,希望多多交流。
现在的问题是,我在微信的官网上调试,提示是成功的,但我客户端看不到
1.首先查看下这个方法,是否有得到token值。
$wechatObj->get_access_token()
public function get_access_token(){ $json=http_request_json($token_url); $data=json_decode($json,true); if($data['access_token']){ return $data['access_token']; }else{ return "获取access_token错误"; } }
如果你执行的返回是成功的,是要有24小时的或者你取消关注 再重新关注一下就可以看到了
如果你执行的返回是成功的,是要有24小时的或者你取消关注 再重新关注一下就可以看到了
我现在直接在服务器打印,知道问题的地方了,但不知道怎么改
public function post($token, $jsonData){ echo $token; $MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token; $ch = curl_init() ; curl_setopt($ch, CURLOPT_URL, $MENU_URL); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch) ; if (curl_errno($ch)) { echo 'Error'.curl_error($ch); } curl_close($ch) ; echo $result; //var_dump($result); return $result; }
//创建菜单function createMenu($data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { return curl_error($ch); } curl_close($ch); return $tmpInfo;}
//创建菜单function createMenu($data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { return curl_error($ch); } curl_close($ch); return $tmpInfo;}
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器 error_log("内容",3,"log.txt");
第一个参数是你要输入的内容,
第二个参数不要改,
第三个参数是日志的名称,你可以加一下路径 如"c:\log.txt"你就可以在C盘看到这个文件了
微信菜单,我自己写了个小工具,可以用的 可以用,要的话加QQ970871674
你是不是执行的时候也echo了?
你是不是执行的时候也echo了?
我重新贴下完整代码吧
post($wechatObj->get_access_token(), $data);//$wechatObj->responseMsg();class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function get_access_token(){ $json=$this->http_request_json("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***"); $data=json_decode($json,true); if($data['access_token']){ return $data['access_token']; }else{ return "获取access_token错误"; } } public function http_request_json($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); return $result; } public function post($token, $jsonData){ echo $token; $MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token; $ch = curl_init() ; curl_setopt($ch, CURLOPT_URL, $MENU_URL); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch) ; if (curl_errno($ch)) { echo 'Error'.curl_error($ch); } curl_close($ch) ; echo $result; return $result; }?>
解决了,是菜单中的中文导致的,将文件另存为“UTF-8 无BOM编码格式”就行了,感谢大家