springboot 獲取公衆號Token 明文獲取

 

SignUtil

    公共類java

package com.bdqn.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class SignUtil {
    private final static String TOKEN= "填寫在公衆號設置的token";

    /**
     * 校驗簽名
     * @param signature 簽名
     * @param timestamp 時間戳
     * @param nonce 隨機數
     * @return 布爾值
     */
    public static boolean checkSignature(String signature,String timestamp,String nonce){
        String checktext = null;
        if (null != signature) {
            //對ToKen,timestamp,nonce 按字典排序
            String[] paramArr = new String[]{TOKEN,timestamp,nonce};
            Arrays.sort(paramArr);
            //將排序後的結果拼成一個字符串
            String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);

            try {
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                //對接後的字符串進行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                checktext = byteToStr(digest);
            } catch (NoSuchAlgorithmException e){
                e.printStackTrace();
            }
        }
        //將加密後的字符串與signature進行對比
        return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
    }

    /**
     * 將字節數組轉化我16進制字符串
     * @param byteArrays 字符數組
     * @return 字符串
     */
    private static String byteToStr(byte[] byteArrays){
        String str = "";
        for (int i = 0; i < byteArrays.length; i++) {
            str += byteToHexStr(byteArrays[i]);
        }
        return str;
    }

    /**
     *  將字節轉化爲十六進制字符串
     * @param myByte 字節
     * @return 字符串
     */
    private static String byteToHexStr(byte myByte) {
        char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        char[] tampArr = new char[2];
        tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
        tampArr[1] = Digit[myByte & 0X0F];
        String str = new String(tampArr);
        return str;
    }


}

Controller

    註釋的地方爲servlet開發方式,解開後參數修改成HttpServletRequest和HttpServletResponsegit

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;


@RestController
public class TokenController {

    @RequestMapping("checkToken")
    public String token(String signature,String timestamp,String nonce,String echostr)throws IOException {
        //token驗證代碼段
        try{
            System.out.println("請求已到達,開始校驗token");
            if (StringUtils.isNotBlank(signature)) {
              /*  String signature = request.getParameter("signature");
                String timestamp = request.getParameter("timestamp");
                String nonce = request.getParameter("nonce");
                String echostr = request.getParameter("echostr");*/
               // System.out.println("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
                if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                   // System.out.println("數據源爲微信後臺,將echostr[{}]返回!", echostr);
                   // response.getOutputStream().println(echostr);
                    return echostr;
                }
            }
        }catch (Exception e){
            System.out.println("校驗出錯");
            e.printStackTrace();
        }

        return null;
    }
}
相關文章
相關標籤/搜索