思路:此篇主要介紹如何在點擊微信的菜單后獲得用戶的信息并跳轉至該網(wǎng)頁。?
網(wǎng)頁授權分為四步:?
1. 引導用戶進入授權頁面同意授權,獲取code?
2. 通過code換取網(wǎng)頁授權access_token(與基礎支持中的access_token不同)?
3. 如果需要,開發(fā)者可以刷新網(wǎng)頁授權access_token,避免過期?
4. 通過網(wǎng)頁授權access_token和openid獲取用戶基本信息(支持UnionID機制) 配置授權回調(diào)域名
如果用戶在微信客戶端中訪問第三方網(wǎng)頁,公眾號可以通過微信網(wǎng)頁授權機制,來獲取用戶基本信息,進而實現(xiàn)業(yè)務邏輯。所以第一步是配置域名,在微信公眾號的公眾號設置中可以配置,域名是需要備案的。
獲取code接口請求為:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect?
redirect_uri為請求后重定向地址,也就是你要跳轉至的網(wǎng)頁地址,state為重定向后的參數(shù)。?
scope的區(qū)別說明,有2種授權方式,根據(jù)自己的需要進行處理:
- scope為snsapi_base,靜默授權并自動跳轉到回調(diào)頁的。用戶感知的就是直接進入了回調(diào)頁(往往是業(yè)務頁面)
- scope為snsapi_userinfo,這種授權需要用戶手動同意,并且由于用戶同意過,所以無須關注,就可在授權后獲取該用戶的基本信息
獲取code后,請求以下鏈接獲取access_token,code為上一步得到的code:?
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
新用戶進來的時候是沒有cookie的,而且type=2,首先是要授權,授權的代碼在下面。這個時候可以給其設置一個cookie,設置存活時間為10小時。授權完成后,還是會重定向進入這個方法來處理,只是type變化,這個時候進入測試或者正式環(huán)境,根據(jù)參數(shù)menuType進行判斷是哪個目錄被點擊,然后進入相對應的頁面。若cookie不為空,則直接跳轉測試或者正式環(huán)境相對應的頁面。
?
?
/**
*
* @param type 0-測試, 1-正式, 2-跳轉獲取CODE,3:認證過的測試號
* @param menuType
* @param request
* @param wechatUserId
* @param response
* @return
*/
@RequestMapping("/view")
public ModelAndView view(Integer type,Integer menuType, Integer wechatUserId, String redirect,HttpServletRequest request, HttpServletResponse response)
{
Cookie cookie = CookieUtil.getCookieByName(request, "wechatUserId");
log.info("type:" + type + ",menuType:" + menuType + ",wechatUserId:" + wechatUserId + ",redirect:" + redirect);
String url = null;
if(cookie == null)
{
log.info("Cookie已過期.....");
if(type == 0)
{
CookieUtil.addCookie(response, "wechatUserId", Randoms.getInt(1, 53)+"", 60 * 10); /* 測試環(huán)境 */
url = "view?format=json&type=0&menuType=" + menuType + "&redirect=" + redirect;
log.info("url:" + url);
return new ModelAndView(new RedirectView(url));
}
else if(type == 1)
{
CookieUtil.addCookie(response, "wechatUserId", wechatUserId+"", (60 * 60 * 10));
/* 生產(chǎn)環(huán)境 */
url = "view?format=json&type=1&menuType=" + menuType + "&redirect=" + redirect;
log.info("url:" + url);
return new ModelAndView(new RedirectView(url));
}
else if(type == 2)
{
String wechatRedirece = UrlUtil.encode(wechatConfig.getHOST() + "wechat/user/auth?format=json&type=1&menuType=" + menuType + "&redirect=" + redirect);
/**
* 授權的鏈接
* 注意redirect_uri為重定向地址,/auth在下面的代碼中
* public String getAUTHORIZE_URL() {
* return "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+getAPPID() +"&redirect_uri=";
}
*/
url = wechatConfig.getAUTHORIZE_URL() + wechatRedirece + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
log.info("url:" + url);
return new ModelAndView(new RedirectView(url));
}
else
{
return new ModelAndView(new RedirectView(url));
}
}
else
{
log.info("Cookie未過期.....");
if(type == 0)
{
switch (menuType)
{
case 0:
url = AESCryptoSecurity.decrypt(redirect, wechatConfig.getAPPID());
break;
case 1:
//社區(qū)
url = wechatConfig.getHOST_FRONT() + "page/topicList.html";
break;
case 2:
//活動
url = wechatConfig.getHOST_FRONT() + "page/activityList.html";
break;
}
}
else
{
switch (menuType)
{
case 0:
url = AESCryptoSecurity.decrypt(redirect, wechatConfig.getAPPID());
break;
case 1:
//社區(qū)
url = wechatConfig.getHOST_FRONT() + "page/topicList.html";
break;
case 2:
//活動
url = wechatConfig.getHOST_FRONT() + "page/activityList.html";
break;
}
}
return new ModelAndView(new RedirectView(url));
}
}
下面的代碼為獲取code,獲取access_token,獲取用戶信息等,認證完跳轉至對應的頁面
?
?
@RequestMapping("/auth")
public ModelAndView auth(String code, Integer type, Integer menuType, String redirect) throws Exception
{
log.info("code:" + code + ",type:" + type + ",menuType:" + menuType);
/* 向微信發(fā)請求獲取access_token */
Map<String, Object> map = wechatUserService.getPageAccessToken(code);
/* 向微信發(fā)請求,用access_token獲取用戶信息并保存 */
WechatUser pageWechatUser = wechatUserService.getPageWechatUser(map.get("access_token").toString(), map.get("openid").toString());
String url = null;
if(type == 1)
{
/* 權限認證完成后,將type改為1或者0,重定向進入上面的方法進行頁面跳轉 */
url = wechatConfig.getHOST() + "wechat/menu/view?&type=1&menuType=" + menuType + "&wechatUserId=" + pageWechatUser.getWechatId() + "&redirect=" + redirect;
log.info("url:" + url);
}
return new ModelAndView(new RedirectView(url));
}
?
?
?
本文摘自 :https://blog.51cto.com/u