1. 程式人生 > >微信開發:網頁授權、跳轉至網頁

微信開發:網頁授權、跳轉至網頁

概述

原文連結:http://blog.csdn.net/u011506468/article/details/47305261 
微信參考:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html 
思路:此篇主要介紹如何在點選微信的選單後獲得使用者的資訊並跳轉至該網頁。 
網頁授權分為四步: 
1. 引導使用者進入授權頁面同意授權,獲取code 
2. 通過code換取網頁授權access_token(與基礎支援中的access_token不同) 
3. 如果需要,開發者可以重新整理網頁授權access_token,避免過期 
4. 通過網頁授權access_token和openid獲取使用者基本資訊(支援UnionID機制)

配置授權回撥域名

如果使用者在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。所以第一步是配置域名,在微信公眾號的公眾號設定中可以配置,域名是需要備案的。

獲取code

  • scope為snsapi_base,靜默授權並自動跳轉到回撥頁的。使用者感知的就是直接進入了回撥頁(往往是業務頁面)
  • scope為snsapi_userinfo,這種授權需要使用者手動同意,並且由於使用者同意過,所以無須關注,就可在授權後獲取該使用者的基本資訊

獲取網頁授權的access_token

程式碼說明

新使用者進來的時候是沒有cookie的,而且type=2,首先是要授權,授權的程式碼在下面。這個時候可以給其設定一個cookie,設定存活時間為10小時。授權完成後,還是會重定向進入這個方法來處理,只是type變化,這個時候進入

測試或者正式環境,根據引數menuType進行判斷是哪個目錄被點選,然後進入相對應的頁面。若cookie不為空,則直接跳轉測試或者正式環境相對應的頁面。

/**
     * 
     * @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);       /* 測試環境 */
                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)); 
                /* 生產環境 */
                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:
                        //社群
                        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:
                            //社群
                            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);
        /* 向微信發請求獲取access_token */
        Map<String, Object> map = wechatUserService.getPageAccessToken(code);
        /* 向微信發請求,用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));
    }