[转载]微信公众平台二次开发之自定义菜单接口
时间:2015-05-22 16:30:19
收藏:0
阅读:327
原文地址:微信公众平台二次开发之自定义菜单接口作者:糊涂人
今天在SAE上运行代码时出现了一个小问题,所以发一篇博客与大家分享,这也是我第一次写关于技术上的博客,希望大家帮忙顶顶
步骤1.
你要有一个公众号,自己申请,过程略,很简单的。
步骤2.
登陆进去->高级功能,这时候要想开发必须要输入url和token,这里方法我引一下别人的文章http://www.cnblogs.com/txw1958/p/wechat-tutorial.html。
步骤3.
如果上面的工作完成了,这个时候你会在高级功能中看到
步骤4.
这里我再一次引一下别人的http://kf.qq.com/faq/120911VrYVrA130807m22MVB.html,*注:一般理由合理再过了一天就可以看到消息,点通知
步骤5.
在这里我们有两种方式来建立菜单,一种是编辑模式,那个是傻瓜式操作所以这里就不在讲了,我们重点讲第二种开发模式。
进入开发模式。在服务其中新建一个php文件,注意一定要是新建的,不是以前我们链接url的那个地址。
步骤6.
我们要获取access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的secret
输入后会得到{"access_token":"BWGjR6KafrmbPEYOaocez56RZwVj7pIVpmf1p6RqgVoGKJhfKVD3hkX2YfLOHYyJouocwnup9sGB23HBOkWKAaFqsyePW4-TKa-7SaAZXksMtMeqH2boDAoDrsWEj251bZYQct6IU9l6th4WHB5_6g","expires_in":7200}这样的一个代码access_token就是你需要的access_token,7200是access_token这个的过期时间
步骤7.
在我们刚刚新建的php文件中写入这样的代码
<?php
$xjson = ‘{
"button":[
{
"name":"业务办理",
"sub_button":[
{
"type":"view",
"name":"新车上户",
"url":"http://www.ixp86.com:808/"
},
{
"type":"view",
"name":"爱车保养",
"url":"http://www.ixp86.com:808/"
}]
},
{
"name":"信息查询",
"sub_button":[
{
"type":"click",
"name":"进度查询",
"key":"jdcx"
},
{
"type":"click",
"name":"违章查询",
"key":"wzcx"
},
{
"type":"click",
"name":"保养查询",
"key":"bycx""
}]
}]
}‘;
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=你的access_token";
$result = vpost($url,$xjson);
var_dump($result);
function vpost($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)‘); // 模拟用户使用的浏览器
// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
// curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包x
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo ‘Errno‘.curl_error($curl);//捕抓异常
}else {
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据
}
?>
上面的json就是菜单了,让这个页面上线,再预览{"errcode":0,"errmsg":"ok"}这样就是成功了,等大约10秒钟看手机就有效果
如果是string(49) "{"errcode":42001,"errmsg":"access_token expired"}"说明
access_token过期了重新运行
access_token过期了重新运行
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的secret再替换掉access_token就行了。
然后再试捕捉菜单点击事件
在消息处理页面中也就是最开始要求我们写入url和token 的那个页面在处理消息的函数
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;//游客的账号
$toUsername = $postObj->ToUserName;//开发者的账号
$event = $postObj->Event;//事件这里我也要的是click,
$eventKey = $postObj->EventKey;//这个事件对应的名称,如我这里就有jdcx等
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if($event == "CLICK"){//判断事件类型
$contentStr="";
switch($eventKey){//这个事件的名称
case "jdcx":
$contentStr=$postObj->FromUserName;
break;
case "wzcx":
$contentStr="违章查询前请输入手机号";
break;
case "bycx":
$contentStr="保养查询前请输入手机号";
break;
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;//游客的账号
$toUsername = $postObj->ToUserName;//开发者的账号
$event = $postObj->Event;//事件这里我也要的是click,
$eventKey = $postObj->EventKey;//这个事件对应的名称,如我这里就有jdcx等
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if($event == "CLICK"){//判断事件类型
$contentStr="";
switch($eventKey){//这个事件的名称
case "jdcx":
$contentStr=$postObj->FromUserName;
break;
case "wzcx":
$contentStr="违章查询前请输入手机号";
break;
case "bycx":
$contentStr="保养查询前请输入手机号";
break;
}
$msgType = "text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
第一次发微博,第一发布了只显示出了一部分,真郁闷,写了二次希望对大家有帮助
评论(0)