C#微信公众号开发系列教程二(新手接入指南)

此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽。


微信公众号开发系列教程一(调试环境部署)

微信公众号开发系列教程一(调试环境部署续:vs远程调试)

C#微信公众号开发系列教程二(新手接入指南)

C#微信公众号开发系列教程三(消息体签名及加解密)

C#微信公众号开发系列教程四(接收普通消息)

C#微信公众号开发系列教程五(接收事件推送与消息排重)

 C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先判断消息的合法性,判断成功后根据消息体的内容做相应的相应。原理很容易理解,接触过socket的可能理解起来更容易。

然而,微信的文档有的时候确实有点让人摸不着头脑,关于微信接入的文档写的确实不敢恭维啊。官方文档写的第一步是“申请消息接口”,这里是需要填写一个url的,此url用来处理微信发送的消息的,但微信把url中相关的配置写在了第二步,一不小心就把新手给坑了。下面我按照我的理解来进行解释。

首先,开发者在接入时,微信服务器将发送get请求到你填写的url上,此请求携带四个参数,分别signature(微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。),timestamp(时间戳),nonce(随机数),echostr(随机字符串).用 HttpContext.Current.Request.RawUrl可以获取当前请求的原始url,如下图所示:

image

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
下面是代码实现。
首先,在你的处理程序中(我是新建了一个一般处理程序wx.ashx),判断当前请求的类型,因为接入时,是发送的GET请求,消息处理是发送的POST请求。如下图:
这里我对验证url的方法进行封装。
/// <summary>/// 验证url权限, 接入服务器/// </summary>/// <param name="token"></param>/// <returns></returns>public static bool ValidUrl(string token){string echoStr = VqiRequest.GetQueryString("echoStr");if (CheckSignature(token)){if (!string.IsNullOrEmpty(echoStr)){Utils.ResponseWrite(echoStr);return true;}}return false;}/// <summary>/// 验证微信签名/// </summary>/// * 将token、timestamp、nonce三个参数进行字典序排序/// * 将三个参数字符串拼接成一个字符串进行sha1加密/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。/// <returns></returns>public static bool CheckSignature(string token){string signature = VqiRequest.GetQueryString("signature");string timestamp = VqiRequest.GetQueryString("timestamp");string nonce = VqiRequest.GetQueryString("nonce");string[] ArrTmp = { token, timestamp, nonce };Array.Sort(ArrTmp);     //字典排序string tmpStr = string.Join("", ArrTmp);tmpStr = Utils.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");tmpStr = tmpStr.ToLower();if (tmpStr == signature){return true;}else{return false;}}

 

注:代码VqiRequest.GetQueryString是封装的QueryString请求的方法,使用的时候可以改成QueryString[“”]

处理过程如图:

image

image

将signature,timestamp,nonce三个参数放在数组中,

image

image

排序后的ArrTmp:

image

将三个将三个参数字符串拼接成一个字符串:

image

将tmpStr进行sha1加密,加密后的字符串转换成小写:

image

然后和签名进行对比,相同则表示验证成功。

image

验证成功将echoStr返回给微信。

image

/// <summary>/// 根据指定的密码和哈希算法生成一个适合于存储在配置文件中的哈希密码/// </summary>/// <param name="str">要进行哈希运算的密码</param>/// <param name="type"> 要使用的哈希算法</param>/// <returns>经过哈希运算的密码</returns>public static string HashPasswordForStoringInConfigFile(string str, string type){return FormsAuthentication.HashPasswordForStoringInConfigFile(str, type);}public static void ResponseWrite(string str){HttpContext.Current.Response.Write(str);HttpContext.Current.Response.End();}

 

处理程序编写完毕后,部署到iis(方法请参照教程一),登录微信管理后台https://mp.weixin.qq.com/在开发者中心页,点击“修改配置按钮”填写URL、Token和EncodingAESKey,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效。加解密方式的默认状态为明文模式。加解密模式将在后期的系列中与大家共享,敬请期待。

如图所示:

image

image

 

点击提交后,微信服务器将get请求到上文中编写的url中。验证成功,则绑定成功。

image

 

 

END

 

如有疑问加群一起交流,我需要广大屌丝小伙伴的反馈与建议,   点击这里给我发消息

如果觉得本文对你有帮助,请点击文章下面的推荐哦,去帮助更多的小伙伴了解微信开发的流程。

如果你是土豪,想支持笔者继续更新本系列教程,可以扫描下面的二维码悬赏一下,你的支持是笔者继续更新下去的动力。

转载于:https://www.cnblogs.com/zskbll/p/4093954.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle增加字段为主键自增_在 Oracle 中设置自增列

如果你经常使用 MySQL&#xff0c;你肯定对 AUTO_INCREMENT 非常熟悉&#xff0c;因为经常要用到它。一、什么是自增列 &#xff1f;自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段&#xff0c;这样每次增加一行时&#xff0c;不用指该字段的值&am…

Java 抽象类、接口

abstract class 抽象类定义规则如下: (1) 抽象类和抽象方法都必须用 abstract 关键字来修饰。 (2) 抽象类不能被直接实例化&#xff0c;也就是不能用new关键字去产生对象。 (3) 抽象方法只需声明&#xff0c;而不需实现。 (4) 含有抽象方法的类必须被声明为抽象类&#xff0c…

fastdfs windows部署_Go在windows下编译Linux可执行文件

欢迎关注我的头条号&#xff1a;Wooola&#xff0c;专注于Java、Golang、微服务架构&#xff0c;致力于每天分享原创文章、快乐编码和开源技术。前言最近楼主做了一个滑块验证码登录功能&#xff0c;但有个问题&#xff0c;悲观估计一天大约会产生两百多G临时图片放在fastdfs文…

python按索引删除字符串,基于特定的索引字符串值选择记录,然后通过python删除后续字段...

I have a .csv file named file01.csv that contains many records. Some records are required and some are not. I find that the required records has a string variable “Mi”, but it is not exist into the unnecessary records. So, I want to select the required r…

我们并没有觉得MapReduce速度慢,直到Spark出现

learn from 从0开始学大数据&#xff08;极客时间&#xff09; Spark 拥有更快的执行速度 更友好的编程接口 迅速抢占 MapReduce 的市场份额&#xff0c;成为主流的大数据计算框架 val textFile sc.textFile("hdfs://...") // 根据 HDFS 路径生成一个输入数据 RDD v…

python远程调用摄像头_Python设置Socket代理及实现远程摄像头控制的例子

为python设置socket代理首先,你得下载SocksiPy这个.解压出来之后里面会有一个socks.py文件.然后你可以把这个文件复制到python安装目录里面的Lib\site-packages中.或者把这个文件复制到程序所在的目录中. 然后就可以再程序中使用socket代理来编写程序了. 下面是示例代码 import…

基于ArcEngine与C#的鹰眼地图实现

鹰眼图是对全局地图的一种概略表达&#xff0c;具有与全局地图的空间参考和空间范围。为了更好起到空间提示和导航作用&#xff0c;有些还具备全局地图中重要地理要素&#xff0c;如主要河流、道路等的概略表达。通过两个axMapControl控件&#xff0c;主控件axMapControl 1和鹰…

LeetCode 1178. 猜字谜(状态压缩+枚举二进制子集+哈希)

文章目录1. 题目2. 解题1. 题目 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏&#xff0c;请你来猜猜看吧。 字谜的迷面 puzzle 按字符串形式给出&#xff0c;如果一个单词 word 符合下面两个条件&#xff0c;那么它就可以算作谜底&#xff1a; 单词 word 中包含谜面 …

elasticsearch 工作原理_【154期】面试官:你能说说 Elasticsearch 查询数据的工作原理是什么吗?...

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅阶段汇总集合&#xff1a;一百期面试题汇总面试题ES 写入数据的工…

php另类上传图片的方法(PHP用Socket上传图片)

服务器端&#xff1a; 。 代码如下:<?phpset_time_limit(10);//* 设置不显示任何错误 *///error_reporting(0); function varinfo($str) {echo "<PRe>";var_dump($str);echo "<pre>";} $commonProtocol getprotobyname("tcp");…

java会被淘汰吗_Java不会被淘汰的12个原因

如今&#xff0c;面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上或许会成为下一个COBOL。有关JAVA的技术卖出多少本书已经是一个很久远的记忆了。现处中年…

Java 关于类的专题

文章目录1. Object 类2. 内部类3. 覆写 Object 类的 equals 方法4. 接口对象实例化5. this() 调用无参构造方法6. static 属性所有对象共享一份7. static 方法不能调用 非static 属性8. 静态代码块9. final 关键字10. instanceof 关键字1. Object 类 所有的类都是继承于 Objec…

pythonmain是什么意思_Python中if __name__ == __main__详细解释

想必很多初次接触python都会见到这样一个语句&#xff0c;if __name__ "__main__"&#xff1a; 那么这个语句到底是做什么用的呢&#xff1f;在解释之前&#xff0c;首先要声明的是&#xff0c;不管你是多么小白&#xff0c;你一定要知道的是&#xff1a; 1.python文…

java操作redis的操作_Java操作redis简单示例

第一&#xff1a;安装Redis首先我们要安装Redis&#xff0c;就像我们操作数据库一样&#xff0c;在操作之前肯定要先创建好数据库的环境。Redis的下载可以百度一下&#xff0c;或者打开下面的下载链接&#xff1a;https://github.com/MSOpenTech/redis也可以从我的百度网盘下载…

myeclipse启动报JVM terminated. Exit code=1

报错信息如图&#xff1a; 解决办法&#xff1a; 删除当前workspaces下文件夹&#xff0c;路径为&#xff1a;%Workspaces%/.metadata/.plugins/org.eclipse.core.runtime转载于:https://www.cnblogs.com/tancp/p/4102866.html

Java 常用类库

文章目录1. String、StringBuffer2. 基本数据类3. System 类4. Runtime 类5. Date、Calendar、DateFormat 类6. Math、Random 类7. hashCode() 方法8. 对象克隆1. String、StringBuffer public class testString {public static void main(String [] args){String s "Mi…

git如何选择性合并_小姐姐用 10 张动图,教会你 Git 命令使用

优质文章&#xff0c;第一时间送达&#xff01;来源&#xff1a;机器之心git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗&#xff1f;如果你还有些分不清楚&#xff0c;那千万不能错过这篇文章…

传智播客java测试题_传智播客Java基础综合测试题

传智播客Java基础综合测试题传智播客Java基础综合测试题第一关1.动手完成 Java 开发包的安装&#xff0c;并设置环境变量 Path 。2.编写一个程序&#xff0c;要求程序运行后在屏幕上输出&#xff1a;***************************This is my first java program!***************…

为何Spark更高效?

learn from 从0开始学大数据&#xff08;极客时间&#xff09; Spark 的计算阶段 Hadoop MapReduce 简单粗暴地根据 shuffle 将大数据计算分成 Map 和 Reduce 两个阶段&#xff0c;然后就算完事了。 而 Spark 更细腻一点&#xff0c;将前一个的 Reduce 和后一个的 Map 连接起来…

iphone个系列尺寸_最值得入手的4款iPhone,都是内行人的最爱,拿出去有面子

现如今手机市场里最受大众欢迎的手机应该就是iPhone了&#xff0c;虽然iPhone的价格都普遍偏高&#xff0c;但是大家依然还是非常青睐于它&#xff0c;主要是因为iPhone的配置和性能确实是比其他机型要好&#xff0c;搭载的A系列仿生芯片和iOS系统都提升了它的性能&#xff0c;…