首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

微信认证开发教程

首先我们需要保证我们本地的服务可以被外网访问到

我们借助的工具是Ngrok,下载地址有很多,大家可以网上搜索,下载不到的朋友,私信我。

下载后,解压

解压目录

进入DOS窗口,执行以下命令

这个命令是将我们本地8080端口的服务映射到外网

执行后的效果

这个地址就可以用了,但是这个地址是每次启动都会随机生成一个,如果想要长期不变的需要付费等手段,但是目前从映射外网这个目的就满足了

我们在本地服务写一个简单的程序看是否已经可以访问

那么访问地址就变成了

我们访问下看一看

这是页面访问

本地编译器

那么就可以调试了。

我们接入微信,先做两个事情(1)填写服务器配置(2)验证服务器地址的有效性

我们心中先有一个图形概念,便于之后代码理解

我们需要先做的事情是解决这两个角色之间的问题

那么我们先去微信公众平台填写一些配置,以完成“我们的服务器”和“微信服务器”之间的通信

我们登录微信公众平台找到服务器配置(页面可能有改动,但是找服务器配置就对了)

我们先看这一部分

大概理解其中的参数

服务器地址(URL):就是我们服务器的地址,微信服务器与我们通信,我们要告诉它我们在哪里

文章:

“互联网中常说的对称加密你到底是什么?”

“那你就是非对称加密了”

“补充一个数字签名和数字证书”

令牌(Token):可以理解为钥匙,它是一串字符串。因为网络上传递参数很不安全,为了保证双方可以确定身份,就是给我发送消息的是“微信服务器”而不是其它服务器,需要这个Token做为一个识别的钥匙,这个过程也是人们常说的认证

认证原理是这样:

微信服务器在认证我们服务器的过程时候会传递四个参数

timestamp、signature、nonce、echostr

所以过来的数据是(示例):

这几个参数我的理解是:

Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端;客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5、SHA1等等),然后将这个加密后的字符串和用户名、Nonce、加密算法名称一起发回服务器;服务器使用接收到的用户名到数据库搜索密码,然后跟客户端使用同样的算法对其进行加密,接着将其与客户端提交上来的加密字符串进行比较,如果两个字符串一致就表示用户身份有效。这样就解决了用户密码明文被窃取的问题,攻击者就算知道了算法名和nonce也无法解密出密码。

每个nonce只能供一个用户使用一次,这样就可以防止攻击者使用重放攻击,因为该Http报文已经无效。可选的实现方式是把每一次请求的Nonce保存到数据库,客户端再一次提交请求时将请求头中得Nonce与数据库中得数据作比较,如果已存在该Nonce,则证明该请求有可能是恶意的。然而这种解决方案也有个问题,很有可能在两次正常的资源请求中,产生的随机数是一样的,这样就造成正常的请求也被当成了攻击,随着数据库中保存的随机数不断增多,这个问题就会变得很明显。所以,还需要加上另外一个参数Timestamp(时间戳)

Timestamp是根据服务器当前时间生成的一个字符串,与nonce放在一起,可以表示服务器在某个时间点生成的随机数。这样就算生成的随机数相同,但因为它们生成的时间点不一样,所以也算有效的随机数。

问题又来了,随着用户访问的增加,数据库中保存的nonce/timestamp/username数据量会变得非常大。对于这个问题,可选的解决方案是对数据设定一个“过期时间”,比如说在数据库中保存超过一天的数据将会被清除。如果是这样的,攻击者可以等待一天后,再将拦截到的HTTP报文提交到服务器,这时候因为nonce/timestamp/username数据已被服务器清除,请求将会被认为是有效的。要解决这个问题,就需要给时间戳设置一个超时时间,比如说将时间戳与服务器当前时间比较,如果相差一天则认为该时间戳是无效的。

而echostr想了很久没有想明白,它的作用很明显,是为了认证我的服务器,单只是原样返回就可以了,没有任何操作,所以我猜想,它主要是用于其它用途比如企业号里面。

Signature这个就是我们之前提到的A

相关代码

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171220A0BPMV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券