代码语言:javascript复制
import org.apache.commons.lang3.StringUtils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* @ProjectName: WxTest
* @Author: huat
* @Date: 2020/6/18 10:49
* @Version: 1.0
*/
public class WxService {
//此处token的值需要和公众号填写的token值一致
private static final String TOKEN="abcdefg";
/**
* 验证请求是否来自微信
* @param timestamp
* @param nonce
* @param echostr
* @return
*/
public static boolean check(String timestamp,String nonce,String echostr){
/**
* 验证签名步骤
* 1)将token、timestamp、nonce三个参数进行字典序排序
* 2)将三个参数字符串拼接成一个字符串进行sha1加密
* 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
*/
//第一步声明一个String数组
String[] strs={TOKEN,timestamp,nonce};
//第数组中进行排序
Arrays.sort(strs);
//第二步拼接字符串,这里使用的commons-lang3包中的方法
String str=StringUtils.join(strs,"");
//sha1加密
String encryption=encryption(str);
//第三步对比是否一致
return encryption!=null?echostr.equals(encryption):false;
}
/**
* 进行sha1加密
* @param str 需要加密的字符串
* @return
*/
private static String encryption(String str){
try {
//获取加密对象
MessageDigest messageDigest=MessageDigest.getInstance("sha1");
//加密字符串
byte[] bytes=messageDigest.digest(str.getBytes());
//转位数参照表
char[] chars= {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
StringBuilder stringBuilder=new StringBuilder();
//处理加密结果
for (byte b:bytes){
stringBuilder.append(chars[(b>>4)&15]);
stringBuilder.append(chars[b&15]);
}
return stringBuilder.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}