微信 php 自定义菜单

luqing414 2013-12-23 06:03:18
我申请了一个微信公众平台的测试账号,之前已经通过验证,关注后用我的微信号向测试账号发消息可以得到测试账号的正确响应,我现在想实现微信的自定义菜单,下面用***代替了我测试账号的appid和secret,我进测试账号没看到自定义菜单,请问问题出在哪?


<?php
/**
* wechat php test
*/

//define your token
define("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;
}
}

?>
...全文
1031 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22766023 2015-03-13
  • 打赏
  • 举报
回复
<?php /** * wechat php test */ //define your token $token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***"; class wechatMenu { public function get_access_token(){ $json=$this->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; } } ?> 将以上代写成menu.php 然后调用 <?php /** * wechat php test */ //define your token define("TOKEN", "830961"); $data = '{ "button":[ { "name":"蛋糕目录", "sub_button":[ { "type":"click", "name":"水果系列", "key":"V1001_shuiguo" }, { "type":"click", "name":"巧克力系列", "key":"V1001_qiaokeli" }, { "type":"click", "name":"鲜奶油蛋糕", "key":"V1001_xiannai" }, { "type":"click", "name":"冰淇淋蛋糕", "key":"V1001_bingqilin" }] }, { "type":"click", "name":"歌手简介", "key":"geshou" }, { "name":"菜单", "sub_button":[ { "type":"click", "name":"hello word", "key":"V1001_HELLO_word" }, { "type":"click", "name":"赞一下我们", "key":"V1001_good" }] }] }'; require ('menu.php'); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); $wmenu=new wechatMenu(); $wwechatObj->post($wmenu->get_access_token(), $data); //$wechatObj->valid(); class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//$postObj是simpleXml的对象 $type = trim($postObj->MsgType); $resultStr = $this->handleText($postObj); echo $resultStr; }else { echo "2"; exit; } } 这个为什么没有我写的菜单的效果 ??
linlongzhou1 2015-03-10
  • 打赏
  • 举报
回复
引用 10 楼 liu510817387 的回复:
如果你执行的返回是成功的,是要有24小时的或者你取消关注 再重新关注一下就可以看到了
妈的,搞了半,原来要取消关注再关注才有效果
liu510817387 2013-12-24
  • 打赏
  • 举报
回复
如果你执行的返回是成功的,是要有24小时的或者你取消关注 再重新关注一下就可以看到了
luqing414 2013-12-24
  • 打赏
  • 举报
回复
解决了,是菜单中的中文导致的,将文件另存为“UTF-8 无BOM编码格式”就行了,感谢大家
luqing414 2013-12-24
  • 打赏
  • 举报
回复
引用 17 楼 liu510817387 的回复:
你是不是执行的时候也echo了?
我重新贴下完整代码吧

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");

$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);
//$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被我用***代替了
liu510817387 2013-12-24
  • 打赏
  • 举报
回复
你是不是执行的时候也echo了?
帆歌 2013-12-24
  • 打赏
  • 举报
回复
微信菜单,我自己写了个小工具,可以用的 可以用,要的话加QQ970871674
帆歌 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 luqing414 的回复:
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
error_log("内容",3,"log.txt"); 第一个参数是你要输入的内容, 第二个参数不要改, 第三个参数是日志的名称,你可以加一下路径 如"c:\log.txt"你就可以在C盘看到这个文件了
luqing414 2013-12-24
  • 打赏
  • 举报
回复
引用 12 楼 liu510817387 的回复:
//创建菜单
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值记录下来?这也没什么区别吧
帝瓜 2013-12-24
  • 打赏
  • 举报
回复
帮顶下试试。。。
liu510817387 2013-12-24
  • 打赏
  • 举报
回复
//创建菜单
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;
}
luqing414 2013-12-24
  • 打赏
  • 举报
回复
引用 10 楼 liu510817387 的回复:
如果你执行的返回是成功的,是要有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写的有问题,谁帮忙看看
luqing414 2013-12-23
  • 打赏
  • 举报
回复
引用 7 楼 bing15 的回复:
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在我帖子最上面有啊,声明了的
luqing414 2013-12-23
  • 打赏
  • 举报
回复
引用 6 楼 u012317613 的回复:
[quote=引用 1 楼 luqing414 的回复:] 还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
调试在微信开发者平台有提供调试的平台,不过我感觉最好自己做好程序的抛错(exception)处理,这样会根据调试平台上的信息可以知道自己的问题出在哪里。我个人喜欢PHP,这是我的博客http://www.ihuxu.com,希望多多交流。[/quote] 现在的问题是,我在微信的官网上调试,提示是成功的,但我客户端看不到
bing15 2013-12-23
  • 打赏
  • 举报
回复
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错误";  
        }         
    }  
u012317613a 2013-12-23
  • 打赏
  • 举报
回复
引用 1 楼 luqing414 的回复:
还有一个问题,我该怎么调试这种微信的php开发,在服务器上哪个地方可以看到日志(就是类似echo的值)?我是用xampp搭建的服务器
调试在微信开发者平台有提供调试的平台,不过我感觉最好自己做好程序的抛错(exception)处理,这样会根据调试平台上的信息可以知道自己的问题出在哪里。我个人喜欢PHP,这是我的博客http://www.ihuxu.com,希望多多交流。
黄袍披身 2013-12-23
  • 打赏
  • 举报
回复
引用 4 楼 luqing414 的回复:
[quote=引用 2 楼 PhpNewnew 的回复:] 我记得菜单在官方的文档有例子的 至于调试,应该官方会抛出错误编号方便你判断的吧.
微信官方抛的错误应该是在服务器上啊,他又不会直接抛到界面上,我就是问我在服务器哪里去看这个错误[/quote] 根据我的经验 大凡API调用之后都应该有个callback...回调
luqing414 2013-12-23
  • 打赏
  • 举报
回复
引用 2 楼 PhpNewnew 的回复:
我记得菜单在官方的文档有例子的 至于调试,应该官方会抛出错误编号方便你判断的吧.
微信官方抛的错误应该是在服务器上啊,他又不会直接抛到界面上,我就是问我在服务器哪里去看这个错误
luqing414 2013-12-23
  • 打赏
  • 举报
回复
刚才有2个问题找到了,一个是$data = 这里应该打单引号,另外一个http_request_json改为$this->http_request_json,但还是没有,改了这2个问题
黄袍披身 2013-12-23
  • 打赏
  • 举报
回复
我记得菜单在官方的文档有例子的 至于调试,应该官方会抛出错误编号方便你判断的吧.
加载更多回复(1)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧