記一次微信網頁受權後獲取用戶信息並重定向

記一次微信網頁受權後獲取用戶信息並重定向

微信公衆號開發仍是比較簡單的,可是寫完以後就忘記了。每次寫還要從新查文檔,因此此次吧開發過程記錄起來,有些細節問題也記錄下來,之後用到就方便了。html

需求:

  • 能獲取用戶基本信息。
  • 獲取微信信息的時候,從哪一個頁面來,最後到哪一個頁面去。
  • 調用方式要簡單。

思路:

由於以前寫過幾回,思路仍是很清楚的,大概有一下幾個步驟:前端

  1. 提供一個連接,帶有一個redirect_url參數,表明在獲取用戶信息後要返回的頁面。
  2. 在上一個連接中跳轉進行微信網頁受權。
  3. 受權成功後獲取code。
  4. 經過code調用微信接口獲取access_token。
  5. 經過access_token獲取用戶基本信息。
  6. 將用戶信息拼在以前定義的redirect_url中,並重定向到redirect_url。

實現:

思路有了下面就開始實現這個思路java

1:

首先定義一個方法,接收redirect_url參數,並在這個方法中跳轉到微信受權頁面。web

這裏咱們須要完成思路中1,2的步驟。api

注意:

在瀏覽器中調用方法的時候redirect_url參數要通過 URLEncoder.encode瀏覽器

在方法中接收的redirect_url參數任然須要通過URLEncoder.encode,由於在做爲參數接收到的時候,這個參數已經變成正常的http連接了。微信

在拼裝微信重定向地址的時候,須要再次URLEncoder.encodeapp

//微信網頁受權地址
private String getWechatCodeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
        "appid=[APPID]&" +                  //微信appid
        "redirect_uri=[REDIRECT_URI]&" +    //獲取網頁受權後,微信重定向地址
        "response_type=code&" +
        "scope=snsapi_userinfo&" +          //受權方式
        "state=STATE#wechat_redirect";

//微信受權後返回的地址
private String getCodeUrl = "項目域名" +
        "redirect/code?redirect_url=";

//提供的獲取用戶信息的地址
@GetMapping("/redirect")
    public String redirect(
            @RequestParam(name = "redirect_url", defaultValue = "", required = false) String redirectUrl
    ) throws UnsupportedEncodingException {
        //默認值,前端首頁地址
        if (StringUtils.isBlank(redirectUrl)) {
            redirectUrl = webSite;
        }
        //一次編碼
        redirectUrl = URLEncoder.encode(redirectUrl, "utf-8");
        //二次編碼
        redirectUrl = URLEncoder.encode(getCodeUrl + redirectUrl, "utf-8");
        //最終獲得的微信獲取微信受權地址
        String url = getWechatCodeUrl
            .replace("[APPID]", appid)
            .replace("[REDIRECT_URI]", redirectUrl);
        logger.info("redirecturl: {}", url);
        return "redirect:" + url;
    }

2:

這裏要在定義一個連接,就是上一步要讓微信跳轉回來的地址。這裏微信會攜帶一個code參數,因爲在上一步咱們將redirect_url地址進行了兩次編碼,因此在這個方法中redirect_url也會傳遞進來。ui

着這個方法中咱們須要完成思路中 4,5,6的步驟編碼

//獲取access_token的接口地址,這裏還能夠獲取到openid
private String getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
        "appid=[APPID]&" +      //微信的appid
        "secret=[SECRET]&" +    //微信的secret
        "code=[CODE]&" +        //重定向後微信攜帶的code參數
        "grant_type=authorization_code";

//獲取微信用戶基本信息的接口地址
private String getWechatUserUrl = "https://api.weixin.qq.com/sns/userinfo?" +
        "access_token=[ACCESS_TOKEN]&" +    //獲取到的 access_token
        "openid=[OPENID]&" +                //公衆號的 openid
        "lang=zh_CN";

//這裏的地址由微信重定向跳轉,攜帶code參數。
@GetMapping("/redirect/code")
public String getCode(
        @RequestParam(name = "redirect_url", defaultValue = "", required = false) String redirectUrl,
        @RequestParam(name = "code", defaultValue = "", required = false) String code
) throws UnsupportedEncodingException {
    logger.info("redirect_url: {}", redirectUrl);
    logger.info("code: {}", code);
    if (StringUtils.isBlank(code)) {
        logger.error("獲取code失敗");
        return "redirect:" + redirectUrl + "?error=code-is-null";
    }
    //解碼重定向地址
    redirectUrl = URLDecoder.decode(redirectUrl, "utf-8");
    //根據code獲取微信相關信息
    String apiUrl = getAccessTokenUrl
            .replace("[APPID]", appid)
            .replace("[SECRET]", secret)
            .replace("[CODE]", code);
    String res = HttpUtils.doGet(apiUrl, new HashMap<>());
    JSONObject resJson = JSONObject.parseObject(res);
    //請求失敗
    if (resJson.containsKey("errmsg")) {
        logger.error("獲取access_token失敗," + res);
        return "redirect:" + redirectUrl + "?error=" + resJson.getString("errmsg");
    }
    //獲取微信用戶信息
    String getUserUrl = getWechatUserUrl
            .replace("[ACCESS_TOKEN]", resJson.getString("access_token"))
            .replace("[OPENID]", resJson.getString("openid"));
    String user = HttpUtils.doGet(getUserUrl, new HashMap<>());
    JSONObject userJson = JSONObject.parseObject(user);
    if (userJson.containsKey("errmsg")) {
        logger.error("獲取access_token失敗," + res);
        return "redirect:" + redirectUrl + "?error=" + userJson.getString("errmsg");
    }
    //這裏直接將微信用戶信息編碼後重定向給最開始的redirect_url
    return "redirect:" + redirectUrl + "?wechat_user=" + URLEncoder.encode(user, "utf-8");
}

完成:

這裏就已經開發完成了,發佈到線上後訪問:

[域名]/redirect?redirect_url=[須要轉到的地址]

後,在得到用戶受權後會跳轉

[須要轉到的地址]?wechat_user=[URLEncoder.encode後的微信用戶信息]

https://www.cnblogs.com/hebaibai/p/11089318.html

相關文章
相關標籤/搜索