java版微信公衆號開發(二):配置token

掃碼登陸微信公衆號平臺,此時默認的是編輯模式,需要修改爲開發者模式。

找到開發--->基本配置,

clipboard.png

clipboard.png

設置AppId以及APPSecret,並填寫IP白名單(在線ip查詢:http://www.ip138.com/)。


下面進行服務器配置,這裏需要進行token的驗證,會根據你填寫的url進行token的匹配驗證,官網描述的很清楚:https://mp.weixin.qq.com/wiki...

開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:

clipboard.png

開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:

1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信

官網也給出了校驗實例,但是是php的,需要我們轉換成java。具體步驟如下:


創建springboot項目,添加依賴

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>

    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.9</version>
    </dependency>

創建WechatIndexController類,實現一個get請求方法:

@RestController
@RequestMapping("/index")
public class WechatIndexController {
    private static final Logger LOGGER = LoggerFactory.getLogger(WechatIndexController.class);

    @RequestMapping(method = RequestMethod.GET)
    public void get(HttpServletRequest request, HttpServletResponse response) {
        // 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
        String signature = request.getParameter("signature");
        // 時間戳
        String timestamp = request.getParameter("timestamp");
        // 隨機數
        String nonce = request.getParameter("nonce");
        // 隨機字符串
        String echostr = request.getParameter("echostr");

        PrintWriter out = null;
        try {
            out = response.getWriter();
            // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,否則接入失敗
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                out.print(echostr);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            out.close();
            out = null;
        }
    }

}

SignUtil類:

public class SignUtil {
    //token可以自己進行定義,必須爲英文或者是數字,長度爲3-32字符,這個token要跟服務器配置中的token一致
    private static String token = "woshiyigetokenaaa123qqq";

    /**
     * 校驗簽名
     * @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;
    }
}

先啓動ngrok,再啓動tomcat項目,將外網地址/index填入對應url,token按照剛纔定義的書寫,加密祕鑰隨機生成即可:

clipboard.png

提交成功!!

當然,如果有自己的外網服務器,只需要將項目打包發佈到外網,url和token根據自己定義的來書寫,也沒有什麼問題。注意,一定要保證切換到開發者模式。


服務器配置成功之後,就可以進行後續開發啦,下面會介紹如何訂閱回覆圖文消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章