自定义菜单点击事件处理
当用户点击某个菜单后,微信服务器会发送一个 XML 文档到我们服务器上配置的接口地址(即之前配置的 Common 接口)。我们可以解析这个 XML 文档来获取点击事件信息。
自定义菜单事件推送说明
用户点击自定义菜单后,微信会把点击事件推送给开发者。注意:点击菜单弹出子菜单不会产生上报。
点击菜单拉取消息时的事件推送 XML 示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>Code language: HTML, XML (xml)
参数说明:
| 参数 | 描述 |
|---|---|
| ToUserName | 开发者微信号 |
| FromUserName | 发送方帐号(一个 OpenID) |
| CreateTime | 消息创建时间(整型) |
| MsgType | 消息类型,event |
| Event | 事件类型,CLICK |
| EventKey | 事件 KEY 值,与自定义菜单接口中 KEY 值对应 |
其中 EventKey 对应之前新增菜单时配置的 key,例如 V1001_TODAY_MUSIC。通过这个值可以判断是哪个按钮被点击了。
控制器中处理菜单点击事件
在 Common 方法的 POST 分支中增加对 event 类型的处理:
[HttpPost]
public IActionResult Common()
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(Request.Body);
XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
XmlNode Event = xmldoc.SelectSingleNode("/xml/Event");
switch (MsgType.InnerText)
{
case "text":
var ret = "你好吗";
if (Content.InnerText.Contains("天气"))
{
ret = "21摄氏度";
}
string returnXml = string.Format(@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[{3}]]></MsgType>
<Content><![CDATA[{4}]]></Content>
</xml>",
FromUserName.InnerText,
ToUserName.InnerText,
OtherUtil.GetTimestamp(DateTime.Now),
"text",
ret);
return this.Content(returnXml);
case "event":
switch (Event.InnerText.ToLower())
{
case "click":
string returnXml2 = string.Format(@"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[{3}]]></MsgType>
<Content><![CDATA[{4}]]></Content>
</xml>",
FromUserName.InnerText,
ToUserName.InnerText,
OtherUtil.GetTimestamp(DateTime.Now),
"text",
"请不要点击。");
return this.Content(returnXml2);
default:
break;
}
break;
default:
break;
}
return this.Content("");
}Code language: HTML, XML (xml)
Previous: 09-公众号菜单管理
Next: 11-关注或者取消关注事件-发送欢迎消息