1.微信網頁授權access_token與普通access_token區別
- 有效期:兩者有效時間都是 7200s;
- 使用範圍:通過網頁授權獲得的access_token,只能獲取到對應的微信用戶信息,與微信用戶是一對一關係;而普通的access_token在有效期內可以使用,可以獲取所有用戶信息。
- 次數限制:普通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:
微信回調url:
這樣就實現了授權回調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權限”。因爲訂閱中沒有獲取到微信網頁授權接口的權限。