本文目标:学习一种比较安全的服务器间互相验证身份的方式。

问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做?

1)  在微信管理页面上填写URL和TOKEN,开发者服务器上也记录同样的TOKEN。

2)  微信服务器发送HTTP请求,附带上参数(注意TOKEN是不会被传输的)

参数 描述
signature 微信加密签名
timestamp 时间戳
nonce 随机数
echostr 随机字符串

其中signature值通过如下摘要运算得出:

1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密(这个加密是不可逆的),并将结果的byte[]转换为16进制字符串

3)  开发者服务器接收到signature,timestamp,nonce,echostr参数,跟服务器做同样的摘要运算,得到预期的一个signatrue,然后对比微信服务器发送过来的signature参数,如果相同,证明双方的TOKEN是一致的,开发者服务器确实接收到了来自微信服务器的请求,开发者服务器最后返回echostr,以告诉微信服务器接入成功。具体的开发者服务器校验逻辑代码如下显示。

package message;import java.security.*;
import java.util.Arrays;/**** 微信消息接口认证token摘要类* * 这个摘要类实现为单例,校验一个签名是否合法的例子如下* <pre>* WeixinMessageDigest wxDigest = WeixinMessageDigest.getInstance();* boolean bValid = wxDigest.validate(signature, timestamp, nonce);* </pre>* * * @author liguocai*/
public final class WeixinMessageDigest {/*** 单例持有类* @author liguocai**/private static class SingletonHolder{static final WeixinMessageDigest INSTANCE = new WeixinMessageDigest();}/*** 获取单例* @return*/public static WeixinMessageDigest getInstance() {return SingletonHolder.INSTANCE;}private MessageDigest digest;private WeixinMessageDigest() {try {digest = MessageDigest.getInstance("SHA-1");} catch(Exception e) {throw new InternalError("init MessageDigest error:" + e.getMessage());}}/*** 将字节数组转换成16进制字符串* @param b* @return*/private static String byte2hex(byte[] b) {StringBuilder sbDes = new StringBuilder();String tmp = null;for (int i = 0; i < b.length; i++) {tmp = (Integer.toHexString(b[i] & 0xFF));if (tmp.length() == 1) {sbDes.append("0");}sbDes.append(tmp);}return sbDes.toString();}private String encrypt(String strSrc) {String strDes = null;byte[] bt = strSrc.getBytes();digest.update(bt);strDes = byte2hex(digest.digest());return strDes;}/*** 校验请求的签名是否合法* * 加密/校验流程:* 1. 将token、timestamp、nonce三个参数进行字典序排序* 2. 将三个参数字符串拼接成一个字符串进行sha1加密* 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信* @param signature* @param timestamp* @param nonce* @return*/public boolean validate(String signature, String timestamp, String nonce){//1. 将token、timestamp、nonce三个参数进行字典序排序String token = getToken();String[] arrTmp = { token, timestamp, nonce };Arrays.sort(arrTmp);StringBuffer sb = new StringBuffer();//2.将三个参数字符串拼接成一个字符串进行sha1加密for (int i = 0; i < arrTmp.length; i++) {sb.append(arrTmp[i]);}String expectedSignature = encrypt(sb.toString());//3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if(expectedSignature.equals(signature)){return true;}return false;}private String getToken(){return "111111";}public static void main(String[] args) {String signature="f86944503c10e7caefe35d6bc19a67e6e8d0e564";//加密需要验证的签名String timestamp="1371608072";//时间戳String nonce="1372170854";//随机数WeixinMessageDigest wxDigest = WeixinMessageDigest.getInstance();boolean bValid = wxDigest.validate(signature, timestamp, nonce);        if (bValid) {System.out.println("token 验证成功!");}else {System.out.println("token 验证失败!");}}}

4) 这个摘要对比的技术,同样适用于单点登录、服务期间互相调用的身份验证,前提是每台服务器都持有相同的TOKEN。此外,有些细节可以优化,例如通过timestamp对签名做超时的处理,超时的签名默认不通过;请求的参数可以加上IP, USERID等额外信息;返回的echostr可以再次与TOKEN做摘要,可以使微信服务器确保接受来自开发者服务器的响应,但是微信服务器没有这么做,也许它本身已经做了足够安全控制。

微信消息接口文档:

http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97

微信公众平台的TOKEN安全验证相关推荐

  1. ASP.NET MVC4 微信公众平台开发测试一: 验证

    ASP.NET MVC4 微信公众平台开发测试一: 验证 背景,想做一个微信公众号的自动回复系统,于是想动手写一下.记录这些,是一边写程序一边写在这里,也是记录一下自己的思路. 微信公众平台开发时,需 ...

  2. java微信token验证_JAVA折腾微信公众平台(Token验证)

    最近微信的公众平台比较火,于是我也想弄个微信来玩玩.如何注册微信公众号?点击之后就可以看到官方的答案了(额,比较坑爹). 注册之后,可以选择编辑模式和开发模式,这里要说的是开发模式. 首先要开启开发模 ...

  3. Java微信公众号高级 微信墙,JAVA折腾微信公众平台(Token验证)

    JAVA折腾微信公众平台(Token验证) JAVA折腾微信公众平台(Token验证) 2019独角兽企业重金招聘Python工程师标准>>> 最近微信的公众平台比较火,于是我也想弄 ...

  4. java微信token验证_JAVA折腾微信公众平台(Token验证)[转]

    BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写点什么,否则每天仅仅只是工作上的使用,是得不 ...

  5. 关于微信公众平台服务器配置Token

    1.打开微信公众平台 2.修改配置 3.填写服务器地址(URL) -------------域名或者ip地址加验证token接口,路径 例如:http://xxxxxx.cn/api/wx/token ...

  6. (转载)微信公众平台 - 实例(未验证)

    如何部署自己的公众平台:     1.打开http://mp.weixin.qq.com 注册/登录     2.进入高级功能菜单,选择编辑模式或开发者模式(本例子属于开发者模式-需要自己拥有服务器) ...

  7. Delphi XE7 用indy开发微信公众平台(3)- 验证消息真实性

    验证消息真实性 原文链接:http://www.cnblogs.com/devinlee/p/4282546.html 扫下方二维码关注,测试效果 uses IdHashSHA, IdGlobal;f ...

  8. VB.net 微信公众平台开发(一) Token验证

    登录https://mp.weixin.qq.com/ 后,在公众平台后台管理页面 – 开发者中心页,点击"修改配置"按钮,填写URL.Token和EncodingAESKey,其 ...

  9. 微信公众号sae服务器搭建,SAE 搭建微信公众平台

    index.wsgi # coding: UTF-8 import sae import os import web from weixinInterface import WeixinInterfa ...

最新文章

  1. CSS3的过渡和动画
  2. WebServer 软件原理简介
  3. iOS Hacker 重签名实现无需越狱注入动态库 dylib
  4. RabbitMq链接
  5. f450四轴使用技巧
  6. 一次SAP客户访谈记录
  7. 计算机翻译辅助工具安卓版,计算机辅助翻译软件
  8. Change Value to Reference(将值对象改为引用对象)
  9. 人工智障学习笔记——机器学习(11)PCA降维
  10. python进阶19垃圾回收GC
  11. autotools归纳
  12. 【数据库】Mean web开发 02-Windows下Mongodb安装配置及常用客户端管理工具
  13. [BZOJ 5074]小B的数字
  14. Modbus-RTU入门篇
  15. mac安装虚拟机VMware fusion12 和ubantu系统
  16. 苹果手机app应用显示未受信任打不开怎么办
  17. eclipse安装教程和jdk配置(win超详细)
  18. 这5个免费素材网站,设计师都在用
  19. 怎么通过微信开发者工具打开一个项目
  20. 基于matlab的股票投资,基于matlab的股票估价模型系统.doc

热门文章

  1. 推出企业版开源数据库,Cockroach Labs 完成 2700 万美元新融资
  2. 仿小米日历功能,Android week view
  3. Android:代码修改layout_marginBottom的属性
  4. html5 div 拱桥形状制作,新型上承式拱桥的制作方法
  5. 哪家的蓝牙耳机质量比较好?2022真无线蓝牙耳机排名
  6. 你了解微服务吗?什么是微服务
  7. 信息技术课python培训心得
  8. iOS - 苹果健康架构 基于HealthKit的健康数据的编辑
  9. Matplotlib绘制漂亮的饼状图|python绘制漂亮的饼状图
  10. 从底层结构开始学习FPGA(7)----进位链CARRY4