08-被动回复用户消息

被动回复用户消息

用户给公众号发消息时,我们可以在公众平台中回复,但往往不会天天盯着后台。微信提供了一种被动回复用户消息的功能:当有微信号给公众号发内容时,程序自动回复。

这就需要对一开始在公众号后台配置的那个接口实现 POST 方法。

被动的意思是:用户给公众号发送了内容,公众号才能给这个用户发。微信对消息管理很严格,为了避免骚扰用户,权限管控很严,不是随便就能给某人发消息的。

用户主动发消息给公众号时,可以回复内容。

被动回复接口说明

文档地址:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

回复文本消息 XML 格式:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>12345678</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[你好]]></Content>
</xml>Code language: HTML, XML (xml)

参数说明:

参数是否必须描述
ToUserName是接收方帐号(收到的 OpenID)
FromUserName是开发者微信号
CreateTime是消息创建时间(整型)
MsgType是text
Content是回复的消息内容(换行:在 content 中能够换行,微信客户端就支持换行显示)

接收普通消息

怎么知道微信号给我们发了什么内容?参考文档:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

一旦用户通过微信发了内容给公众号,微信服务器会推送一条消息到第二节课中配置的地址(即 Common 接口),但是以 POST 方式发送,并且数据放在 HTTP Body 中,不是表单参数。

接收到文本消息的 XML 格式:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>Code language: HTML, XML (xml)

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个 OpenID)
CreateTime消息创建时间(整型)
MsgTypetext
Content文本消息内容
MsgId消息 id,64 位整型

控制器中实现 POST 方法

测试可以使用 Postman。在 Home 控制器的 Common 方法中增加 POST 处理:

[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":
                default:
                    break;
            }
            break;

        default:
            break;
    }

    return this.Content("");
}Code language: HTML, XML (xml)

只有一个接口,所以通过 XML 文档的 MsgType 节点来判断消息类型,区分是 text、video 还是 event。event 可能是点击按钮事件、订阅、view 等,需要进行二次判断。

发表回复

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