记一次微信网页授权后获取用户信息并重定向

释放双眼,带上耳机,听听看~!

本文目录

记一次微信网页授权后获取用户信息并重定向

微信公众号开发还是比较简单的,但是写完之后就忘记了。每次写还要重新查文档,所以这次吧开发过程记录起来,有些细节问题也记录下来,以后用到就方便了。

需求:

  • 能获取用户基本信息。
  • 获取微信信息的时候,从哪个页面来,最后到哪个页面去。
  • 调用方式要简单。

思路:

因为之前写过几次,思路还是很清楚的,大概有一下几个步骤:

  1. 提供一个链接,带有一个redirect_url参数,代表在获取用户信息后要返回的页面。
  2. 在上一个链接中跳转进行微信网页授权。
  3. 授权成功后获取code。
  4. 通过code调用微信接口获取access_token。
  5. 通过access_token获取用户基本信息。
  6. 将用户信息拼在之前定义的redirect_url中,并重定向到redirect_url。

实现:

思路有了下面就开始实现这个思路

1:

首先定义一个方法,接收redirect_url参数,并在这个方法中跳转到微信授权页面。

这里我们需要完成思路中1,2的步骤。

注意:

在浏览器中调用方法的时候redirect_url参数要经过 URLEncoder.encode

在方法中接收的redirect_url参数任然需要经过URLEncoder.encode,因为在作为参数接收到的时候,这个参数已经变成正常的http链接了。

在拼装微信重定向地址的时候,需要再次URLEncoder.encode


//微信网页授权地址
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也会传递进来。

着这个方法中我们需要完成思路中 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

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

C#爬虫与反爬虫--字体加密篇

2020-11-9 5:34:14

随笔日记

.NET中扩展方法和Enumerable(System.Linq)

2020-11-9 5:34:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索