本文目标:学习一种比较安全的服务器间互相验证身份的方式。
问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做?
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,以告诉微信服务器接入成功。具体的开发者服务器校验逻辑代码如下显示。
Java代码 收藏代码
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验证源码,java版!
在微信企业号的开发过程中,Token验证是一个至关重要的环节,它确保了应用的安全性和数据的准确性。 首先,我们要理解什么是Token。Token在开发领域中通常被当作一种临时的身份凭证,它由服务器生成并发送给客户端...
描述:微信公众平台TOKEN验证PHP网页文件。在服务器端的PHP网页,测试通过。 资源名称:微信公众平台TOKEN验证
主要介绍了PHP实现微信公众号验证Token的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
首先要开启开发模式必须要进行Token的一个验证,你给出一个地址,微信发送请求,然后你给出相应,就这么简单。虽然说是简单,但是这是事后才说的,官方只有PHP的DEMO,我用JAVA开发的时候各种蛋疼不会弄,不过好在...
[点微]微信平台Discuz 论坛微信运营首选平台微信接口提交提示:TOKEN验证失败、URL请求超时我们在提交开发者中心设置的URL和TOKEN的时候,往往会
微信开发者token验证
微信接口token验证和消息回复原理,其中有详细的注释说明,帮助您理解微信的接口实现,和实现消息的回复,是微信接口开发的入口,可是先自动回复机器人的开发。
最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败。为此,我甚至手工写了微信提交过来的记录,如: ×tamp=1510210523&nonce=2414550015&signature=30b9eeb6b...
验证微信公众号的token
微信绑定域名token验证,代码加入项目中编译后放到需要绑定的服务器运行
.net微信公众平台验证Token并在关注时发送欢迎语,vs2010源码;.net微信公众平台验证Token并在关注时发送欢迎语;.net微信公众平台验证Token并在关注时发送欢迎语;.net微信公众平台验证Token并在关注时发送欢迎语;...
Java写的微信公众号token验证+实现你问我答功能小项目
可以直接复制代码进行验证,带有自动回复功能,经测试,效果很好,android和ios全面兼容
本代码演示通过VS2017 C# 获取微信token及验证access_token是否过期,以及通过access_token读取云中存储的数据。
vb.net 微信开发 token 验证 & 实现订阅号 调用 图灵机器人文字处理回复 连接SQL 欢迎更多技术交流 如有问题 请不吝指出!
微信token/url验证代码,可设置自己微信的token,完成url验证即可成为微信开发者
微信公众号token验证+自动回复经纬度PHP代码,用于学习微信公众号的开发
总结来说,微信开发中的Token验证失败和请求URL超时问题可以通过检查配置文件的Token设置、优化服务器设置、使用wechatCallbackapiTest类以及排除安全软件的干扰来解决。同时,不断学习和实践微信开发相关的技术,也...
微信公众号开发token验证文件,包括自动回复消息相关信息