如何使用C#建立响应微信接入和自动回复的代码

如何使用C#建立响应微信接入和自动回复的代码,第1张

打开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.XPathusing System.Security

using System.Net

using System.Collections

using System.Security.Cryptography

提示:一般处理程序,可以返回各种格式的HTTP响应数据,甚至包括但不限于GIF等图像的格式哦,非常地强大而且灵活,但开发难度有点高,有一点类似LOL 中的盲僧,因微信公众平台支持探返回的数据格式一般是XML,但也包括一些非XML的字串什么的,所以我们使用一般处理程序可以非常好完成任务。

2 编写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[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()

}

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行

1bool 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 }

5 把程序发布到互联网上(此处不解释),注意一定要80端口

(此处省略18000字,记得记上稿费)

6 在微信公众平台上,做如下设置:

在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者任意填写, 用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。

微信公众号添加图文自动回复方法如下:

1、把以前的“被添加自动回复”删除。

2、进入关键词自动回复添加规则。

3、修改规则名为任意字符,如“自动回复图文消息”。

4、添加关键词,输入代码 “Hello2BizUser”,点击确定。

5、点击图文符号,并勾选所需推送图文,点击保存。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11785778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存