企業號簡單的OAuth2驗證介面執行個體(使用SpringMVC非註解方式),oauth2springmvc
企業號簡單的OAuth2驗證介面執行個體(使用SpringMVC非註解方式)
目前企業號只提供了scope為"snsapi_base"的應用授權範圍,也就是不會跳轉到讓使用者授權的頁面。
之前寫了使用註解方式驗證並擷取使用者資訊的執行個體,大家不是很理解,問題很多,現在附上簡單的驗證擷取使用者資訊的執行個體!
企業號OAuth2驗證介面執行個體(使用SpringMVC)
OAuth2.0驗證需要注意:
1.redirect_uri參數是授權回調地址,也就是說這個地址外網是可以訪問的,所以如果使用本機對應伺服器的猿們請修改為外網可以訪問的地址!
2.配置可信網域名稱,可信網域名稱是1中redirect_uri的網域名稱部分,不需要http,支援次層網域及IP地址!
3.根據回調到你地址的URL 中會帶有code參數,code參數每次擷取的值都不一樣並且5分鐘有效。
4.在使用code參數擷取使用者資訊的時候,確保每次的code參數都是新的,之前看到有人每次擷取的code是新的但是傳如的code還是之前已經使用過的,因此謹慎!
此處附上代碼:
SimpleOAuth2Controller:
<span style="font-family:FangSong_GB2312;font-size:14px;">package org.oms.qiye.web;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.oms.qiye.pojo.AccessToken;import org.oms.qiye.util.Constants;import org.oms.qiye.util.QiYeUtil;import org.oms.qiye.util.Result;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * 單純實現OAuth2驗證,不使用註解及攔截器 * @author Sunlight * */@Controllerpublic class SimpleOAuth2Controller {/** * 拼接網頁授權連結 * 此處步驟也可以用頁面連結代替 * @return */@RequestMapping(value = { "/oauth2wx.do" })public String Oauth2API(HttpServletRequest request){//擷取項目網域名稱String reqUrl =request.getLocalAddr();//拼接回調地址String backUrl ="http://" + reqUrl + "/oauth2me.do";String redirect_uri = "";try {redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Constants.CORPID + "&redirect_uri=" + redirect_uri+ "&response_type=code&scope=snsapi_base&state=sunlight#wechat_redirect";return "redirect:" + oauth2Url;}/** * 授權回調請求處理 * @return */@RequestMapping(value = { "/oauth2me.do" })public String oAuth2Url(HttpServletRequest request, @RequestParam String code){AccessToken accessToken = QiYeUtil.getAccessToken(Constants.CORPID, Constants.SECRET);HttpSession session = request.getSession();if (accessToken != null && accessToken.getToken() != null) {String Userid = getMemberGuidByCode(accessToken.getToken(), code, Constants.AGENTID);if (Userid != null) {session.setAttribute("UserId", Userid);}}// 這裡簡單處理,儲存到session中return "user";}/** * 調用介面擷取使用者資訊 * * @param token * @param code * @param agentId * @return * @throws SQLException * @throws RemoteException */public String getMemberGuidByCode(String token, String code, int agentId) {System.out.println("code==" + code + "\ntoken=" + token + "\nagentid=" + agentId);Result<String> result = QiYeUtil.oAuth2GetUserByCode(token, code, agentId);System.out.println("result=" + result);if (result.getErrcode() == "0") {if (result.getObj() != null) {// 此處可以通過授權用code還錢的Userid查詢自己本機伺服器中的資料return result.getObj();}}return "";}}</span>
運行:
伺服器調試圖:
手機端結果:
轉載請註明出處,以免慘不忍睹!
技術交流請加入QQ群:點選連結加入群【企業號開發交流】:http://jq.qq.com/?_wv=1027&k=RgbtOX
QQ群:89714226