C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....

代码如下,有需要的可以参考:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 using System.Data;
  8 using System.IO;
  9 using System.Net;
 10 using System.Text;
 11 using System.Xml;
 12 using System.Web.Security;
 13 using Newtonsoft.Json.Linq;
 14 using System.Net.Security;
 15
 16 namespace SY.Web.weixinApp
 17 {
 18     public partial class Token_url : System.Web.UI.Page
 19     {
 20         protected string Token = "";//你的token
 21
 22         protected void Page_Load(object sender, EventArgs e)
 23         {
 24             string postStr = "";
 25
 26             if (Request.HttpMethod.ToLower() == "post")
 27             {
 28                 System.IO.Stream s = System.Web.HttpContext.Current.Request.InputStream;
 29
 30                 byte[] b = new byte[s.Length];
 31
 32                 s.Read(b, 0, (int)s.Length);
 33
 34                 postStr = System.Text.Encoding.UTF8.GetString(b);
 35                 string _resStr = "";
 36
 37                 if (!string.IsNullOrEmpty(postStr))
 38                 {
 39                     _resStr = ResponseMsg(postStr);
 40                     WriteFileLog(postStr);
 41                 }
 42                 Response.Write(_resStr);
 43                 Response.End();
 44             }
 45
 46             else
 47             {
 48                 Valid();   //正确响应微信发送的Token验证
 49             }
 50
 51         }
 52
 53         /// <summary>
 54         /// 验证微信签名
 55         /// </summary>
 56         /// * 将token、timestamp、nonce三个参数进行字典序排序
 57         /// * 将三个参数字符串拼接成一个字符串进行sha1加密
 58         /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
 59         /// <returns></returns>
 60         private bool CheckSignature()
 61         {
 62
 63             string signature = Request.QueryString["signature"].ToString();
 64             string timestamp = Request.QueryString["timestamp"].ToString();
 65             string nonce = Request.QueryString["nonce"].ToString();
 66             string[] ArrTmp = { Token, timestamp, nonce };
 67             Array.Sort(ArrTmp);     //字典排序
 68             string tmpStr = string.Join("", ArrTmp);
 69             tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
 70             tmpStr = tmpStr.ToLower();
 71             if (tmpStr == signature)
 72             {
 73                 return true;
 74             }
 75             else
 76             {
 77                 return false;
 78             }
 79         }
 80
 81         //正确响应微信发送的Token验证
 82         private void Valid()
 83         {
 84
 85             string echoStr = Request.QueryString["echoStr"].ToString();
 86
 87             if (CheckSignature())
 88             {
 89                 if (!string.IsNullOrEmpty(echoStr))
 90                 {
 91                     Response.Write(echoStr);
 92                     Response.End();
 93                 }
 94             }
 95
 96         }
 97
 98         /// <summary>
 99         /// 返回信息结果(微信信息返回)
100         /// </summary>
101         /// <param name="weixinXML"></param>
102         private string ResponseMsg(string weixinXML)
103         {
104             XmlDocument xx = new XmlDocument();
105             xx.LoadXml(weixinXML);
106
107             XmlNode root = xx.SelectSingleNode("xml");
108
109             XmlNode _ToName = root.SelectSingleNode("ToUserName");
110             XmlNode _FromName = root.SelectSingleNode("FromUserName");
111             XmlNode _CreatTime = root.SelectSingleNode("CreateTime");
112             XmlNode _MsgType = root.SelectSingleNode("MsgType");
113
114             #region Click/View 事件处理
115             if (_MsgType.InnerText == "event")
116             {
117                 XmlNode _Event = root.SelectSingleNode("Event");
118                 XmlNode _EventKey = root.SelectSingleNode("EventKey");
119                 if (_Event.InnerText == "subscribe")
120                 {
121                     //关注后返回信息代码
122                     _returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[欢迎关注!]]></Content></xml>";
123
124                     return _returnStr;
125
126                 }
127
128                 #region  click事件
129                 if (_Event.InnerText == "CLICK")
130                 {
131
132                     //请求和客服对话,关键词:rgfw
133                     if (_EventKey.InnerText == "rgfw")
134                     {
135                         //文字信息
136                         _returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
137                         return _returnStr;
138                     }
139                     else
140                     {
141                         //关键词:piclist自动回复图文信息
142                         if (_EventKey.InnerText == "piclist")
143                         {
144                             DataTable dt = new DataTable();
145                             dt = dal.GetList(8, "CID=525", "ID desc");   //获取需要回复的图文信息列表
146                             StringBuilder sbpic = new StringBuilder();
147                             if (dt != null && dt.Rows.Count > 0)
148                             {
149                                 sbpic.Append("<xml>");
150                                 sbpic.AppendFormat("<ToUserName><![CDATA[{0}]]></ToUserName>", _FromName.InnerText);
151                                 sbpic.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName>", _ToName.InnerText);
152                                 sbpic.AppendFormat("<CreateTime><![CDATA[{0}]]></CreateTime>", ConvertDateTimeInt(DateTime.Now));
153                                 sbpic.AppendFormat("<MsgType><![CDATA[{0}]]></MsgType>", "news");
154                                 sbpic.AppendFormat("<ArticleCount><![CDATA[{0}]]></ArticleCount>", dt.Rows.Count);
155                                 sbpic.Append("<Articles>");
156                                 foreach (DataRow dr in dt.Rows)
157                                 {
158                                     sbpic.Append("<item>");
159                                     sbpic.AppendFormat("<Title><![CDATA[{0}]]></Title>", dr["Title"]);  //标题
160                                     sbpic.AppendFormat("<Description><![CDATA[{0}]]></Description>", dr["Des"]);  //导读
161                                     sbpic.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl>", "http://www.xxx.com/" + dr["Pic"]);  //图片地址url
162                                     sbpic.AppendFormat("<Url><![CDATA[{0}]]></Url>", "http://www.xxx.com/test.aspx?id=" + dr["ID"]);   //原文链接
163                                     sbpic.Append("</item>");
164                                 }
165
166                                 sbpic.Append("</Articles></xml>");
167
168                                 _returnStr = sbpic.ToString();
169                                 return _returnStr;
170                             }
171                         }
172
173                     }
174                 }
175                 #endregion
176
177             }
178             #endregion
179
180             #region View事件   关键词自动回复文字或图片信息处理
181             if (_MsgType.InnerText == "text")
182             {
183                 XmlNode _Content = root.SelectSingleNode("Content");
184
185                 //关键词:rgfw请求和客服对话,
186                 if (!string.IsNullOrEmpty(_Content.InnerText) && _Content.InnerText == "rgfw")
187                 {
188                     _returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";
189                     return _returnStr;
190                 }
191                 else
192                 {
193                     //文字信息
194                     _returnStr = "<xml><ToUserName><![CDATA[" + _FromName.InnerText + "]]></ToUserName><FromUserName><![CDATA[" + _ToName.InnerText + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[文字信息]]></Content></xml>";
195                     return _returnStr;
196                 }
197
198             }
199             #endregion
200
201             return _returnStr;
202         }
203
204
205         /// <summary>
206         /// unix时间转换为datetime
207         /// </summary>
208         /// <param name="timeStamp"></param>
209         /// <returns></returns>
210         private DateTime UnixTimeToTime(string timeStamp)
211         {
212             DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
213             long lTime = long.Parse(timeStamp + "0000000");
214             TimeSpan toNow = new TimeSpan(lTime);
215             return dtStart.Add(toNow);
216         }
217
218         /// <summary>
219         /// datetime转换为unixtime
220         /// </summary>
221         /// <param name="time"></param>
222         /// <returns></returns>
223         private int ConvertDateTimeInt(System.DateTime time)
224         {
225             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
226             return (int)(time - startTime).TotalSeconds;
227         }
228
229         /// <summary>
230         /// 写入文件日志
231         /// </summary>
232         /// <param name="strMemo"></param>
233         private void WriteFileLog(string strMemo)
234         {
235             string _filepath = Server.MapPath("/logs");
236             string _filename = Server.MapPath("/logs/logs.log");
237
238             if (!Directory.Exists(_filepath))
239             {
240                 Directory.CreateDirectory(_filepath);
241                 if (!File.Exists(_filename))
242                 {
243                     FileStream fs1 = File.Create(_filename);
244                     fs1.Close();
245                     fs1.Dispose();
246                 }
247             }
248
249             //将文件信息读入流中
250             using (FileStream fs = new FileStream(_filename, FileMode.OpenOrCreate | FileMode.Append))
251             {
252                 lock (fs)//锁住流
253                 {
254                     //if (!fs.CanWrite)
255                     //{
256                     //    throw new System.Security.SecurityException("文件fileName=" + _filename + "是只读文件不能写入!");
257                     //}
258
259                     StreamWriter sw = new StreamWriter(fs);
260                     sw.WriteLine(strMemo);
261                     sw.Dispose();
262                     sw.Close();
263                 }
264             }
265
266         }
267
268
269     }
270 }
时间: 2024-08-28 10:12:53

C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....的相关文章

ThinkPHP 3.2.3响应微信发送的Token验证失败

1.服务器配置是阿里云的linux 2.下载微信的Token验证Demo,放于根目录测试链接没有任何问题:URL http://www.XXX.com/wx_sample.phpToken weixin 3.将验证代码置于TP框架中(application/Weixin/Controller/IndexController.php):<?phpnamespace Wxapi\Controller; use Think\Controller;class IndexController extend

自己的服务器通过微信公众号Token验证测试的代码(Python版)

我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意把Token的值改成你自己的值,然后在微信后台填对你的服务器的公网IP,提交就可以通过验证了 #coding=utf-8 html = '''True ''' import socket import signal import errno import re import os import ha

Thinkphp5 微信公众号token验证不成功的原因

最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败.为此,我甚至手工写了微信提交过来的记录,如: &timestamp=1510210523&nonce=2414550015&signature=30b9eeb6b1134d0a53623375c48ca734c41facb5&echostr=6863786913073725439 我眼睛看着验证信息没错,输出的echostr跟get提交来的一模一样,但是还是会出错.忍无可忍,一直无

微信订阅号开发之token验证后,自动回复消息功能做好,发送消息没有返回

相信很多人会跟我一样,token验证之后,发送消息给订阅号,没有消息返回. 以下,说一下我辛苦调试得到的解决办法: 首先,token验证: 自己写的token一直验证失败,找了好久,没有发现bug.实在没办法,就用了官方的示例代码.并且通过示例代码调试,发现了一个让我吐血的bug(也不算bug): token验证貌似要求字符编码格式!!!! 官方的示例代码,直接上传到服务器,token直接过! 把官方示例代码改为UTF-8格式,再上传覆盖,token失败!失败!失败! 后来,把自己写的修改为AN

微信公众平台——token验证php版

这几天开始接触微信公众号的开发,注册这些就不说了,我是先弄了个测试号用着.进入正题 所谓token验证,其实就是微信服务器向自己要用到的服务器url发送一段数据,其中有一个参数$_GET['echhostr'],这个参数在经过一系列逻辑判断后再原封不动返回给微信也就是 echo $_GET['echhostr']; 碰到的一些小问题解决方法如下: 1.微信开发后台上的token要与php代码中定义的一致: 2.加header('content-type:text'); 3.还不行就加 ob_cl

php:微信公众号token验证失败原因、验证码显示不出来的问题

ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的方式一步步检查的),地址,token信息,微信....等待账号信息是没有任何问题的. 解决方案: 最终在echo $_GET['echostr'];前添加了一句代码ob_clean();把问题搞定. 问题分析: 因为用的是框架,在echo $_GET['echostr'];之前可能有一些你不知道的输出到&qu

微信公众平台Token验证失败的解决办法

1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen("log.txt","w+");2.$strText='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\r\n";3.fwrite($fp,$strText); 把上述代码粘贴到private function checkS

微信公众号token 验证

1. 首先给出测试项目的整体目录: 2. CoreServlet类: 当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求 package com.zjn.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import j

asp.net mvc 微信公众号token验证

本人的公众号要申请成为开发者,必须经过token认证.微信公众号的官方代码只列出了PHP代码的实例,明显是歧视.net用户.我用的asp.net mvc中的web api,结果调了好久都没有成功,最后发现只要下面几句即可: public void Get() { string temp = HttpContext.Current.Request.QueryString["echostr"]; HttpContext.Current.Response.Write(temp); HttpC