准备工作:
打开官网创建自己的微信公众号 官网
创建公众号完成打开基本配置->填写服务器配置
1.
说明:
URL: 填写自己的服务器的地址,可以接收到微信服务器发送的信息 笔者使用腾讯云的云服务器,新手还挺便宜的 腾讯云官网
Token: 用来验证微信发送的信息和获得公众号的Access_Token
EncodingAESKey: 加密密钥,微信回通过这个密钥把数据加密后,把数据传送给自己的服务器,自己的服务器需要通过这个密钥加密(前提是开启了安全模式),如果是明文模式不需要使用加密加密
消息加密解密方式: 明文模式:传送的数据不加密,直接传送,缺点就是不安全,容易被盗
安全模式:微信回把数据进行EncodingAESKey这个密钥加密后传递给自己的服务器,服务器收到数据需要解密,这个安全系数高,传送的都是密文
2.
配置完成之后,提交微信服务器需要验证自己的服务器地址是否可用
微信服务器会给URL这个服务器地址发送一个Get请求
参数内容:
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
验证这个信息是微信服务器发送过来的验证信息
方法一:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
static void Main(string[] args){if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))AddAddress("http://+:8080/WeChatThePublic/");HttpListener httpListener = new HttpListener();httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问httpListener.Prefixes.Add("http://+:8080/WeChatThePublic/");//绑定地址httpListener.UnsafeConnectionNtlmAuthentication = true;httpListener.Start();while (true){var context = httpListener.GetContext();//接受HTTP信息HttpListenerRequest aaa = context.Request;Console.WriteLine(aaa.HttpMethod);switch (aaa.HttpMethod){case "GET"://这个是认证服务器的CheckServer(context, aaa);break;}}}private static void CheckServer(HttpListenerContext context, HttpListenerRequest aaa){string signature = aaa.QueryString["signature"];string timestamp = aaa.QueryString["timestamp"];string nonce = aaa.QueryString["nonce"];string echostr = aaa.QueryString["echostr"];string[] strs = new string[] { "4", timestamp, nonce };Array.Sort(strs);string j = string.Join("", strs);//创建SHA1加密算法对象SHA1 sha1 = SHA1.Create();//将原始密码转换为字节数组byte[] originalPwd = Encoding.UTF8.GetBytes(j);//加密byte[] key = sha1.ComputeHash(originalPwd);StringBuilder sub = new StringBuilder();foreach (var t in key){sub.Append(t.ToString("x2"));//转16进行显示}//如果加密后的信息等于signature,就是微信发送的信息if (string.Equals(sub.ToString(), signature, StringComparison.InvariantCultureIgnoreCase)){using (var response = context.Response){//是微信的服务器发送的信息,就把这个信息返给他response.OutputStream.Write(Encoding.UTF8.GetBytes(echostr));}}}
方法二:
你可以直接把echostr这个值直接返回给微信服务器通过验证,但是这么做的话,以后有服务器发送了Get请求,就不知道是哪个服务器发送的啦
static void Main(string[] args){if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))AddAddress("http://+:8080/WeChatThePublic/");HttpListener httpListener = new HttpListener();httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问httpListener.Prefixes.Add("http://+:8080/WeChatThePublic/");//绑定地址httpListener.UnsafeConnectionNtlmAuthentication = true;httpListener.Start();while (true){var context = httpListener.GetContext();//接受HTTP信息HttpListenerRequest aaa = context.Request;Console.WriteLine(aaa.HttpMethod);switch (aaa.HttpMethod){case "GET"://这个是认证服务器的CheckServer(context, aaa);break;}}}private static void CheckServer(HttpListenerContext context, HttpListenerRequest aaa){string signature = aaa.QueryString["signature"];string timestamp = aaa.QueryString["timestamp"];string nonce = aaa.QueryString["nonce"];string echostr = aaa.QueryString["echostr"];using (var response = context.Response){//是微信的服务器发送的信息,就把这个信息返给他response.OutputStream.Write(Encoding.UTF8.GetBytes(echostr));}}
这样就可以通过微信的验证啦
关注微信公众号【浪子独白】 回复 “c#微信公众号源码”
可以获得本人封装一套微信公众号开发源码!