天天看點

微信外鍊擷取微信使用者資訊

首先說一下,這裡的擷取使用者資訊是從微信公衆号跳轉到第三方網站然後根據微信的api擷取使用者昵稱,頭像,手機号,位址,openid,unionid等資訊。

1.伺服器配置

首先登陸你的公衆号,左下角的開發->基本配置,其中的伺服器配置,點選添加或者修改,這裡是必須配了公網解析,并且伺服器nginx配置跳轉

微信外鍊擷取微信使用者資訊

URL填寫驗證token的接口位址:你的網址/接口名稱

Token随意填寫,但是需要和你程式中驗證的Token相同

點選随機生成,生成加密密鑰

點選送出會向你的程式發送驗證,需要按照微信的要求傳回密文才能送出成功。

下面是我的controller

@ResponseBody
    @GetMapping("/check")
    public String check(HttpServletRequest request) {

        // 微信加密簽名
        String signature = request.getParameter("signature");
        // 時間戳
        String timestamp = request.getParameter("timestamp");
        // 随機數
        String nonce = request.getParameter("nonce");
        // 随機字元串
        String echostr = request.getParameter("echostr");
        // 通過檢驗signature對請求進行校驗,若校驗成功則原樣傳回echostr,表示接入成功,否則接入失敗
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            log.info("echostr=" + echostr);
            return echostr;
        } else {
            return "fail";
        }
    }
           

其中的加密方法如下

public class SignUtil {


    // 與接口配置資訊中的Token要一緻
    private static final String TOKEN = "targetToken";

    /**
     * 方法名:checkSignature</br>
     * 詳述:驗證簽名</br>
     * 開發人員:souvc</br>
     * 建立時間:2015-9-29  </br>
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     * @throws
     */
    public static boolean checkSignature(String signature, String timestamp,String nonce) {
        // 1.将token、timestamp、nonce三個參數進行字典序排序
        String[] arr = new String[] { TOKEN, timestamp, nonce };
        Arrays.sort(arr);

        // 2. 将三個參數字元串拼接成一個字元串進行sha1加密
        StringBuilder content = new StringBuilder();
        for (int i = ; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三個參數字元串拼接成一個字元串進行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        content = null;
        // 3.将sha1加密後的字元串可與signature對比,辨別該請求來源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
     * 方法名:byteToStr</br>
     * 詳述:将位元組數組轉換為十六進制字元串</br>
     * 開發人員:souvc </br>
     * 建立時間:2015-9-29  </br>
     * @param byteArray
     * @return
     * @throws
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = ; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
     * 方法名:byteToHexStr</br>
     * 詳述:将位元組轉換為十六進制字元串</br>
     * 開發人員:souvc</br>
     * 建立時間:2015-9-29  </br>
     * @param mByte
     * @return
     * @throws
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[];
        tempArr[] = Digit[(mByte >>> ) & ];
        tempArr[] = Digit[mByte & ];
        String s = new String(tempArr);
        return s;
    }

}
           

即可送出成功

2.測試環境開發

微信是提供了測試環境公衆号的

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

3.跳轉外鍊

微信開發文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信網頁開發下的微信網頁授權。

從公衆号跳轉外鍊,直接填外鍊是打不開的,需要先像上面一樣配置伺服器,然後就可以打開這台伺服器上的頁面了,然後跳轉的連結是這樣的:

微信外鍊擷取微信使用者資訊

其中redirect_uri就是你要跳轉的連結

4.擷取使用者資訊

微信開發文檔https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839 下面微信網頁開發/微信網頁授權下面有5步:

1 第一步:使用者同意授權,擷取code

2 第二步:通過code換取網頁授權access_token

3 第三步:重新整理access_token(如果需要)

4 第四步:拉取使用者資訊(需scope為 snsapi_userinfo)

5 附:檢驗授權憑證(access_token)是否有效

根據說明發送http請求就行,這裡代碼就不全展示了,

如果使用者同意授權,頁面将跳轉至 redirect_uri/?code=CODE&state=STATE。

舉例根據code擷取access_token:

public Map<String, String> getAccessToken(String code) throws Exception {

        HttpUriRequest request = RequestBuilder.get("https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + APPID + "&secret=" + APPSECRET + "&code=" + code + "&grant_type=authorization_code").setConfig(HttpClientFactory.getDefaultRequestConfig()).build();
        HttpResponse response = client.execute(request);
        //EntityUtils.consumeQuietly(response.getEntity());
        int rspCode = response.getStatusLine().getStatusCode();
        log.info("rsqcode" + rspCode);

        Map<String, String> result = JSON.read(EntityUtils.toString(response.getEntity()), Map.class);
        log.info("" + result);
        if (rspCode /  != ) {
            throw new IOException("unexpectedresponsecode:" + rspCode);
        } else {
            EntityUtils.consumeQuietly(response.getEntity());
        }

        return result;
    }
           

這裡都傳回成map,根據需要再取,取不到就抛出異常

大緻就是這樣,希望看到這裡你有所得。

歡迎關注我的微網誌@住街對面的查理,我的生活很有趣,你要不要來看一看。