Java微信網頁授權開發

1.微信網頁授權access_token與普通access_token區別

  1. 有效期:兩者有效時間都是 7200s;
  2. 使用範圍:通過網頁授權獲得的access_token,只能獲取到對應的微信用戶信息,與微信用戶是一對一關係;而普通的access_token在有效期內可以使用,可以獲取所有用戶信息。
  3. 次數限制:普通access_token每天獲取最多次數爲2000次;而網頁授權的access_token獲取次數沒有限制。

2.授權回調URI傳遞自定義參數

注意:微信授權回調uri不能帶端口號

我的回調地址是:https://m.abc.com/#/pages/user/register?phone=15300220033
說明:
phone是自定義參數;
https://m.abc.com/#/pages/user/register是前端的地址;

流程是:發起授權->用戶同意授權->微信回調到前端->前端獲取到微信code/state和自定義參數phone->前端通過phone從接口查詢userId;通過code從接口獲取unionId->前端把unionId和userId傳給註冊接口->接口完成後續邏輯。

以下代碼用於拼接授權url:

// 自定義參數拼接
String args = String.format("?phone=%s", phone);

/**
 * 獲取微信授權url
 */
public static String getAuthUrl(String appId, String callBackUrl, String state, String args) throws UnsupportedEncodingException {

    String redirect_uri = URLEncoder.encode(callBackUrl + args, "UTF-8");

    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
            "appid=APPID" +
            "&redirect_uri=REDIRECT_URI" +
            "&response_type=code" +
            "&scope=SCOPE" +
            "&state=STATE" +
            "#wechat_redirect";
    return url.replace("APPID",appId)
            .replace("REDIRECT_URI",redirect_uri)
            .replace("SCOPE","snsapi_userinfo")
            .replace("STATE",state);
}

通過以上代碼拼接的發起授權的url:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=myappid&redirect_uri=https%3A%2F%2Fm.abc.com%2F%23%2Fpages%2Fuser%2Fregister%3Fphone%3D15300220033&response_type=code&scope=snsapi_userinfo&state=70a38dd8b640491a93347614bc1d4ec6#wechat_redirect

微信回調url:

https://m.abc.com/?code=0817Cznv0FmkBg19vFnv0G1ynv07Cznp&state=70a38dd8b640491a93347614bc1d4ec6#/pages/user/register?phone=15300220033

這樣就實現了授權回調uri攜帶自定義參數的目的。

3.前後端分離,網頁授權設計方案

微信公衆號網頁授權登錄,因爲是前後端項目,所以跳轉是在前端做的,所以回調地址配置的是前端頁面地址。

前端需要的步驟是:

1、訪問後端接口,獲取微信授權url。

2、前端跳轉到該授權url。

3、用戶點擊授權,微信自動會跳轉一個重定向頁面,也就是回調頁面。

4、前端獲取到重定向鏈接上的code,截取下來發送個後端。(這個鏈接地址是你自己設置的,就是授權成功你需要跳回的頁面,然後微信會在這個頁面上地址上加上一個code)

5、後端會根據傳過去的code,向微信請求頭像暱稱等;

後面的事情就是交給後端了。

4.防篡改,state用法

發起授權時,生成state值,並拼接到授權url上

// state(防止csrf攻擊)存入緩存,有效期60秒
String state = UUID.randomUUID().toString().replaceAll("-", "");
redisTemplate.opsForValue().set(String.format(WX_CACHE_KEY_STATE, state), "1", 60, TimeUnit.SECONDS);

回調回來時,校驗state

//判斷state是否合法
if (StringUtils.isBlank(code) || StringUtils.isBlank(state) || ! isValidState(state)) {
   return Result.error("登錄超時,請重新登錄");
}

    /**
     * 校驗state
     */
    @Override
    public boolean isValidState(String state) {
        String key = String.format(WX_CACHE_KEY_STATE, state);
        String value = redisTemplate.opsForValue().get(key);
        // 校驗一次就刪除
        redisTemplate.delete(key);
        return StringUtils.isNotBlank(value);
    }

5.其他

網頁授權回調地址配置可以帶端口嗎? 

答:必須是80端口。否則,報redirect_uri參數錯誤。改成80端口就好了。

微信公衆號提示10005錯誤

①訂閱號沒有相關的權限

②賬號沒有認證,沒有相關的權限

③scope 參數位置錯誤

首先檢查您的微信號是服務號還是訂閱號, 如果是訂閱號,騰訊沒有開放接口,故沒有權限;

授權回調域名配置規範爲全域名且不帶http,假如需要網頁授權的域名爲:”www.qq.com“,配置以後此域名下面頁面“http://www.qq.com/music.html、http://www.qq.com/login.html ”都可以進行OAuth2.0鑑權。

Scope 參數錯誤或沒有Scope權限

用訂閱號的appId發起授權登錄,會提示“Scope 參數錯誤或沒有Scope權限”。因爲訂閱中沒有獲取到微信網頁授權接口的權限。

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