asp.net 接入微信公众平台,回复消息,解决乱码问题
2015-07-10 13:04
711 查看
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Security.Cryptography; using System.IO; using System.Xml; using System.Text.RegularExpressions; namespace ServiceAndLock { /// <summary> /// wxapi 的摘要说明 /// </summary> public class wxapi : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.Request.HttpMethod.ToUpper() == "GET") { //string msg ="测试"; //context.Response.Write(msg); //context.Response.End(); // 微信加密签名 string signature = context.Request.QueryString["signature"]; // 时间戳 string timestamp = context.Request.QueryString["timestamp"]; // 随机数 string nonce = context.Request.QueryString["nonce"]; // 随机字符串 string echostr = context.Request.QueryString["echostr"]; if (CheckSignature(signature, timestamp, nonce)) { context.Response.Write(echostr); } } else if (context.Request.HttpMethod.ToUpper() == "POST") { //接收消息,根据消息回复 RequestX(context); } } /// <summary> /// 将原始字串转换为格式为....;.... /// </summary> /// <param name="srcText"></param> /// <returns></returns> private string StringToISO_8859_1(string srcText) { string dst = ""; char[] src = srcText.ToCharArray(); for (int i = 0; i < src.Length; i++) { string str = @"" + (int)src[i] + ";"; dst += str; } return dst; } /// <summary> /// 将字串....;....;格式字串转换为原始字符串 /// </summary> /// <param name="srcText"></param> /// <returns></returns> private string ISO_8859_1ToString(string srcText) { string dst = ""; string[] src = srcText.Split(';'); for (int i = 0; i < src.Length; i++) { if (src[i].Length > 0) { string str = ((char)int.Parse(src[i].Substring(2))).ToString(); dst += str; } } return dst; } /// <summary> /// 验证签名 /// </summary> /// <param name="signature"></param> /// <param name="timestamp"></param> /// <param name="nonce"></param> /// <returns></returns> public static bool CheckSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { "123456", timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Array.Sort<String>(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.Length; i++) { content.Append(arr[i]); } String tmpStr = SHA1_Encrypt(content.ToString()); // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.Equals(signature) : false; } /// <summary> /// 使用缺省密钥给字符串加密 /// </summary> /// <param name="Source_String"></param> /// <returns></returns> public static string SHA1_Encrypt(string Source_String) { byte[] StrRes = Encoding.Default.GetBytes(Source_String); HashAlgorithm iSHA = new SHA1CryptoServiceProvider(); StrRes = iSHA.ComputeHash(StrRes); StringBuilder EnText = new StringBuilder(); foreach (byte iByte in StrRes) { EnText.AppendFormat("{0:x2}", iByte); } return EnText.ToString(); } public bool IsReusable { get { return false; } } public void RequestX(HttpContext context) { wxmessage wx = GetWxMessage(context); string res = ""; //新用户添加 if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe") { string content = ""; content = "/:rose123324324欢迎关注测试帐号/:rose\n聊天请回复你好“x”\n无聊时候还可以找我聊聊天哦!"; res = sendTextMessage(wx, content); } else { bool sendJoke = false; //看笑话 List<string> xhList = new List<string>() { "x", "笑话", "笑話" }; foreach (string item in xhList) { if (wx.Content.Trim().ToLower().Contains(item)) { sendJoke = true; break; } } if (sendJoke) { string title = string.Format("编号{0}:{1}\n-----------------\n", "01", "测试回复"); string content = "333333测试回复内容"; if (content.Length > 300) { content = GetSubString(content, 300) + "\n-----------------\n点击连接阅读全文:URL"; } res = sendTextMessage(wx, title + content); } //未知情况 if (res == "") { string content = "/:,@-D113333啊哦,你在说什么?\n你可以按照下面的格式告诉我:\n问:你说的话 答:你想让我说什么\n看笑话请直接回复“x”!"; res = sendTextMessage(wx, content); } } context.Response.HeaderEncoding = System.Text.Encoding.UTF8; context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.Charset = "utf-8"; //context.Response.Write(Encoding.UTF8.GetString(Encoding.Default.GetBytes(res))); context.Response.Write(res); } /// <summary> /// 截取字符串 /// </summary> /// <param name="content"></param> /// <param name="length"></param> /// <returns></returns> private string GetSubString(string content, int length) { if (content.Length >= length) { return content.Substring(0, length); } else { return content; } } /// <summary> /// 发送文字消息 /// </summary> /// <param name="wx">获取的收发者信息</param> /// <param name="content">笑话内容</param> /// <returns></returns> private string sendTextMessage(wxmessage wx, string content) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>", wx.FromUserName); sb.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", wx.ToUserName); sb.AppendFormat("<CreateTime>{0}</CreateTime>", DateTime.Now); sb.AppendFormat("<MsgType><![CDATA[text]]></MsgType>"); sb.AppendFormat("<Content><![CDATA[{0}]]></Content>", content); sb.AppendFormat("</xml>"); return sb.ToString(); } /// <summary> /// 发送图文消息 /// </summary> /// <param name="wx">获取的收发者信息</param> /// <param name="joke">笑话信息</param> /// <returns></returns> private string sendPictureMessage(wxmessage wx) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>", wx.FromUserName); sb.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", wx.ToUserName); sb.AppendFormat("<CreateTime>{0}</CreateTime>", DateTime.Now); sb.AppendFormat("<MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content>"); sb.AppendFormat("<ArticleCount>1</ArticleCount>"); sb.AppendFormat("<Articles><item>"); sb.AppendFormat("<Title><![CDATA[{0}]]></Title>", "标题"); sb.AppendFormat("<Description><![CDATA[{0}]]></Description>", "说明文字"); sb.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl>", "图片地址"); sb.AppendFormat("<Url><![CDATA[{0}]]></Url>", "连接地址"); sb.AppendFormat("</item></Articles><FuncFlag>0</FuncFlag></xml>"); return sb.ToString(); } /// <summary> /// 获取请求过来的微信信息 /// </summary> /// <returns></returns> private wxmessage GetWxMessage(HttpContext context) { wxmessage wx = new wxmessage(); StreamReader str = new StreamReader(context.Request.InputStream, System.Text.Encoding.UTF8); XmlDocument xml = new XmlDocument(); xml.Load(str); wx.ToUserName = xml.SelectSingleNode("xml").SelectSingleNode("ToUserName").InnerText; wx.FromUserName = xml.SelectSingleNode("xml").SelectSingleNode("FromUserName").InnerText; wx.MsgType = xml.SelectSingleNode("xml").SelectSingleNode("MsgType").InnerText; if (wx.MsgType.Trim() == "text") { wx.Content = xml.SelectSingleNode("xml").SelectSingleNode("Content").InnerText; } if (wx.MsgType.Trim() == "event") { wx.EventName = xml.SelectSingleNode("xml").SelectSingleNode("Event").InnerText; } return wx; } } //自定义一个微信消息实体类 class wxmessage { public string FromUserName { get; set; } public string ToUserName { get; set; } public string MsgType { get; set; } public string EventName { get; set; } public string Content { get; set; } } }
公众号开发者中心,设置的url,即以上内容,解决乱码是:
context.Response.HeaderEncoding = System.Text.Encoding.UTF8; context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.Charset = "utf-8";接入url,走的是get方法,回复消息走的是post方法
相关文章推荐
- WCF技术剖析之二:再谈IIS与ASP.NET管道
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
- ASP.NET控件组(lable1、label2、label3.....labeln)的赋值
- asp.net实现三层架构的例子
- 介绍“Razor”— ASP.NET的一个新视图引擎
- [每日刷题(2015/7/10)]简述ASP.NET的页面运行机制
- ASP.NET操作Word的IIS权限配置
- ASP.NET简单实现注销功能
- 怎样学好ASP.NET技术
- ASP.NET | WebForm 处理机
- ASP.NET简单实现注销功能
- asp.net实现三层架构的例子
- SharePoint 2013 表单认证使用ASP.Net配置工具添加用户
- spring mvc + JasperReports
- Asp.net mvc5 系列笔记
- SharePoint 2013 表单认证使用ASP.Net配置工具添加用户
- Asp.net Vnext Filters
- asp.net web api 2.0 实现跨域资源共享
- VisualStudio2010中创建ASP.Net WebService
- DEV-aspxgridview中的javascprit中获取所有行