.Net实现微信公众平台开发接口(三) 之 “信息回复”

时间:2022-09-01 16:10:25

对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。请注意,回复图片等多媒体消息时需要预先上传多媒体文件到微信服务器,只支持认证服务号。

今天说说下面三个

1、关注回复

2、自动回复

3、关键字回复

一、关注回复,自动默认回复

所谓关注回复,就是当关注着搜到公众号的时候,点击关注之后,微信返回给用户的信息,具体的实现办法

自动默认回复,就是无论你发送什么信息,如果没有特别处理,系统默认回复的信息。

接收微信的信息和发送信息,都是xml格式的,具体在开发文档中都有具体的说明的,现在就来说说如果实现微信信息的处理和应答。

1、先把预先设置好的回复信息保存到数据库表里面

CREATE TABLE [dbo].[w_reply](
[reply_id] [int] IDENTITY(1,1) NOT NULL,
[reply_text] [varchar](max) NULL,
[reply_type] [varchar](50) NULL,
[article_id] [int] NULL,
[wechat_id] [int] NULL,
[reply_fangshi] [int] NULL,
CONSTRAINT [PK_w_reply] PRIMARY KEY CLUSTERED
(
[reply_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

wechatapi.aspx页面处理下面信息

2、接收微信发过来的信息

   #region 接收微信消息
/// <summary>
/// 接收微信信息
/// </summary>
private void RequestMsg()
{
//接收信息流
Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
byte[] requestByte = new byte[requestStream.Length];
requestStream.Read(requestByte, , (int)requestStream.Length);
//转换成字符串
string requestStr = Encoding.UTF8.GetString(requestByte); if (!string.IsNullOrEmpty(requestStr))
{
//封装请求类到xml文件中
XmlDocument requestDocXml = new XmlDocument();
requestDocXml.LoadXml(requestStr);
XmlElement rootElement = requestDocXml.DocumentElement;
XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //将XML文件封装到实体类requestXml中
RequestXml requestXml = new RequestXml();
requestXml.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;//开发者微信号
requestXml.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;//发送方微信号
requestXml.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//消息发送信息
requestXml.MsgType = MsgType.InnerText; //获取接收信息的类型
switch (requestXml.MsgType)
{
//接收普通信息
case "text"://文本信息
requestXml.Content = rootElement.SelectSingleNode("Content").InnerText;
break;
case "image"://图片信息
requestXml.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
break;
case "location"://地理位置信息
requestXml.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
requestXml.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
break;
//接收事件推送
//大概包括有:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息时的事件推送、点击菜单跳转链接时的事件推送
case "event":
requestXml.Event = rootElement.SelectSingleNode("Event").InnerText;
requestXml.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
break;
} string selday = "";
int hh = selday == "" ? : int.Parse(selday) * * ;
//将发送方和接收方写入cookie中,后期使用
CookieHelper.WriteCookie("WeChatFrom", "ToUserName", requestXml.ToUserName, hh);
CookieHelper.WriteCookie("WeChatFrom", "FromUserName", requestXml.FromUserName, hh); //回复消息
ResponseMsg(requestXml);
} }
#endregion 接收微信消息

3、回复信息

 #region 回复消息(微信信息返回)
/// <summary>
/// 回复消息(微信信息返回)
/// </summary>
/// <param name="weixinXML"></param>
private void ResponseMsg(RequestXml requestXml)
{
string resXml = "";
string WeChat_Key = Request.QueryString["key"]; try
{
DataTable dtWeChat = wechatdal.GetList("wechat_key='" + WeChat_Key + "'").Tables[]; if (dtWeChat.Rows.Count > )
{
replyset.User_ID = dtWeChat.Rows[]["user_id"].ToString();
replyset.WeChat_ID = dtWeChat.Rows[]["wechat_id"].ToString();
replyset.WeChat_Type = dtWeChat.Rows[]["wechat_type"].ToString();
replyset.WeChat_Name = dtWeChat.Rows[]["wechat_name"].ToString(); switch (requestXml.MsgType)
{
//当收到文本信息的时候回复信息
case "text":
resXml = replyset.GetKeyword(requestXml.FromUserName, requestXml.ToUserName, requestXml.Content);
break;
//当接收推送事件时回复的信息
case "event":
switch (requestXml.Event)
{
//关注的时候回复信息
case "subscribe":
resXml = replyset.GetSubscribe(requestXml.FromUserName, requestXml.ToUserName);
break;
//自定义菜单的时候回复信息
case "CLICK":
resXml = replyset.GetMenuClick(requestXml.FromUserName, requestXml.ToUserName, requestXml.EventKey);
break;
}
break;
}
}
}
catch (Exception ex)
{
Writebug("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());
}
//发送xml格式的信息到微信中
Response.Write(resXml);
Response.End();
}
#endregion 回复消息(微信信息返回)

加载wechatapi.aspx的load时间

 protected void Page_Load(object sender, EventArgs e)
{
if (Request.HttpMethod.ToLower() == "post")
{
RequestMsg();
}
else
{
//微信通过get请求验证api接口
CheckWeChat();
}
}

reply.cs

 public class replyset
{
public string hostUrl = "http://" + HttpContext.Current.Request.Url.Authority; //域名
public string upfileurl = "http://file.api.weixin.qq.com/cgi-bin/media/upload";
public string baiduImg = "http://api.map.baidu.com/staticimage?center={0},{1}&width=700&height=300&zoom=11";
public string User_ID = "";
public string WeChat_ID = "";
public string WeChat_Type = "";
public string WeChat_Name = ""; w_caidan_dal caidandal = new w_caidan_dal();
w_reply_dal replydal = new w_reply_dal();
w_article_dal articledal = new w_article_dal();
w_keyword_dal keyworddal = new w_keyword_dal();
w_vlimg_dal vlimgdal = new w_vlimg_dal();
w_vlimg_model vlimgmodel = new w_vlimg_model();
w_images_dal imagesdal = new w_images_dal(); common wxCommand = new common();
JsonOperate JsonOperate = new JsonOperate();
JavaScriptSerializer Jss = new JavaScriptSerializer(); public replyset()
{ } #region 关注回复
/// <summary>
/// 关注的时候回复
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <returns></returns>
public string GetSubscribe(string FromUserName, string ToUserName)
{
string resXml = "";
string sqlWhere = !string.IsNullOrEmpty(WeChat_ID) ? "WeChat_ID=" + WeChat_ID + " and reply_fangshi=2" : ""; DataTable dtSubscribe = replydal.GetRandomList(sqlWhere, "").Tables[]; if (dtSubscribe.Rows.Count > )
{
string article_id = dtSubscribe.Rows[]["article_id"].ToString();
string reply_type = dtSubscribe.Rows[]["reply_type"].ToString();
string reply_text = dtSubscribe.Rows[]["reply_text"].ToString(); if (reply_type == "text")
{
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + reply_text + "]]></Content><FuncFlag>0</FuncFlag></xml>";
}
else
{
resXml = GetArticle(FromUserName, ToUserName, article_id, User_ID);
}
} return resXml;
}
#endregion 关注回复 #region 自动回复
/// <summary>
/// 自动默认回复
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="WeChat_ID"></param>
/// <param name="User_ID"></param>
/// <returns></returns>
public string GetDefault(string FromUserName, string ToUserName, string WeChat_ID, string User_ID)
{
string resXml = "";
string sqlWhere = !string.IsNullOrEmpty(WeChat_ID) ? "WeChat_ID=" + WeChat_ID + " and reply_fangshi=1" : "";
//获取保存的默认回复设置信息
DataTable dtDefault = replydal.GetRandomList(sqlWhere, "").Tables[]; if (dtDefault.Rows.Count > )
{
string article_id = dtDefault.Rows[]["article_id"].ToString();
string reply_type = dtDefault.Rows[]["reply_type"].ToString();
string reply_text = dtDefault.Rows[]["reply_text"].ToString();
//如果选择的是文本
if (reply_type == "text")
{
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + reply_text + "]]></Content><FuncFlag>0</FuncFlag></xml>";
}
else
{
//返回素材(图文列表)
resXml = GetArticle(FromUserName, ToUserName, article_id, User_ID);
}
} return resXml;
}
#endregion 默认回复 #region 关键字回复
/// <summary>
/// 关键字回复
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="Content"></param>
/// <returns></returns>
public string GetKeyword(string FromUserName, string ToUserName, string Content)
{
string resXml = "";
string sqlWhere = "wechat_id=" + WeChat_ID + " and keyword_name='" + Content+"'"; DataTable dtKeyword = keyworddal.GetList(sqlWhere).Tables[]; if (dtKeyword.Rows.Count > )
{
dtKeyword = keyworddal.GetRandomList(sqlWhere, "").Tables[]; if (dtKeyword.Rows.Count > )
{
string article_id = dtKeyword.Rows[]["article_id"].ToString();
string keyword_type = dtKeyword.Rows[]["keyword_type"].ToString();
string keyword_text = dtKeyword.Rows[]["keyword_text"].ToString(); switch (keyword_type)
{
case "text":
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + keyword_text + "]]></Content><FuncFlag>0</FuncFlag></xml>";
break;
case "news":
resXml = GetArticle(FromUserName, ToUserName, article_id, User_ID);
break;
}
}
}
else
{
resXml = GetDefault(FromUserName, ToUserName, WeChat_ID, User_ID);
} return resXml;
}
#endregion 关键字回复 #region 菜单单击
/// <summary>
/// 菜单点击事件回复信息
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="EventKey"></param>
/// <returns></returns>
public string GetMenuClick(string FromUserName, string ToUserName, string EventKey)
{
string resXml = "";
string sqlWhere = "wechat_id=" + WeChat_ID + " and caidan_key='" + EventKey + "'"; WriteTxt(sqlWhere);
try
{ DataTable dtMenu = caidandal.GetList(sqlWhere).Tables[]; if (dtMenu.Rows.Count > )
{
string article_id = dtMenu.Rows[]["article_id"].ToString();
string caidan_retype = dtMenu.Rows[]["caidan_retype"].ToString();
string caidan_retext = dtMenu.Rows[]["caidan_retext"].ToString(); switch (caidan_retype)
{
case "text":
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + caidan_retext + "]]></Content><FuncFlag>0</FuncFlag></xml>";
break;
case "news":
resXml = GetArticle(FromUserName, ToUserName, article_id, User_ID);
break;
}
}
}
catch (Exception ex)
{
WriteTxt("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());
} return resXml;
}
#endregion 菜单单击 #region 获取素材
/// <summary>
/// 获取素材
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="Article_ID"></param>
/// <param name="User_ID"></param>
/// <returns></returns>
public string GetArticle(string FromUserName, string ToUserName, string Article_ID, string User_ID)
{
string resXml = ""; DataTable dtArticle = articledal.GetList("article_id=" + Article_ID + " OR article_layid=" + Article_ID).Tables[]; if (dtArticle.Rows.Count > )
{
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>" + dtArticle.Rows.Count + "</ArticleCount><Articles>"; foreach (DataRow Row in dtArticle.Rows)
{
string article_title = Row["article_title"].ToString();
string article_description = Row["article_description"].ToString();
string article_picurl = Row["article_picurl"].ToString();
string article_url = Row["article_url"].ToString();
string article_type = Row["article_type"].ToString(); switch (article_type)
{
case "Content":
article_url = hostUrl + "/web/wechat/api/article.aspx?aid=" + Row["Article_ID"].ToString();
break;
case "Href":
article_url = Row["article_url"].ToString();
break;
} if (string.IsNullOrEmpty(article_url))
{
article_url = hostUrl + "/web/wechat/api/article.aspx?aid=" + Row["Article_ID"].ToString();
} article_url += (article_url.IndexOf("uid=") > - ? "" : (article_url.IndexOf("?") > - ? "&" : "?") + "uid=" + User_ID);
article_url += (article_url.IndexOf("wxid=") > - ? "" : (article_url.IndexOf("?") > - ? "&" : "?") + "wxid=" + FromUserName);
article_url += (article_url.IndexOf("wxref=") > - ? "" : (article_url.IndexOf("?") > - ? "&" : "?") + "wxref=mp.weixin.qq.com"); resXml += "<item><Title><![CDATA[" + article_title + "]]></Title><Description><![CDATA[" + article_description + "]]></Description><PicUrl><![CDATA[" + article_picurl + "]]></PicUrl><Url><![CDATA[" + article_url + "]]></Url></item>";
} resXml += "</Articles><FuncFlag>1</FuncFlag></xml>";
} return resXml;
}
#endregion 获取图文列表 #region 通用方法
/// <summary>
/// unix时间转换为datetime
/// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
private DateTime UnixTimeToTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
long lTime = long.Parse(timeStamp + "");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
} /// <summary>
/// datetime转换为unixtime
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
} /// <summary>
/// 记录bug,以便调试
/// </summary>
/// <returns></returns>
public bool WriteTxt(string str)
{
try
{
FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("Log/wxbugLog.txt"), FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
//开始写入
sw.WriteLine(str);
//清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs.Close();
}
catch (Exception)
{
return false;
}
return true;
}
#endregion 通用方法
}
}

、关键字回复

关键字的回复也很简单,我们先把对应的关键字和返回的信息都设置好,然后根据接收的信息中是否存在设置好的关键词来返回对应的信息即可

1、设置关键词(这里就不在多说了)

2、接收信息和回复信息前面也说到了,在这里只把关键词回复判断的方法贴出来供大家参考一下

  #region 关键字回复
/// <summary>
/// 关键字回复
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="Content"></param>
/// <returns></returns>
public string GetKeyword(string FromUserName, string ToUserName, string Content)
{
string resXml = "";
string sqlWhere = "wechat_id=" + WeChat_ID + " and keyword_name='" + Content+"'"; DataTable dtKeyword = keyworddal.GetList(sqlWhere).Tables[]; if (dtKeyword.Rows.Count > )
{
dtKeyword = keyworddal.GetRandomList(sqlWhere, "").Tables[]; if (dtKeyword.Rows.Count > )
{
string article_id = dtKeyword.Rows[]["article_id"].ToString();
string keyword_type = dtKeyword.Rows[]["keyword_type"].ToString();
string keyword_text = dtKeyword.Rows[]["keyword_text"].ToString(); switch (keyword_type)
{
case "text":
resXml = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + keyword_text + "]]></Content><FuncFlag>0</FuncFlag></xml>";
break;
case "news":
resXml = GetArticle(FromUserName, ToUserName, article_id, User_ID);
break;
}
}
}
else
{
resXml = GetDefault(FromUserName, ToUserName, WeChat_ID, User_ID);
} return resXml;
}
#endregion 关键字回复

其他还有很多图片回复,二维码扫描回复信息等都大同小异,处理方式都差不多,参考开发文档很快就能搞定,这里就不在多说了,不明白的地方在讨论。

.Net实现微信公众平台开发接口(三) 之 “信息回复”的更多相关文章

  1. 微信公众平台开发接口PHP SDK

    以前没接触过微信公众平台开发,前几天刚找到实习公司就要求我做一个微信公众平台的应用,于是乎开始学习微信公众平台开发接口的调用,看开发文档之后还是不知道从何入手,只好上网找入门资料,终于在方倍工作室找到 ...

  2. 微信公众平台开发(十) 消息回复总结——用其xml模板

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  3. &period;Net实现微信公众平台开发接口(一) 之 &OpenCurlyDoubleQuote;微信开发配置”

    我们只要通过微信官方认证,成为开发者,才能实现微信提供的各种接口,否则即使调用了接口,微信也不会实现推送,功能也无法通过开发模式真正得到实现,所以需要正确配置微信信息,通过微信官方认证,成为开发者才可 ...

  4. 微信公众平台开发(三) 订阅事件(subscribe)处理

    一.简介 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理. 在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台, ...

  5. &period;Net实现微信公众平台开发接口(二) 之 &OpenCurlyDoubleQuote;获取access&lowbar;token”

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/ ...

  6. ASP&period;NET Web API实现微信公众平台开发(三)自定义菜单

    承接之前的流程,在完成服务器绑定和获取access_token之后,本文主要讲述如何实现微信自定义菜单. 官方示例效果 开始之前 .自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. ...

  7. 微信公众平台开发接口PHP SDK完整版(转载)

    <?php/*    方倍工作室 http://www.fangbei.org/    CopyRight 2015 All Rights Reserved*/ define("TOK ...

  8. 微信公众平台开发接口PHP SDK完整版

    <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...

  9. 170303、PHP微信公众平台开发接口 SDK完整版

    <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...

随机推荐

  1. HDU 4605 Magic Ball Game (dfs&plus;离线树状数组)

    题意:给你一颗有根树,它的孩子要么只有两个,要么没有,且每个点都有一个权值w. 接着给你一个权值为x的球,它从更节点开始向下掉,有三种情况 x=w[now]:停在此点 x<w[now]:当有孩子 ...

  2. Metro风格的Android界面应用

    最近项目中需要一个选择月份查询客户余额的功能,原先的android只能满足查询当月,不可以查询任意月份.当然改起来还是很简单的,服务端增加一个月份参数,客户端传入这个参数即可.闲来无事,月份的选择风格 ...

  3. C&plus;&plus;公有继承

    is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/ar ...

  4. Swift&lpar;三&period;函数&rpar;

    一.swift中的函数分为以下几类吧 1>无参无返   2>无参有返 3>有参无返  4>有参有返  5>有参多返 二.看下面几个例子吧 1>无参无返 func a ...

  5. build opencv with python support

    cmake -DPYTHON_LIBRARY=/opt/anaconda/lib/libpython2.7.so -DPYTHON_INCLUDE_DIR=/opt/anaconda/include/ ...

  6. Multipart&sol;form-data POST文件上传详解&lpar;转&rpar;

    Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form ...

  7. 破解&amp&semi;屏蔽防止嵌入框架代码 top&period;location &excl;&equals; self&period;location

    <script type="text/javascript"> if (top.location != self.location) top.location = se ...

  8. Java 集合的简单实现 &lpar;ArrayList &amp&semi; LinkedList &amp&semi; Queue &amp&semi; Stack&rpar;

    ArrayList 就是数组实现的啦,没什么好说的,如果数组不够了就扩容到原来的1.5倍 实现了迭代器 package com.wenr.collection; import java.io.Seri ...

  9. Centos下快速安装Nginx

    1.准备工作 选首先安装这几个软件:GCC,PCRE(Perl Compatible Regular Expression),zlib,OpenSSL. Nginx是C写的,需要用GCC编译:Ngin ...

  10. LINUX涉及网络相关知识

    才接触到网络的老铁,是否比较晕呢? 简单记录一下网络相关知识吧(IPV4)! A0. 网络号.主机号 A1.网络地址分类: A2. 保留地址: A3. 子网掩码作用:(子网掩码.IPV4地址做“与”运 ...