【客服】自动回复完整代码

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. 逻辑流程

  1. 解析微信POST过来的XML,取出Content用户发送文本
  2. 判断用户消息是否等于 【客服】
  3. 匹配成功:使用string.Format填充XML模板,返回“请稍等…”
  4. 设置输出编码UTF8,把XML返回给微信服务器
  5. Response.End()终止页面输出,放在try-catch外部

5. 效果

微信用户在公众号对话框发送:【客服】 公众号自动回复:请稍等...

发表回复

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