10-菜单事件托送接收

自定义菜单点击事件处理

当用户点击某个菜单后,微信服务器会发送一个 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注