微信公众平台的TOKEN安全验证
本文目标:学习一种比较安全的服务器间互相验证身份的方式。
问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做?
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安全验证相关推荐
- ASP.NET MVC4 微信公众平台开发测试一: 验证
ASP.NET MVC4 微信公众平台开发测试一: 验证 背景,想做一个微信公众号的自动回复系统,于是想动手写一下.记录这些,是一边写程序一边写在这里,也是记录一下自己的思路. 微信公众平台开发时,需 ...
- java微信token验证_JAVA折腾微信公众平台(Token验证)
最近微信的公众平台比较火,于是我也想弄个微信来玩玩.如何注册微信公众号?点击之后就可以看到官方的答案了(额,比较坑爹). 注册之后,可以选择编辑模式和开发模式,这里要说的是开发模式. 首先要开启开发模 ...
- Java微信公众号高级 微信墙,JAVA折腾微信公众平台(Token验证)
JAVA折腾微信公众平台(Token验证) JAVA折腾微信公众平台(Token验证) 2019独角兽企业重金招聘Python工程师标准>>> 最近微信的公众平台比较火,于是我也想弄 ...
- java微信token验证_JAVA折腾微信公众平台(Token验证)[转]
BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写点什么,否则每天仅仅只是工作上的使用,是得不 ...
- 关于微信公众平台服务器配置Token
1.打开微信公众平台 2.修改配置 3.填写服务器地址(URL) -------------域名或者ip地址加验证token接口,路径 例如:http://xxxxxx.cn/api/wx/token ...
- (转载)微信公众平台 - 实例(未验证)
如何部署自己的公众平台: 1.打开http://mp.weixin.qq.com 注册/登录 2.进入高级功能菜单,选择编辑模式或开发者模式(本例子属于开发者模式-需要自己拥有服务器) ...
- Delphi XE7 用indy开发微信公众平台(3)- 验证消息真实性
验证消息真实性 原文链接:http://www.cnblogs.com/devinlee/p/4282546.html 扫下方二维码关注,测试效果 uses IdHashSHA, IdGlobal;f ...
- VB.net 微信公众平台开发(一) Token验证
登录https://mp.weixin.qq.com/ 后,在公众平台后台管理页面 – 开发者中心页,点击"修改配置"按钮,填写URL.Token和EncodingAESKey,其 ...
- 微信公众号sae服务器搭建,SAE 搭建微信公众平台
index.wsgi # coding: UTF-8 import sae import os import web from weixinInterface import WeixinInterfa ...
最新文章
- CSS3的过渡和动画
- WebServer 软件原理简介
- iOS Hacker 重签名实现无需越狱注入动态库 dylib
- RabbitMq链接
- f450四轴使用技巧
- 一次SAP客户访谈记录
- 计算机翻译辅助工具安卓版,计算机辅助翻译软件
- Change Value to Reference(将值对象改为引用对象)
- 人工智障学习笔记——机器学习(11)PCA降维
- python进阶19垃圾回收GC
- autotools归纳
- 【数据库】Mean web开发 02-Windows下Mongodb安装配置及常用客户端管理工具
- [BZOJ 5074]小B的数字
- Modbus-RTU入门篇
- mac安装虚拟机VMware fusion12 和ubantu系统
- 苹果手机app应用显示未受信任打不开怎么办
- eclipse安装教程和jdk配置(win超详细)
- 这5个免费素材网站,设计师都在用
- 怎么通过微信开发者工具打开一个项目
- 基于matlab的股票投资,基于matlab的股票估价模型系统.doc
热门文章
- 推出企业版开源数据库,Cockroach Labs 完成 2700 万美元新融资
- 仿小米日历功能,Android week view
- Android:代码修改layout_marginBottom的属性
- html5 div 拱桥形状制作,新型上承式拱桥的制作方法
- 哪家的蓝牙耳机质量比较好?2022真无线蓝牙耳机排名
- 你了解微服务吗?什么是微服务
- 信息技术课python培训心得
- iOS - 苹果健康架构 基于HealthKit的健康数据的编辑
- Matplotlib绘制漂亮的饼状图|python绘制漂亮的饼状图
- 从底层结构开始学习FPGA(7)----进位链CARRY4