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; } }
来源:oschina
链接:https://my.oschina.net/u/3535099/blog/4315710