1. 程式人生 > >微信開發(1) :網頁授權獲取使用者的基本資訊 實現微信登入(java)

微信開發(1) :網頁授權獲取使用者的基本資訊 實現微信登入(java)

微信開發(1) :網頁授權獲取使用者的基本資訊 實現微信登入

由於工作需要,最近進行微信開發,然而微信官方的文件,比較模糊。網上大多數,是PHP做的,
本文 使用java語言開發。(後續更新 java版的 微信開放平臺的 公眾號第三方平臺開發)
準備工作:首先搞明白微信公眾號的 幾種分類,以及不同的許可權,本文不做多餘解釋,使用微信提供的測試號進行開發
(測試號自己可以申請的,使用測試號需要 關注自己的測試工作號才可以進行開發)

如有不正確 歡迎大家指導 討論交流

需要: appid , secret, 在公眾號設定內 可以找到, 以及設定回撥域名;
回撥域名:用於點選微信授權登入以後,跳轉至微信頁面,使用者授權成功後,微信進行回撥訪問的域名。
需提前在公眾號 配置
微信appid

設定回撥域名:注意 回撥域名要寫全域名 比如www.chenmo.com 和chenmo.com 是不一樣的效果,這裡寫的 要跟下文中配置請求連結中的一致,回撥域名在 網頁服務裡的 網頁賬號處設定,與 js安全域名不同,不要搞混了
這裡寫圖片描述

手動授權 :需要使用者手動點選 授權登入,微信才能帶 code引數訪問 回撥方法, 使用者可以進入微信頁面 看到微信提示的是否授權登入頁面,
scope=snsapi_userinfo使用者手動授權,連結例子:主要引數 appid ,redirect_uri, scope=snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxx&redirect_uri=xxxx&response_type=


code&scope=snsapi_userinfo&state=STATE#wechat_redirect

跟著官方文件四步走,
1. 使用者同意 授權 拿到code
2. 帶著code去呼叫微信 api ,獲得微信返回 json ,拿到令牌access_token 和openid
3. 令牌access_token 有限期2小時 ,2小時內可以使用該令牌獲取使用者資訊,如果需要 頻繁獲取使用者最新資訊,需注意access_token 的有效期,過期時需要使用 重新整理令牌 去進行重新整理,重新整理令牌 有效期為一個月 ,一個月後需要使用者再次手動授權
4. 帶著access_token 和openid ,去呼叫微信api 獲取 使用者資訊
根據個人需求,業務邏輯去處理,需要及時獲取使用者最新資訊,要注意令牌過期時間,要重新整理,不需要及時獲取使用者資訊,只是把微信當做註冊登入,就在自己資料庫 合理的建表,第一次獲取到使用者資訊後 儲存,第二次拿到openid 直接去資料庫讀 沒必要再次呼叫微信api

需要注意: 只有第一步 使用者確認授權,需要訪問微信的連結,訪問微信的頁面,等待使用者同意後,微信回撥,帶著使用者code訪問你自己的專案,所以專案必須上線,部署在外網可以訪問的伺服器,解析域名,配置域名。這樣微信才可以進入你的回撥方法。當然 僅僅使用ip應該也可以,沒有做過類似的嘗試,

第一步之後 拿到code,需要 開發者自己寫方法,在方法內部 呼叫微信的api介面,微信返回json型別的資料,注意 微信指定的有請求方式 get/post 不同的api請求方式不同
正式開發:
第一步: 引導使用者 點選微信登入的按鈕, 後臺方法:使用者點選了 授權登入 按鈕就直接重定向到微信授權登入的連結,
引導使用者登入
此時 使用者看到的介面:
這裡寫圖片描述

使用者點選確定按鈕:   訪問回撥連結(回撥連結 如圖所示)     進入第二步:

這裡寫圖片描述

第二步: 此時 微信將帶著code 引數 訪問你設定的 回撥連結 ?? 回撥連結 應該做什麼?
在回撥連結方法中 需要我們處理這樣一個邏輯,因為此時 只是獲得一個code引數,並沒有真正獲取到使用者的資訊,所以需要 手寫一個能夠傳送post 或者get 訪問url 並拿到返回值的方法 (網上有很多類似的方法 可以自己寫 也可以網上找 )如圖:

這裡寫圖片描述
這裡寫圖片描述

上圖 為 傳送請求 獲取返回值 方法 ;
微信訪問 回撥方法,基本上 就是 在回撥方法裡 去呼叫上圖的方法,獲取返回值 返回頁面:
這裡寫圖片描述

我在專案裡 沒有經過第三步 因為只是簡單的做一個註冊功能,不需要頻繁獲取使用者最新資料 ,所以 此處直接獲取了使用者基本資訊 存入了資料庫

這裡寫圖片描述

然後返回前臺頁面;

整個流程結束,獲取了使用者資訊 ;

遇到的錯誤:
有這麼一個情況,能進入回撥函式 ,但是取不到使用者的資料
檢視日誌檔案 很清楚的 說明 問題出在 secret 這個引數上;
這裡寫圖片描述

專案 上線後出現出現 新問題 : 簡單說 某些使用者 微信暱稱使用Emoji表情或者某些特殊字元是4個位元組 導致資料庫插入時 報錯:

Incorrect string value: ‘\xF0\x9F…’ for column ‘XXX’ at row 1

解決方法 百度