1. using System;
  2. using System.Collections.Generic;
  3. using System.Web;
  4. using System.Web.UI;
  5. using System.Web.UI.WebControls;
  6. using System.Data;
  7. using System.IO;
  8. using System.Net;
  9. using System.Text;
  10. using System.Xml;
  11. using System.Web.Security;
  12. using System.Text.RegularExpressions;
  13.  
  14. namespace WhoLove.weixin
  15. {
  16. public partial class weixin : System.Web.UI.Page
  17. {
  18.  
  19. const string Token = "nidaye1234";//你的token
  20. #region 以下代码只用于第一次验证 验证完后请注释
  21. //protected void Page_Load(object sender, EventArgs e)
  22. //{
  23. // string postStr = "";
  24. // if (Request.HttpMethod.ToLower() == "post")
  25. // {
  26. // System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream;
  27. // byte[] b = new byte[s.Length];
  28. // s.Read(b, 0, (int)s.Length);
  29. // postStr = System.Text.Encoding.UTF8.GetString(b);
  30. // if (!string.IsNullOrEmpty(postStr))
  31. // {
  32. // Response.End();
  33. // }
  34. // //WriteLog("postStr:" + postStr);
  35. // }
  36. // else
  37. // {
  38. // Valid();
  39. // }
  40. //}
  41. #endregion
  42.  
  43. #region 以下是正常使用时的pageload 请在验证时将其注释 并保证在正常使用时可用
  44. /// <summary>
  45. /// 以下是正常使用时的pageload 请在验证时将其注释 并保证在正常使用时可用
  46. /// </summary>
  47. /// <param name="sender"></param>
  48. /// <param name="e"></param>
  49. protected void Page_Load(object sender, EventArgs e)
  50. {
  51.  
  52. if (Request.HttpMethod == "POST")
  53. {
  54. string weixin = "";
  55. weixin = PostInput();//获取xml数据
  56. if (!string.IsNullOrEmpty(weixin))
  57. {
  58. ResponseMsg(weixin);//调用消息适配器
  59. }
  60. }
  61. }
  62. #endregion
  63.  
  64. #region 获取post请求数据
  65. /// <summary>
  66. /// 获取post请求数据
  67. /// </summary>
  68. /// <returns></returns>
  69. private string PostInput()
  70. {
  71. Stream s = System.Web.HttpContext.Current.Request.InputStream;
  72. byte[] b = new byte[s.Length];
  73. s.Read(b, 0, (int)s.Length);
  74. return Encoding.UTF8.GetString(b);
  75. }
  76. #endregion
  77.  
  78. #region 消息类型适配器
  79. private void ResponseMsg(string weixin)// 服务器响应微信请求
  80. {
  81. XmlDocument doc = new XmlDocument();
  82. doc.LoadXml(weixin);//读取xml字符串
  83. XmlElement root = doc.DocumentElement;
  84. ExmlMsg xmlMsg = GetExmlMsg(root);
  85. //XmlNode MsgType = root.SelectSingleNode("MsgType");
  86. //string messageType = MsgType.InnerText;
  87. string messageType = xmlMsg.MsgType;//获取收到的消息类型。文本(text),图片(image),语音等。
  88.  
  89. try
  90. {
  91.  
  92. switch (messageType)
  93. {
  94. //当消息为文本时
  95. case "text":
  96. textCase(xmlMsg);
  97. break;
  98. case "event":
  99. if (!string.IsNullOrEmpty(xmlMsg.EventName) && xmlMsg.EventName.Trim() == "subscribe")
  100. {
  101. //刚关注时的时间,用于欢迎词
  102. int nowtime = ConvertDateTimeInt(DateTime.Now);
  103. string msg = "你要关注我,我有什么办法。随便发点什么试试吧~~~";
  104. string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
  105. Response.Write(resxml);
  106. }
  107. break;
  108. case "image":
  109. break;
  110. case "voice":
  111. break;
  112. case "vedio":
  113. break;
  114. case "location":
  115. break;
  116. case "link":
  117. break;
  118. default:
  119. break;
  120. }
  121. Response.End();
  122. }
  123. catch (Exception)
  124. {
  125.  
  126. }
  127. }
  128. #endregion
  129.  
  130. private string getText(ExmlMsg xmlMsg)
  131. {
  132. string con = xmlMsg.Content.Trim();
  133.  
  134. System.Text.StringBuilder retsb = new StringBuilder(200);
  135. retsb.Append("这里放你的业务逻辑");
  136. retsb.Append("接收到的消息:"+ xmlMsg.Content);
  137. retsb.Append("用户的OPEANID:"+ xmlMsg.FromUserName);
  138.  
  139. return retsb.ToString();
  140. }
  141.  
  142. #region 操作文本消息 + void textCase(XmlElement root)
  143. private void textCase(ExmlMsg xmlMsg)
  144. {
  145. int nowtime = ConvertDateTimeInt(DateTime.Now);
  146. string msg = "";
  147. msg = getText(xmlMsg);
  148. string resxml = "<xml><ToUserName><![CDATA[" + xmlMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + xmlMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
  149. Response.Write(resxml);
  150.  
  151. }
  152. #endregion
  153.  
  154. #region 将datetime.now 转换为 int类型的秒
  155. /// <summary>
  156. /// datetime转换为unixtime
  157. /// </summary>
  158. /// <param name="time"></param>
  159. /// <returns></returns>
  160. private int ConvertDateTimeInt(System.DateTime time)
  161. {
  162. System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
  163. return (int)(time - startTime).TotalSeconds;
  164. }
  165. private int converDateTimeInt(System.DateTime time)
  166. {
  167. System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
  168. return (int)(time - startTime).TotalSeconds;
  169. }
  170.  
  171. /// <summary>
  172. /// unix时间转换为datetime
  173. /// </summary>
  174. /// <param name="timeStamp"></param>
  175. /// <returns></returns>
  176. private DateTime UnixTimeToTime(string timeStamp)
  177. {
  178. DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  179. long lTime = long.Parse(timeStamp + "0000000");
  180. TimeSpan toNow = new TimeSpan(lTime);
  181. return dtStart.Add(toNow);
  182. }
  183. #endregion
  184.  
  185. #region 验证微信签名 保持默认即可
  186. /// <summary>
  187. /// 验证微信签名
  188. /// </summary>
  189. /// * 将token、timestamp、nonce三个参数进行字典序排序
  190. /// * 将三个参数字符串拼接成一个字符串进行sha1加密
  191. /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
  192. /// <returns></returns>
  193. private bool CheckSignature()
  194. {
  195. string signature = Request.QueryString["signature"].ToString();
  196. string timestamp = Request.QueryString["timestamp"].ToString();
  197. string nonce = Request.QueryString["nonce"].ToString();
  198. string[] ArrTmp = { Token, timestamp, nonce };
  199. Array.Sort(ArrTmp); //字典排序
  200. string tmpStr = string.Join("", ArrTmp);
  201. tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
  202. tmpStr = tmpStr.ToLower();
  203. if (tmpStr == signature)
  204. {
  205. return true;
  206. }
  207. else
  208. {
  209. return false;
  210. }
  211. }
  212.  
  213. private void Valid()
  214. {
  215. string echoStr = Request.QueryString["echoStr"].ToString();
  216. if (CheckSignature())
  217. {
  218. if (!string.IsNullOrEmpty(echoStr))
  219. {
  220. Response.Write(echoStr);
  221. Response.End();
  222. }
  223. }
  224. }
  225. #endregion
  226.  
  227. #region 写日志(用于跟踪) + WriteLog(string strMemo, string path = "*****")
  228. /// <summary>
  229. /// 写日志(用于跟踪)
  230. /// 如果log的路径修改,更改path的默认值
  231. /// </summary>
  232. private void WriteLog(string strMemo, string path = "wx.txt")
  233. {
  234. string filename = Server.MapPath(path);
  235. StreamWriter sr = null;
  236. try
  237. {
  238. if (!File.Exists(filename))
  239. {
  240. sr = File.CreateText(filename);
  241. }
  242. else
  243. {
  244. sr = File.AppendText(filename);
  245. }
  246. sr.WriteLine(strMemo);
  247. }
  248. catch
  249. {
  250.  
  251. }
  252. finally
  253. {
  254. if (sr != null)
  255. sr.Close();
  256. }
  257. }
  258. //#endregion
  259. #endregion
  260.  
  261. #region 接收的消息实体类 以及 填充方法
  262. private class ExmlMsg
  263. {
  264. /// <summary>
  265. /// 本公众账号
  266. /// </summary>
  267. public string ToUserName { get; set; }
  268. /// <summary>
  269. /// 用户账号
  270. /// </summary>
  271. public string FromUserName { get; set; }
  272. /// <summary>
  273. /// 发送时间戳
  274. /// </summary>
  275. public string CreateTime { get; set; }
  276. /// <summary>
  277. /// 发送的文本内容
  278. /// </summary>
  279. public string Content { get; set; }
  280. /// <summary>
  281. /// 消息的类型
  282. /// </summary>
  283. public string MsgType { get; set; }
  284. /// <summary>
  285. /// 事件名称
  286. /// </summary>
  287. public string EventName { get; set; }
  288.  
  289. }
  290.  
  291. private ExmlMsg GetExmlMsg(XmlElement root)
  292. {
  293. ExmlMsg xmlMsg = new ExmlMsg() {
  294. FromUserName = root.SelectSingleNode("FromUserName").InnerText,
  295. ToUserName = root.SelectSingleNode("ToUserName").InnerText,
  296. CreateTime = root.SelectSingleNode("CreateTime").InnerText,
  297. MsgType = root.SelectSingleNode("MsgType").InnerText,
  298. };
  299. if (xmlMsg.MsgType.Trim().ToLower() == "text")
  300. {
  301. xmlMsg.Content = root.SelectSingleNode("Content").InnerText;
  302. }
  303. else if (xmlMsg.MsgType.Trim().ToLower() == "event")
  304. {
  305. xmlMsg.EventName = root.SelectSingleNode("Event").InnerText;
  306. }
  307. return xmlMsg;
  308. }
  309. #endregion
  310. }
  311. }

  

c#微信开发 转的更多相关文章

  1. 【微信开发】公众号后台设置错误导致的微信redirect_uri参数错误【图】

    在微信开发中,如微信网页授权登录,分享到朋友圈自定义内容,微信h5支付时 可能会遇到微信redirect_uri参数错误的情况. 此时除了检查自己代码正确性外,还要检查一下是否正确地设置了公众号后台的 ...

  2. 《C#微信开发系列(Top)-微信开发完整学习路线》

    年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...

  3. 基于fastweixin的微信开发环境搭建(一)

    由于公司业务需要,开发微信版本,才开始接触微信公众平台.在github折腾了几天,试过好几个微信sdk,最终选择fastweixin.个人觉得这个框架还是值得使用的,使用也简单.那么问题来了,很多人想 ...

  4. 微信开发笔记:获取用户openid,以及用户头像昵称等信息

    微信开发的时候有一个很便利的途径来进行一个用户的一步注册登录,就是使用用户的微信信息来直接进行登陆,可以省去很多不必要的麻烦.那具体这些信息是如何来获取的呢? 首先呢,我们需要对微信进行一个授权,让微 ...

  5. 续关于C#的微信开发的入门记录一

    前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...

  6. 关于C#的微信开发的入门记录一

    在之前老是看到一些微信开发的例子,但是作为初学者会有很多问题,之前我也找了很多帖子,但是最终也没能解决,现在刚好手里有一个项目,总结一下分享给准备做却动不了手的朋友们,本文只是以我个人的经验作为浅谈( ...

  7. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...

  8. 《C#微信开发系列(3)-获取接口调用凭据》

    3.0获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留 ...

  9. 《C#微信开发系列(2)-自定义菜单管理》

    2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...

  10. 《C#微信开发系列(1)-启用开发者模式》

    1.0启用开发者模式 ①填写服务器配置 启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个(进入微信公众平台=>开发=>基本配置)就可以看到以下的界面: 点击修改配置,会出现 ...

随机推荐

  1. ACM失败之路

    校赛打完,已过四月,该是准备背起行囊,踏上考研之路了,自然,得先阔别一下ACM了,想起这几年ACM路,感慨颇多,不得不一诉心肠,与大家分享一下我的ACM历程,如果有人能从此文获取一些益处,那我就很欣慰 ...

  2. POJ 2914 Minimum Cut

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 9319   Accepted: 3910 Case ...

  3. JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素

    (注:简介基于IDEA的版本为:11.0,下载地址:http://www.jetbrains.com/idea/) 打开IDEA,(当第一次打开的时候出现的是一个欢迎页面,随便创建一个project来 ...

  4. 用CSS正确显示人民币符号的HTML转义字符

    做电子商务的难免要跟钱打交道,特别是跟人民币接触更多,但人民币符号长什么样呢,是¥还是¥?糊涂了吧^~^,要知道答案很简单,找出一张新的一百元大钞,在背面看看那个防伪的银线,上面就有. 我们做网页时要 ...

  5. EventToCommand

    EventToCommand 在WPF中,并不是所有控件都有Command,例如TextBox,那么当文本改变,我们需要处理一些逻辑,这些逻辑在ViewModel 中,没有Command如何绑定呢?这 ...

  6. Ubuntu 14.04.1 建立 Android M, Android N 開發環境 與 問題

    # Modify /etc/apt/sources.list# add below 3 lines to /etc/apt/sources.listdeb http://archive.ubuntu. ...

  7. 还原数据库:The backup set holds a backup of a database other than the existing database……

    还原数据库时报以上错误,解决办法是: 1.删除新建的DB 2.直接右键Databases-->Restore Database 3.在弹出窗口中的To database栏位填写需要新建的DB名称 ...

  8. Xshell远程管理Linux

    Xshell[1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议. Xshell 通过互联网到远程主机的安全连接以及它创新 ...

  9. SVM(支持向量机)的一点理解

    最近有被问到SVM的问题,不懂装懂,羞愧不已.百度有很多深入浅出介绍SVM的文章,我就不赘述了,这里写一点自己肤浅的理解. SVM的核心思想是把求解低维空间上的高维分类器转化为求解高维函数空间上的线性 ...

  10. css-margin与百分数的关系

    可以对元素的margin设置百分数,百分数是相对于父元素的width计算,不管是margin-top/margin-bottom还是margin-left/margin-right.(padding同 ...