php-微信公众平台开发(八) 自定义菜单功能开发

来源:互联网 发布:旋转后的成分矩阵 编辑:程序博客网 时间:2024/04/30 05:23

微信公众平台开发(八) 自定义菜单功能开发

来源:David Camp   时间:2013-09-09 19:06:55   阅读数:50776
分享到:7

[导读] 一、简介微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能。开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接。

一、简介

微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能。开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接。自定义菜单接口将为公众账号的信息展示空间提供更多可能性。本文将针对自定义菜单做简单的开发应用,以供读者参考。

二、官方说明

开发者获取使用凭证后,可以使用该凭证对公众账号的自定义菜单进行创建、查询和删除等操作。 自定义菜单接口可实现以下类型按钮:

click(点击事件):

用户点击click类型按钮后,微信服务器会通过消息接口(event类型)推送点击事件给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值进行消息回复。

view(访问网页):

用户点击view类型按钮后,会直接跳转到开发者指定的url中。

创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后,再次关注,则可以看到创建后的效果。

文档地址:http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E6%8E%A5%E5%8F%A3

三、获取使用凭证

3.1 获取appid 和appsecret

在 微信公众平台 > 高级功能 > 开发模式中找到appid 和appsecret。

\

3.2 使用appid 和appsecret 向微信凭证获取接口请求access_token

请求地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求参数说明:

grant_type:获取access_token填写client_credential

appid:第三方用户唯一凭证

secret:第三方用户唯一凭证密钥,既appsecret

返回说明:

正确的Json返回结果:

view source
print?
1.{"access_token":"ACCESS_TOKEN","expires_in":7200}

返回参数说明:

access_token:获取到的凭证

expires_in:凭证有效时间,单位:秒

3.3 具体实现

a. 打印出格式

view source
print?
01.<!--?php
02. 
03.$APPID="wxdxxxxxxxxxxxxxxx";
04.$APPSECRET="96xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
05. 
06.$TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
07. 
08.$json=file_get_contents($TOKEN_URL);
09.$result=json_decode($json,true);
10.print_r($result);
11. 
12.?-->

结果如下:

\

b. 获取access_token

view source
print?
01.<!--?php
02. 
03.$APPID="wxdxxxxxxxxxxxxxxx";
04.$APPSECRET="96xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
05. 
06.$TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
07. 
08.$json=file_get_contents($TOKEN_URL);
09.$result=json_decode($json,true);
10. 
11.$ACC_TOKEN=$result['access_token'];
12. 
13.echo $ACC_TOKEN;
14. 
15.?-->

\

注:access_token对应于公众号是全局唯一的票据,重复获取将导致上次获取的access_token失效。 

四、创建菜单

方法:通过POST一个特定结构体,实现在微信客户端创建自定义菜单。

请求地址:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

请求示例:

view source
print?
01.{
02."button":[
03.{
04."name":"公共查询",
05."sub_button":[
06.{
07."type":"click",
08."name":"天气查询",
09."key":"tianQi"
10.},
11.{
12."type":"click",
13."name":"公交查询",
14."key":"gongJiao"
15.},
16.{
17."type":"click",
18."name":"翻译",
19."key":"fanYi"
20.}]
21.},
22.{
23."name":"苏州本地",
24."sub_button":[
25.{
26."type":"click",
27."name":"爱上苏州",
28."key":"loveSuzhou"
29.},
30.{
31."type":"click",
32."name":"苏州景点",
33."key":"suzhouScenic"
34.},
35.{
36."type":"click",
37."name":"苏州美食",
38."key":"suzhouFood"
39.},
40.{
41."type":"click",
42."name":"住在苏州",
43."key":"liveSuzhou"
44.}]
45.},
46.{
47."type":"click",
48."name":"联系我们",
49."key":"lianxiUs"
50.}]
51.}

示例说明:

菜单结构及说明:

view source
print?
01.{
02."button":[             //button定义该结构为一个菜单
03.{
04."name":"分支主菜单名",  
05."sub_button":[    //sub_button定义子菜单
06.{
07."type":"click",  //按钮类型
08."name":"分支子菜单名1",  //菜单名称
09."key":"loveSuzhou"  //菜单key值
10.},
11.{
12."type":"click",
13."name":"分支子菜单名2",
14."key":"liveSuzhou"
15.}]
16.},    //菜单之间用 , 分隔
17.{
18."type":"click",
19."name":"独立菜单",
20."key":"lianxiUs"
21.}]
22.}

返回说明:

正确的Json返回结果:

{"errcode":0,"errmsg":"ok"}

提交菜单:

通过curl 提交以上的菜单数据,代码如下:

view source
print?
01.$MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$ACC_TOKEN;
02. 
03.$ch = curl_init();
04. 
05.curl_setopt($ch, CURLOPT_URL, $MENU_URL);
06.curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
07.curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
08.curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
09.curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
10.curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
11.curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
12.curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
13.curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
14. 
15.$info = curl_exec($ch);
16. 
17.if (curl_errno($ch)) {
18.echo 'Errno'.curl_error($ch);
19.}
20. 
21.curl_close($ch);
22. 
23.var_dump($info);

运行结果:

\

测试结果:

\

菜单创建成功。

五、查询菜单

查询当前使用的自定义菜单结构。

请求地址:https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

curl 代码如下:

view source
print?
01.$MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$ACC_TOKEN;
02. 
03.$cu = curl_init();
04.curl_setopt($cu, CURLOPT_URL, $MENU_URL);
05.curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
06.$menu_json = curl_exec($cu);
07.$menu = json_decode($menu_json);
08.curl_close($cu);
09. 
10.echo $menu_json;

运行结果:

\

菜单查询成功。

六、删除菜单

取消当前使用的自定义菜单。

请求地址:https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

curl 代码如下:

view source
print?
01.$MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$ACC_TOKEN;
02. 
03.$cu = curl_init();
04.curl_setopt($cu, CURLOPT_URL, $MENU_URL);
05.curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
06.$info = curl_exec($cu);
07.$res = json_decode($info);
08.curl_close($cu);
09. 
10.if($res->errcode == "0"){
11.echo "菜单删除成功";
12.}else{
13.echo "菜单删除失败";
14.}

运行结果:

\


0 0