被动回复用户消息
用户给公众号发消息时,我们可以在公众平台中回复,但往往不会天天盯着后台。微信提供了一种被动回复用户消息的功能:当有微信号给公众号发内容时,程序自动回复。
这就需要对一开始在公众号后台配置的那个接口实现 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 | 消息创建时间(整型) |
| MsgType | text |
| 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 等,需要进行二次判断。
Previous: 07-动态类和匿名对象在微信公众号中的应用
Next: 09-公众号菜单管理