.Net实现微信公众平台开发接口(三) 之 “信息回复”
对于每一个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实现微信公众平台开发接口(三) 之 “信息回复”的更多相关文章
- 微信公众平台开发接口PHP SDK
以前没接触过微信公众平台开发,前几天刚找到实习公司就要求我做一个微信公众平台的应用,于是乎开始学习微信公众平台开发接口的调用,看开发文档之后还是不知道从何入手,只好上网找入门资料,终于在方倍工作室找到 ...
- 微信公众平台开发(十) 消息回复总结——用其xml模板
一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...
- .Net实现微信公众平台开发接口(一) 之 “微信开发配置”
我们只要通过微信官方认证,成为开发者,才能实现微信提供的各种接口,否则即使调用了接口,微信也不会实现推送,功能也无法通过开发模式真正得到实现,所以需要正确配置微信信息,通过微信官方认证,成为开发者才可 ...
- 微信公众平台开发(三) 订阅事件(subscribe)处理
一.简介 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理. 在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台, ...
- .Net实现微信公众平台开发接口(二) 之 “获取access_token”
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/ ...
- ASP.NET Web API实现微信公众平台开发(三)自定义菜单
承接之前的流程,在完成服务器绑定和获取access_token之后,本文主要讲述如何实现微信自定义菜单. 官方示例效果 开始之前 .自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. ...
- 微信公众平台开发接口PHP SDK完整版(转载)
<?php/* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved*/ define("TOK ...
- 微信公众平台开发接口PHP SDK完整版
<?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...
- 170303、PHP微信公众平台开发接口 SDK完整版
<?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved */ define("TOKEN&q ...
随机推荐
- phpStorm无法使用svn1.8的解决办法
1.安装SVN的Command Lines Tools. 2.在phpStorm的SVN属性中,将Use Command Line Client填入:C:\Program Files\Tortoise ...
- WPF笔记一
笔记内容: BUG.WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网 ...
- 【linux】——FreeBSD 建立 SSH 连接慢的解决方法
一般在编写 linux 程序的时候,会使用 SecureCRT 或者 xshell 等工具远程登录到 linux 服务器上.最近发现在建立 SSH 连接的时候,非常慢,但是建立连接成功之后可以正常使用 ...
- 移植UE4的模型操作到Unity中
最近在Unity上要写一个东东,功能差不多就是在Unity编辑器上的旋转,移动这些,在手机上也能比较容易操作最好,原来用Axiom3D写过一个类似的,有许多位置并不好用,刚好在研究UE4的源码,在模型 ...
- JAVA本地远程连接linux程序监控状态
环境: 1.本地window 2.程序部署在centos 一,启动访问权限安全守护程序 新建文件:jstatd.all.policy ,注意路径 grant codebase "$JA ...
- SRM 591 div1 275
topcoder被Appirio收购了 好久没做tc,这个题目挺简单.就是Arena里面看不到图片,只能去tc网站上找题目.http://community.topcoder.com/stat?c= ...
- Mac OS X Tips
命令行查看Mac OS X版本 $ sw_vers ProductName: Mac OS X ProductVersion: BuildVersion: 14D131 Mac OS X截图 不要使用 ...
- WebDriver基本API使用手册(基于Java和C#)
WebDriver基本API使用手册(基于Java和C#) http://www.docin.com/p-747728551.html
- 关于STM32 CAN回环可用,正常不可用情况分析
1.回环下应该与GPIO无关 2.GPIO是否初始化正确,时钟启用 3.是否复用,AFIO时钟是否启用 4.回环下是否有CAN_Tx应该有输出 5.终端电阻是否有 6.CAN收发器电路电压是否正常 7 ...
- iOS开发中一些常见的并行处理
本文主要探讨一些常用多任务的最佳实践.包括Core Data的多线程访问,UI的并行绘制,异步网络请求以及一些在运行态内存吃紧的情况下处理大文件的方案等.??其实编写异步处理的程序有很多坑!所以,本文 ...