上一篇做好了基本配置之后,现在可以学习如何回复消息了。
当有用户向公众号发送消息的时候,微信会向我们的借口以POST的方式推送消息。以普通文本为例,消息格式如下:
<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>
含义如下:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
当我们的服务器收到这样的消息的时候,就可以进行响应,可以回复文本、图片、图文、语音、视频、音乐等等。
继续以文本消息为例,我们要回复的消息格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
参数 | 是否必须 | 描述 |
---|---|---|
ToUserName | 是 | 接收方帐号(收到的OpenID) |
FromUserName | 是 | 开发者微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | text |
Content | 是 | 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) |
可以看到,回复的消息和收到的消息刚好对起止用户进行了颠倒。另外,用户发来的消息里面包含有MsgId,因为微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
下面贴一段简单的示例代码:
public void Index()
{
//微信服务器一直把用户发过来的消息,post过来
if (Request.HttpMethod == "POST")
{
var reader = XmlReader.Create(Request.InputStream);
var doc = XDocument.Load(reader);
var xml = doc.Element("xml");
string requestFromUserID = xml.Element("FromUserName").Value;
string requestToUserID = xml.Element("ToUserName").Value;
string strRespose = "<xml>";
strRespose += "<ToUserName><![CDATA[{0}]]></ToUserName>";
strRespose += "<FromUserName><![CDATA[{1}]]></FromUserName>";
strRespose += "<CreateTime>{2}</CreateTime>";
strRespose += "<MsgType><![CDATA[text]]></MsgType>";
strRespose += "<Content><![CDATA[{3}]]></Content>";
strRespose += "</xml>";
Response.Write(string.Format(strRespose, requestFromUserID, requestToUserID, DateTime.Now.ToBinary(), "感谢您回复消息!"));
}
else if (Request.HttpMethod == "GET") //微信服务器在首次验证时,需要进行一些验证,但。。。。
{
if (string.IsNullOrEmpty(Request["echostr"]))
{
#if DEBUG
Response.Write("无法获取微信接入信息,仅供测试!");
#endif
return;
}
Response.Write(Request["echostr"].ToString());
}
else
{
// 这里不正确
Response.Write("wrong");
}
}
这是个最简单的示例,用户回复消息之后就会收到 "感谢您回复消息!"的回复,效果如下: