微信平台不解释了,若是不了解的百度一下下,若是不会用微信,请自宫,光盘重启电脑,打开CMD输入Format C:。网上有不少针对企业级的高级定制ASPX开发,写得草草了事,不少男人干事都草草了事,这可不行,您不懂小伙伴们的心情。初学者老是但愿无码,即不要太多代码就能运行起来的示例,本人保证贴出来的代码全是可运行的,代码虽然有点干瘪,但给你想象和改造的空间很大,感受对于微信平台是真正的互联网技术改造传统行业,为何? 找度大娘(个人QQ26959368问我,别发邮件收不到!)。php
本代码实现了接入微信平台,而且能够自动回复和重复别人的话。要接入微信平台,您必须有一个公网IP和保证您的80端口可用,全部使用ASPX技术 开发的网站应该在公网上均可见。本示例,可被改形成各类用途,本系统共包括4篇,最终要讲到如何利用微信平台整合SharePoint列表的数据,实现和 企业现的OA办公平台整合。算法
我是SharePoint 专家,固然要说说SharePoint的事情,对于那些企业保存了不少内容,SharePoint列表的内容的状况,员工如何能经过微信查到这些内容,建一个ASPX的Web Application是接入微信最好的方式,考虑到SharePonit是.Net Framework架构的,因此必须使用C#来建一个网站,而且能够接入到微信公众平台,固然本文内容并不限于SharePoint,那些想经过.Net 技术来创建微信运营平台彻底能够进来无节操围观,有了SharePoint不是限得高端、大气、上档次嘛,而且有了SharePoint您连CMS平台都不用代码,SharePoint天生一个CMS管理神器呀,堪称0代码建立本身的微信运营平台!数据库
微信公众平台的网址:mp.weixin.qq.com数组
请读者能够点击以上的网站,申请一个微信公众号,而后就能够开始拉!安全
打开Visual Studio 2010, 新建一个ASPX WEB应用程序类型的项目, Visual Studio 会帮咱们自动地建立一些得得啵啵的文件,直接不理会,建立完毕后,以下图右击项目,选择“添加”-“新建项”,以下图选择“通常处理程序”,而且命名为"mp.ashx"。服务器
建立好了,添加以下的引用:微信
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; using System.IO; using System.Text; using System.Xml; using System.Xml.XPath;using System.Security; using System.Net; using System.Collections; using System.Security.Cryptography;
提示:通常处理程序,能够返回各类格式的HTTP响应数据,甚至包括但不限于GIF等图像的格式哦,很是地强大并且灵活,但开发难度有点高,有一点相似LOL 中的盲僧,因微信公众平台支持探返回的数据格式通常是XML,但也包括一些非XML的字串什么的,因此咱们使用通常处理程序能够很是好完成任务。网络
接口的接入过程其实很简单,用糙人的一句话就是,哥我喊一个“哎。。。”,妹纸你回一个“哎。。。”,咱就结婚成功了(程序直接回复echostr参数),固然要更深度的结合,决不止那么简单。架构
哥哥您想呀,若是夜半三更,爬上妹妹床头的不是哥哥您,而是一个叫dosboy的骇客,后果我都没有办法再想下去了,因此微信开通前,妹纸您要告诉哥哥(微信平台)口令(在微信中预设一个令牌Token)。微信公众平台
哥哥每回有接入要求的时候,妹纸验明正身就能够拉,由于网络都是明文(dosboy会在窗下偷听的哦),因此这个验证不能直接传递Token,而要经过必定算法,微信的文档下:
根据微信的文档,开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者经过检验signature对请求进行校验(下面有校验方式)。若确认这次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,不然接入失败。
加密/校验流程以下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者得到加密后的字符串可与signature对比,
根据以上信息,我写了一个函数,这个函数必定要使用,若是您坚持不验明正身,平台代码也能够接入的,可是危险程度您本身判断:
private bool checkSignature(string signature,string timestamp,string nonce,string token) { ArrayList tmpArray = new ArrayList(); tmpArray.Add(token); tmpArray.Add(timestamp); tmpArray.Add(nonce); tmpArray.Sort(); string tmpStr = (string)tmpArray[0] + (string)tmpArray[1] + (string)tmpArray[2]; //创建SHA1对象 SHA1 sha = new SHA1CryptoServiceProvider(); //将mystr转换成byte[] ASCIIEncoding enc = new ASCIIEncoding(); byte[] dataToHash = enc.GetBytes(tmpStr); //Hash运算 byte[] dataHashed = sha.ComputeHash(dataToHash); //将运算结果转换成string string hash = BitConverter.ToString(dataHashed).Replace("-", ""); log("hash:" + hash); //记录日志,不须要能够注释掉 if(hash.ToLower()==signature.ToLower()) return true; else return false; }
程序中我用了一个记录日志的函数,在这里我也贴上来,若是你们不需能够能够注释掉红色的那行:
private void log(string stringinput) { StreamWriter sw = new StreamWriter("C:\\微信日志.txt", true); sw.WriteLine(DateTime.Now.ToString() + "," + stringinput); sw.Close(); }
想搞微信平台就要接入几百个或更多公众号,必竟委托给你的妹纸起码三宫六院,作好管理仍是有必要的,数据库的技术是必须滴,因此在这里,我使用了SQL SERVER 2008R2,把全部的接入信息都写入数据库的“微信号列表”,这里我就简简单单使用了数据库的Update,函数为 LandMPUpdateSQLServer() 代码以下:
表的结构我就截个图,若是看官只想测试一下如何接入,直接闪现到下一节。
private void LandMPUpdateSQLServer(HttpContext context) { SqlConnection connMpDb = new SqlConnection(connectionString); //connectionString为预先定义的链接串 connMpDb.Open(); SqlCommand comMpDb = new SqlCommand("update 微信号列表 set signature=@signature,timestamp=@timestamp,nonce=@nonce,echostr=@echostr,[验证]=1 Where ID=*****", connMpDb); foreach (string s in OpenParameters) //OpenParameters 为4个参数名的数组,即 "signature","timestamp","nonce","echostr" { SqlParameter sp = comMpDb.Parameters.Add("@" + s, System.Data.SqlDbType.VarChar); if (context.Request.QueryString.AllKeys.Contains(s)) sp.Value = context.Request.QueryString[s]; else sp.Value = "No Value"; } comMpDb.ExecuteNonQuery(); connMpDb.Close(); }
(1)请加上变量声明:
在以下的位置后面,即mp类里填加上2个类的变量的定义
public class mp : IHttpHandler
{
//接入参数 private string[] OpenParameters = { "signature", "timestamp", "nonce", "echostr" }; //SQL链接字串,您能够定义成一个字符串,我是从系统设置里取的 private string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["testmpConnectionString"].ConnectionString;
(2)请完成主程序:
请在
public void ProcessRequest(HttpContext context) 内填加上以下的语句
提示: 这是一个系统函数,每次微信有事件发生时(好比有人给你发消息拉,加你为关注拉什么的)的微信就会主动出动联系你给它填的URL地址,这个函数内的代码就会激发运行!
【自动回复】 以下的代码运行,不只仅会让您的程序接入微信的公众平台,而且还能自动重复回复别人发的话,看看以下的效果图,你和你的小伙伴是否是已经惊呆了!若是您不要这个功能的话这个程序,您只要保留
1-16行的代码,其它全删除!就已经彻底作到接入微信公众平台,若是您再想您的程序智能一点,好比您的妹纸给你发,“我如今就要”,你自动回复 “本人正在忙”(活该你单身),请改造17行之后的代码,彻底够用了。
【数据库】 不想碰数据库,就注释掉14行
1 bool isLanding = true; 2 foreach (string s in OpenParameters) 3 { 4 if (!context.Request.QueryString.AllKeys.Contains(s)) 5 isLanding = false; 6 7 } 8 9 //toke 为 AAA时验证是不是微信的请求 10 if (isLanding && checkSignature(context.Request.QueryString["signature"], context.Request.QueryString["timestamp"], context.Request.QueryString["nonce"],"AAA")) 11 { 12 context.Response.ContentType = "text/plain"; 13 string echoString = context.Request.QueryString["echostr"]; 14 LandMPUpdateSQLServer(context); 15 context.Response.Write(echoString); 16 } 17 else 18 { 19 //读取发过来的信息到inputXml变量中 20 Stream sin = context.Request.InputStream; 21 byte[] readBytes; 22 readBytes = new byte[sin.Length]; 23 sin.Read(readBytes, 0, readBytes.Length); 24 string inputXml = Encoding.UTF8.GetString(readBytes); 25 26 //使用XMLDocument加载信息结构 27 XmlDocument xmlDoc = new XmlDocument(); 28 xmlDoc.LoadXml(inputXml); 29 string stringMsgId = xmlDoc.SelectSingleNode("//MsgId").InnerText; 30 31 //把传过来的XML数据各个字段区分出来,而且填到fields这个字典变量中去 32 Dictionary<string, string> fields = new Dictionary<string, string>(); 33 foreach (XmlNode x in xmlDoc.SelectSingleNode("/xml").ChildNodes) 34 { 35 fields.Add(x.Name, x.InnerText); 36 37 } 38 //造成返回格式的XML文档 39 string returnXml = "<xml><ToUserName><![CDATA[" + 40 fields["FromUserName"] + "]]></ToUserName><FromUserName><![CDATA[" + 41 fields["ToUserName"] + "]]></FromUserName><CreateTime>" + 42 DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + 43 fields["Content"] + "]]></Content></xml>"; 44 45 context.Response.ContentType = "text/xml"; 46 context.Response.Write(returnXml); 47 48 }
(此处省略18000字,记得记上稿费)
在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者任意填写, 用做生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。