微信 php 自定义菜单
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()
2.再发送的自定义菜单的时候,看返回的数据是什么?根据错误代码去找出是哪里出错了。
很显然,我不知道你这个方法是如何取得token值的?$token_url哪里来的?
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()
2.再发送的自定义菜单的时候,看返回的数据是什么?根据错误代码去找出是哪里出错了。
很显然,我不知道你这个方法是如何取得token值的?$token_url哪里来的?
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错误"; } }
token_url在我帖子最上面有啊,声明了的
如果你执行的返回是成功的,是要有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; }
这是我现在创建菜单的方法,我打印看了下,token是正确获取到了,但菜单没创建成功,系统的打印是
{"errcode":-1,"errmsg":"system error"}
这个errorcode在微信官方看到的解释是系统繁忙,但我想应该不是这个问题,因为现在有人用java来创建是OK的,我想还是这块PHP写的有问题,谁帮忙看看
//创建菜单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;}
你这跟我有什么区别?$token这是一个变量啊,是从别的地方获取的,你是让我定义一个全局变量,把token值记录下来?这也没什么区别吧
还有一个问题,我该怎么调试这种微信的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; }?>
这就是现在代码了,除了真实的appid和secret被我用***代替了
解决了,是菜单中的中文导致的,将文件另存为“UTF-8 无BOM编码格式”就行了,感谢大家