1. 回复模板字符串
// 回复XML模板
string ResponTemplateFormat = @"<xml>
<ToUserName><![CDATA[{0}]]></ToUserName>
<FromUserName><![CDATA[{1}]]></FromUserName>
<CreateTime>{2}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{3}]]></Content>
</xml>";
Code language: HTML, XML (xml)
模板参数顺序:
{0}:接收方(公众号OpenId){1}:发送方(用户OpenId){2}:时间戳{3}:回复文本内容
2. 消息判断逻辑
// 读取xml节点
XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
string responseContent = "";
if (Content.InnerText == "【客服】")
{
responseContent = string.Format(ResponTemplateFormat,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"请稍等...");
}
else
{
// 可选:其他消息默认回复
responseContent = string.Format(ResponTemplateFormat,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
"收到你的消息");
}
// 设置编码,输出xml
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
Code language: JavaScript (javascript)
3. 重点注意
✅不要把 Response.End() 写在 try-catch 内部
Response.End()会主动抛出ThreadAbortException(正在中止线程)。 如果放在try块里面,会被catch捕获,导致微信收不到正常的echostr校验结果,报verify token fail(00302)。
错误写法示例
try
{
Response.Write(xml);
Response.End(); // 不要放在try里面!
}
catch(Exception ex)
{
}
Code language: PHP (php)
推荐写法
try
{
// 业务处理、拼接responseContent
}
catch(Exception ex)
{
// 记录日志
}
// Response.End() 放到 try-catch 的外面
HttpContext.Current.Response.Write(responseContent);
HttpContext.Current.Response.End();
Code language: PHP (php)
4. 逻辑流程
- 解析微信POST过来的XML,取出
Content用户发送文本 - 判断用户消息是否等于
【客服】 - 匹配成功:使用
string.Format填充XML模板,返回“请稍等…” - 设置输出编码UTF8,把XML返回给微信服务器
Response.End()终止页面输出,放在try-catch外部
5. 效果
微信用户在公众号对话框发送:【客服】 公众号自动回复:请稍等...