.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 ...
随机推荐
- web项目总结
web项目 Webroot下面的index.jsp页面的内容: <%@ page language="java" pageEncoding="UTF-8" ...
- define 与 inline
define 就是代码替换,在编译阶段进行简单的代码替换,大量用于宏定义开关,以及定义表达式和常量,如: 1.开关定义 #define CONFIG_OPENED 使用: #ifdef CONGFIG ...
- Windows 2008 利用Filezilla server搭建FTP
Windows 2008 利用Filezilla server搭建FTP, 安装后总是提示Error Connection To Server Lost , 后来,无意中先安装了IIS,再安装file ...
- CentOS 6.5 EasyPR环境搭建
EasyPR是一款开源的中文车牌识别系统,项目地址. 在搭建的过程中,主要的问题是注意版本的兼容性,这里面的版本包括:opencv版本,g++版本以及cmake版本. 我使用的EasyPr版本信息如下 ...
- centos 7 /etc/rc.local 开机不执行的问题
最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 1 2 3 4 5 6 7 8 9 10 11 #!/bin/ ...
- 无须任何软件配置iis+ftp服务器图文说明
1.1 检查是否安装已安装IIS6组件 在windows service 2003 操作系统中,windows组件“IIS6.0”是用户搭建站点以及ftp文件共享的服务器. 具体检查步骤如下: 进入“ ...
- dubbo 2.5.4-SNAPSHOT dubbo-admin 报错
问题描述: RROR context.ContextLoader - Context initialization failed org.springframework.beans.factory.B ...
- 关于meta知多少
本来打算写关于手机端的知识,想了想先从meta着手.接下来请大家看几个网站的例子. 一.天猫(http://m.tmall.com) <title>天猫触屏版</title> ...
- GPUImage 内置滤镜解析
#pragmamark - 调整颜色 Handle Color GPUImageBrightnessFilter //亮度GPUImageExposureFilter //曝光GPUImageCont ...
- AngularJS初始化闪烁
可以使用:ng-if和ng-cloak解决,原因见:http://www.cnblogs.com/whitewolf/p/3495822.html