了解菜单的事件机制和关注/扫描事件推送
一、菜单点击事件机制
在自定义菜单中,click 类型的按钮需要配置 key 字段,这个 key 就是按钮的唯一标识符。当用户点击该菜单按钮时,微信服务器会向开发者服务器推送一个 CLICK 事件,并携带对应的 key 值。
Senparc SDK 将这一事件封装在 MessageHandler 的 OnEvent_ClickRequest 方法中,开发者只需重写该方法即可处理不同菜单按钮的点击逻辑。
重写 OnEvent_ClickRequest 方法
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage)
{
IResponseMessageBase responseMessage = null;
switch (requestMessage.EventKey)
{
case "OneClick":
{
// 响应文本消息
var textResponse = CreateResponseMessage<ResponseMessageText>();
textResponse.Content = "您点击了菜单按钮,EventKey 为:OneClick";
responseMessage = textResponse;
break;
}
case "SubClickRoot_Text":
{
var textResponse = CreateResponseMessage<ResponseMessageText>();
textResponse.Content = "您点击了子菜单文本按钮";
responseMessage = textResponse;
break;
}
case "SubClickRoot_News":
{
// 响应图文消息
var newsResponse = CreateResponseMessage<ResponseMessageNews>();
newsResponse.Articles.Add(new Article()
{
Title = "您点击了子菜单图文按钮",
Description = "您点击了子菜单图文按钮,这是一条图文信息。",
PicUrl = "http://weixin.foxd.cn/logo.png",
Url = "http://<a href="http://weixin.foxdevelop.com">weixin.bamn.cn</a>"
});
responseMessage = newsResponse;
break;
}
case "SubClickRoot_Music":
{
// 响应音乐消息
var musicResponse = CreateResponseMessage<ResponseMessageMusic>();
musicResponse.Music = new Music
{
Title = "音乐标题",
Description = "音乐描述",
MusicUrl = "http://weixin.foxdevelop.com/music.mp3",
HQMusicUrl = "<a href="http://weixin.foxdevelop.com">http://weixin.bamn.cn</a>/music.mp3"
};
responseMessage = musicResponse;
break;
}
default:
{
var defaultResponse = CreateResponseMessage<ResponseMessageText>();
defaultResponse.Content = "未匹配到对应菜单事件,EventKey:" + requestMessage.EventKey;
responseMessage = defaultResponse;
break;
}
}
return responseMessage;
}Code language: PHP (php)
关键点说明
requestMessage.EventKey:对应菜单配置中的key值,用于区分不同按钮。CreateResponseMessage<ResponseMessageNews>():创建图文消息响应,通过Articles.Add()添加图文条目。- 每个
Article包含:Title:标题Description:描述PicUrl:图片链接Url:点击跳转地址
- 图文消息一次最多可添加 8 条
Article。 - click 事件点击后,开发者可以返回文本、图文、音乐、图片等任意类型消息;view 事件点击后直接跳转 URL,不会触发此事件。
二、关注事件推送
当用户关注公众号时,微信服务器会推送 subscribe 事件。重写 OnEvent_SubscribeRequest 方法即可处理。
public override IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage)
{
var responseMessage = CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "欢迎关注北盟网校公众号!回复关键字获取更多信息。";
return responseMessage;
}Code language: PHP (php)
提示:关注事件也可携带
EventKey(如扫描带参数二维码关注),可通过requestMessage.EventKey获取二维码场景值。
三、扫描事件推送
用户已关注公众号后,扫描带参数二维码会触发 SCAN 事件。重写 OnEvent_ScanRequest 方法处理。
public override IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
{
var responseMessage = CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "您扫描了二维码,场景值:" + requestMessage.EventKey;
return responseMessage;
}Code language: PHP (php)
扫描事件与关注事件的区别
| 场景 | 触发事件 | 方法 |
|---|---|---|
| 未关注用户扫描二维码 | subscribe + EventKey 带 qrscene_ 前缀 | OnEvent_SubscribeRequest |
| 已关注用户扫描二维码 | scan | OnEvent_ScanRequest |
四、事件类型汇总
| 事件类型 | 重写方法 | 说明 |
|---|---|---|
| 菜单点击(click) | OnEvent_ClickRequest | 点击菜单按钮触发 |
| 菜单跳转(view) | OnEvent_ViewRequest | 点击菜单跳转链接触发,无法回复消息 |
| 关注 | OnEvent_SubscribeRequest | 用户关注公众号 |
| 取消关注 | OnEvent_UnsubscribeRequest | 用户取消关注,无法回复消息 |
| 扫描二维码 | OnEvent_ScanRequest | 已关注用户扫描带参数二维码 |
| 上报地理位置 | OnEvent_LocationRequest | 用户同意上报位置后每次进入触发 |
| 模板消息发送完成 | OnEvent_TemplateSendJobFinishRequest | 模板消息投递结果通知 |
注意:view 类型菜单点击和取消关注事件虽然会推送,但开发者返回的消息客户端不会展示。
Previous: 使用 Senparc 群发图文消息(测试公众号暂不支持)