微信平台ASPX高级定制开发(一):如何使用C#建立响应微信接入和自动回复的代码
微信平台不解释了,如果不了解的百度一下下,如果不会用微信,请自宫,光盘重启电脑,打开CMD输入Format C:。网上有很多针对企业级的高级定制ASPX开发,写得草草了事,很多男人干事都草草了事,这可不行,您不懂小伙伴们的心情。初学者总是希望无码,即不要太多代码就能运行起来的示例,本人保证贴出来的代码全是可运行的,代码虽然有点干瘪,但给你想象和改造的空间很大,感觉对于微信平台是真正的互联网技术改造传统行业,为什么? 找度大娘(我的QQ26959368问我,别发邮件收不到!)。
本代码实现了接入微信平台,并且可以自动回复和重复别人的话。要接入微信平台,您必须有一个公网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
请读者可以点击以上的网站,申请一个微信公众号,然后就可以开始拉!
1 创建Visual Studio项目
打开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的字串什么的,所以我们使用一般处理程序可以非常好完成任务。
编写signature校验函数
接口的接入过程其实很简单,用糙人的一句话就是,哥我喊一个“哎。。。”,妹纸你回一个“哎。。。”,咱就结婚成功了(程序直接回复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[] + (string)tmpArray[] + (string)tmpArray[]; //建立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();
}
3 接入接口写入数据库代码
想搞微信平台就要接入几百个或更多公众号,必竟委托给你的妹纸起码三宫六院,做好管理还是有必要的,数据库的技术是必须滴,所以在这里,我使用了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();
}
4 完成代码编写接入接口
(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行
bool isLanding = true;
foreach (string s in OpenParameters)
{
if (!context.Request.QueryString.AllKeys.Contains(s))
isLanding = false; } //toke 为 AAA时验证是否是微信的请求
if (isLanding && checkSignature(context.Request.QueryString["signature"], context.Request.QueryString["timestamp"], context.Request.QueryString["nonce"],"AAA"))
{
context.Response.ContentType = "text/plain";
string echoString = context.Request.QueryString["echostr"];
LandMPUpdateSQLServer(context);
context.Response.Write(echoString);
}
else
{
//读取发过来的信息到inputXml变量中
Stream sin = context.Request.InputStream;
byte[] readBytes;
readBytes = new byte[sin.Length];
sin.Read(readBytes, , readBytes.Length);
string inputXml = Encoding.UTF8.GetString(readBytes); //使用XMLDocument加载信息结构
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(inputXml);
string stringMsgId = xmlDoc.SelectSingleNode("//MsgId").InnerText; //把传过来的XML数据各个字段区分出来,并且填到fields这个字典变量中去
Dictionary<string, string> fields = new Dictionary<string, string>();
foreach (XmlNode x in xmlDoc.SelectSingleNode("/xml").ChildNodes)
{
fields.Add(x.Name, x.InnerText); }
//形成返回格式的XML文档
string returnXml = "<xml><ToUserName><![CDATA[" +
fields["FromUserName"] + "]]></ToUserName><FromUserName><![CDATA[" +
fields["ToUserName"] + "]]></FromUserName><CreateTime>" +
DateTime.Now.Subtract(new DateTime(, , , , , )).TotalSeconds.ToString() + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" +
fields["Content"] + "]]></Content></xml>"; context.Response.ContentType = "text/xml";
context.Response.Write(returnXml); }
5 把程序发布到互联网上(此处不解释),注意一定要80端口
(此处省略18000字,记得记上稿费)
6 在微信公众平台上,做如下设置:
在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者任意填写, 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
什么也不说了,直接上效果图!
微信平台ASPX高级定制开发(一):如何使用C#建立响应微信接入和自动回复的代码的更多相关文章
- 头脑王者pk答题小程序开发思路 微信pk答题小程序开发 PK答题游戏你也可以做 微信pk答题游戏
想必大家最近的朋友圈和微信群里都被头脑王者PK答题刷屏了吧.确实很好玩,尤其是2018年的这波风口,手机答题,大家掏出手机,创建一个好友PK,然后你的好友点击进来就可以和你一起PK答题.比之前的游戏好 ...
- [c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单
前7篇把最基础的消息接收和回复全做完了, 也把高级接口的入口和分拆处理写好了空方法, 此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接 ...
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- 微信公众平台Php版php开发(转)
http://www.1990c.com/?p=932 近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~微信公众平台提供的接口很简单,先看看消息交互流程: 说 ...
- 基于ThinkPHP3的微信平台开发_1
微信公众平台是个好东西,具体的就不说了,我直接说技术>_< 下图为目录结构一览: 微信开发 - 文件目录结构 平台功能: 此次开发的平台是面向多微信公众号.微信多公众号主(下面简称号主)的 ...
- atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制 1. token机制and session保持状态机制 1 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...
- 微信公众平台自定义菜单PHP开发
微信公众平台自定义菜单PHP开发,微信公众平台自定义菜单是如何实现的呢?其实很简单,首先在微信公众平台升级为服务号,获取appid和appsecret,然后根据这2个参数获取access_token, ...
随机推荐
- 【Win 10 应用开发】Toast通知激活应用——前台&后台
老周最近热衷于讲故事,接下来还是讲故事时间. 有人问我:你上大学的时候,有加入过学生会吗?读大学有没有必要加入学生会? 哎哟,这怎么回答呢,从短期来说,加入学生会有点用,至少可以娱乐一下,运气好的话, ...
- 【WP开发】JSON数据的读与写
在不使用其他库的情况下,WP-RT应用中也可以处理JSON数据.主要的几个类都放到Windows.Data.Json命名空间中: IJsonValue接口作为用于封装JSON数据的规范,其中只读属性V ...
- 解密jQuery事件核心 - 模拟事件(四)
前几章已经把最核心的实现都分解过了,这一章我们看看jQuery是如何实现事件模拟的 在Internet Explorer 8和更低,一些事件change 和 submit本身不冒泡,但jQuery修改 ...
- SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender
今天在看C#高级编程(第9版)的时候,在768页看到这样的一段代码 SmtpClient sc = new SmtpClient(); sc.Host = "邮箱服务器地址"; M ...
- Android之登录那点事
随着互联网的高速发展,一个应用为了保护用户的隐私,通常会通过设置用户名+密码的验证方式保证用户隐私的相对安全,我知道一般网站的登录验证,通常会设置一个二维码,通过验证二维码,防止恶意软件通过机械程序, ...
- java Proxy(代理机制)
我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...
- .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK
今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/and ...
- 应用程序框架实战十一:创建VS解决方案与程序集
上一篇,介绍了开发环境需要的工具和版本,本篇将动手创建VS解决方案. 对于本系列文章提供的示例,我想通过两种途径来演示,一种是单元测试,另外为了能更直观的看到效果,还会提供一个用户界面来展示.为了不分 ...
- FreeMarker模板开发指南知识点梳理
freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生 ...
- jQuery的$.getJSON方法在IE浏览器下失效的解决方案
$.getJSON在IE下默认会使用浏览器缓存,所以导致数据不正确或者异常,解决方案就是在使用该方法前关闭缓存,使用完后再重新打开缓存即可. <?php $.ajaxSetup({ cache: ...