首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日常问题随笔 | 21.09.12

日常问题随笔 | 21.09.12

作者头像
浩说编程
发布2021-10-08 15:41:43
1410
发布2021-10-08 15:41:43
举报
文章被收录于专栏:Java经验之谈Java经验之谈

昨天在做公众号扫码登录的时候,公众号需要先验证web应用的token

在网上尝试了各种方案,总是有多多少少的问题,后来经过各种方案的结合,最终得到可以验证成功的版本:

环境:springboot

1、配置服务代理(这里我用的Nginx)

server {
    location /{
        #注意,代理之后的端口必须是8080或443,否则验证失败
        proxy_pass http://你的ip:8080;
    }
}

2、controller

@Controller
@RequestMapping("/oauth")
public class OAuthController {

    /**
     * 微信公众号签名认证接口
     * @Title: test
     * @Description: TODO
     * @param: @param signature
     * @param: @param timestamp
     * @param: @param nonce
     * @param: @param echostr
     * @param: @return
     * @return: String
     * @throws
     */
    @RequestMapping("/wx")
    public void test(HttpServletRequest request,HttpServletResponse response) {

        String msgSignature = request.getParameter("signature");
        String msgTimestamp = request.getParameter("timestamp");
        String msgNonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        PrintWriter print;
        if (WeixinCheckoutUtil.verifyUrl(msgSignature, msgTimestamp, msgNonce)) {
            try {
                print = response.getWriter();
                print.write(echostr);
                print.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3、验证token,SHA-1算法

/**
 * 签名认证工具类
 * @ClassName:  WeixinCheckoutUtil
 * @Description:TODO
 * @author: jp
 * @date:   2019年6月13日 下午4:56:12
 *
 * @Copyright: 2019 www.tydic.com Inc. All rights reserved.
 *
 */
public class WeixinCheckoutUtil {

    // 与公众号配置信息中的Token要一致
    private static String token = "";

    /**
     * 验证Token
     * @param msgSignature 签名串,对应URL参数的signature
     * @param timeStamp 时间戳,对应URL参数的timestamp
     * @param nonce 随机串,对应URL参数的nonce
     *
     * @return 是否为安全签名
     */
    public static boolean verifyUrl(String msgSignature, String timeStamp, String nonce) {
        String signature =getSHA1(token, timeStamp, nonce);
        if (!signature.equals(msgSignature)) {
            throw new AesException(AesException.ValidateSignatureError);
        }
        return true;
    }

    /**
     * 用SHA1算法验证Token
     *
     * @param token     票据
     * @param timestamp 时间戳
     * @param nonce     随机字符串
     * @return 安全签名
     */
    public static String getSHA1(String token, String timestamp, String nonce)  {
        try {
            String[] array = new String[]{token, timestamp, nonce};
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // SHA1签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
        } catch (Exception e) {
            e.printStackTrace();
            //throw new AesException(AesException.ComputeSignatureError);
        }
        return null;
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档