《微信公众平台入门到精通》Vol.19

1756 查看

教程跳票已经很久,5.0出来以后很多朋友在后台咨询如何用开发模式做自定义菜单,由于ZTalk是订阅号没有办法申请接口,幸好WeMedia联盟的公众账号已经转为服务号,就拿它来做教程了。

源码请在公众号里输入 “微信代码” 查看下载连接,然后将下载链接自己想办法搞到PC上然后再下载……建议先下载安装了再看文章,以下是注意事项:

1、make_menu.php是一个简易版的自定义菜单生成器,需要修改的是Appid和AppSecret,文件与原来和微信通讯接口文件无关,只要下载后放到SAE上就可以执行,也不需要数据库。

2、interface.php里主要是自定义菜单在用户点击后可以回复的一些东西,供大家参考。

3、自定义菜单编辑模式的操作我这里不写了,大家可以看《微信公众平台入门到精通》Vol.4


第十五章 自定义菜单开发模式详解

一、如何获取凭证(token)

话说微信的接口指南一直做得不咋地,这边鼓励大家都转服务号,这边给的说明文档除了码农真没几个能看明白的,一点也不考虑大量的小白运营者,干脆叫指北算了。

牢骚完毕先说下开发自定义菜单第一步要做的就是获取凭证,即access_token,这步非常重要,微信接下来会开放更多的开发接口,开发者要操作接口都要通过这个access_token,而这个凭证是需要通过接口来生成的,并且是有失效时间的。

生成凭证需要两个第三方的固定ID和秘钥,进入开发模式的页面,已经获取到自定义菜单接口权限的朋友会看到下图:

除了原来接口通讯url和自己设置的token多了两个新字段即Appid和AppSecret,也就是第三方的固定ID和秘钥,有了这个就能通过接口程序获取到临时的凭证。将这两个id放到代码如下图位置:

这段代码主要是初始化了memcache和curl类,分别是缓存和抓取用的,同时将ID和秘钥也赋值了。接下来就是通过接口获取token,代码如下图:

这是一个获取接口的函数,函数运行时首先是监测缓存中是否已经有token,如果有则直接从缓存中取,要知道官方限制每天只能获取100次token,所以做个缓存很有必要。

如果缓存中没有token或者缓存时间过期,那么就使用curl这个类发送Appid和AppSecret到接口获取token,curl_setopt是定义抓取属性的,curl_exec是运行抓取,想了解相关的可以百度一下。

获取的到是一个json格式数据,使用json_decode转化为数组,然后判断是否获取到,如果没有则输出错误信息,获取成功则将该token保存到缓存中,同时函数返回token退出。这样我们就很方便的拿到了凭证。


二、自定义菜单创建、查询和删除

拿到access_token以后我们就可以开始进行自定义菜单操作了,首先是创建自定义菜单,官方说明很简单“通过POST一个特定结构体,实现在微信客户端创建自定义菜单。”然后有一个特定结构体的示例,如下图:

还有一些关于这个特定结构体字段的说明:

参数 是否必须 说明
button 按钮数组,按钮个数应为2~3个
sub_button 子按钮数组,按钮个数应为2~5个
type 按钮类型,目前有click类型
name 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
key 类型为click必须 按钮KEY值,用于消息接口(event类型)推送,不超过128字节

我估计有不少朋友会看的头晕,一是这个特定结构体传输过去时应该赋值给那个变量?二是这个结构体如何生成?首先传输过去不需要任何变量参数,其次这就是一个json格式数据,我们可以用数组来转换生成。

创建菜单的函数非常简单,如下图:

在这里curl抓取页面的方式不是get而是post,所以属性会有所不同,但是主要是接口地址和发送的特定结构体,这里的特定结构体是外面传递进来的值,变量名为$menu。

主要来看下我做的简易版的菜单生成器,直接在浏览器里打开make_menu.php就可以看到如下图(注意修改下代码里的Appid和AppSecret):

本来想做些JS效果的,但是这个菜单结构本来就很简单,就不多事了,上图三个区块分别对应三个底栏的主菜单,每个区块都有主菜单名、关键字和子菜单。

在说上面的菜单前先讲下自定义菜单的规则,无论是主菜单还是子菜单目前都是由最多三个属性组成的,即名称、关键字、类型(目前只有click,进行点击操作时会将关键字发送给微信后台),其中主菜单如果有子菜单的话,属性就两个,即名称、子菜单(点击操作时显示子菜单)。

如上所述我设计的这个简易版生成器忽略了类型选择,如果主菜单有子菜单时主菜单关键字其实是不记录的,子菜单没什么可变化的就两个属性名称和关键字,类型默认为click。

当然未来会有新的菜单类型出来,比如地理位置,在这个基础改动下也非常方便就能使用。下面详细说下这个菜单的输入框要填写什么。

主菜单名称:底栏显示的名字,建议4-5个中文字或者8-10个英文字符,否则会名称显示会出现省略号;

主菜单关键字:主菜单向后台发送的关键字,如果该菜单有子菜单则关键字失效。

子菜单:子菜单我使用了textarea,每个子菜单格式为“菜单名,关键字”,用换行来区分多个子菜单项。

表单提交后程序将进行处理,如图:

进行三次循环,每次都会读取一个区块的菜单,如果该区块主菜单名称不为空,则判断是否有子菜单,没有子菜单则直接生成主菜单,否则读取子菜单,同时判断子菜单是否超过5个。

这里使用urlencode是因为中文在数组转json时会被编码为unicode,微信接口无法识别,所以得在json_encode前先来个编码,等转换后再用urldecode转回来,这样传输给接口的就是正常的中文了。

另外特定结构体的数组结构其实是[button]-》[main_menu]-》[sub_menu],所以三个主菜单最后是赋值给button这个数组的一个元素。

当特定结构体生成后分别执行新建make_menu类,删除旧菜单,创建新菜单,即:

$mk_menu=new make_menu();
$mk_menu->del_menu();
$mk_menu->create_new_menu($menu);

查询、删除菜单的代码非常简单大家可以自己看,分别是get_menu()和del_menu()两个函数。


三、接收自定义菜单关键字

自定义菜单生成后最重要的还是要和用户互动,那么如何进行互动呢?首先要理解自定义菜单到底是个什么玩意,其实点击菜单跟向微信公众平台发送一个文字是一样的,也就是用户输入文字公众平台自动回复可以做的事情理论上自定义菜单都可以完成!

但是有一点不同的是,用户输入文字时我们接收的消息类型是文字消息,但是自定义菜单的消息是事件推送,也就是它的类型是event,如果有看过我之前教程的朋友应该知道,可以通过这个类型的两个事件subscribe和unsubscribe来统计关注和取消关注的人数,菜单点击则是第三个类型“CLICK”。

也就是当后台捕捉到“CLICK”这个操作时就表示这是用户点击了自定义菜单,然后可以获取到EventKey(事件关键字),就是在创建菜单时设置的菜单关键字,后面的就不用我再详细说了吧。

以下是一些代码截图,可供参考:

先获取消息类型为事件推送,然后监测到事件类型是自定义菜单点击,然后获取该菜单关键字。

回复文字消息

回复音乐消息

回复图文消息



一些效果截图,想要测试效果的请微信搜索“wemedia”关注,点击这里也可下载本期教程源码包。