微信公众号请求验证加密比对

2020-12-07 15:37:25 浏览数 (1)

代码语言: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;
    }
}

0 人点赞