Java实现微信公众号授权登录

Java微信公众号授权登录

1. 微信授权登录机制授权机制

  • 微信移动设备授权登录是基于 OAuth2.0 协议标准构建的,从分类上来看,这种登陆方式满足 协议标准 的 第四种方式,即凭证式。

  • 凭证式的认证方式

    • 应用通过URL中携带 client_id 和 client_secret 来发出认证请求。
    • 目标网站接收请求后两项验证通过后,直接返回令牌。
    • 该令牌对应的是唯一应用,而不是唯一用户,所有整个应用的用户发送的请求都使用同一令牌。

2. 配置内网穿透

  1. 使用NATAPP网站配置隧道,获取本地电脑的临时域名。
  2. 详细配置教程NATAPP注册账号配置隧道

3. 微信公众号测试号配置

  1. 扫码登录 微信公众平台

  2. 获取个人的测试号信息,也就是对应我们上文提到的 client_id 和 client_secret

在这里插入图片描述

  1. 修改JS安全域名为内网穿透获得的临时域名

在这里插入图片描述

  • (这里的接口网址不带http)
  1. 扫码关注自己的公众测试号,这样才能进行之后的扫码授权等操作

Java实现微信公众号授权登录_第1张图片

  1. 开启测试号网页授权功能并配置

Java实现微信公众号授权登录_第2张图片
Java实现微信公众号授权登录_第3张图片

(这里依然使用获得的临时域名)

4. 网页授权登录配置

  1. 查看[官方文档]( 微信开放文档 (qq.com) )

  2. 掌握了网页授权登录的基本步骤

    1 第一步:用户同意授权,获取code

    2 第二步:通过code换取网页授权access_token

    3 第三步:刷新access_token(如果需要)

    4 第四步:拉取用户信息(需scope为 snsapi_userinfo)

    5 附:检验授权凭证(access_token)是否有效

  3. 代码实现

    1. 前台获取code

      		//截取code值
      			getUrlParam(name) {
      			  var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
      			  let url = window.location.href.split('#')[0]
      			  let search = url.split('?')[1]
      			  if (search) {
      			    var r = search.substr(0).match(reg)
      			    if (r !== null)
      			      return unescape(r[2])
      			    return null
      			  } else
      			    return null
      			},
      
    2. 发送含参的url请求

       //判断信息是否传入
              if(code==null){
                  return ResultJson.failure(ResultCode.ID_NOTFOUND);
              }
              String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +  weiXinProperties.getAppid() +
                      "&secret=" +  weiXinProperties.getAppsecret() +
                      "&code=" + code +
                      "&grant_type=authorization_code";
             
      
    3. 获取 access_token

       JSONObject jsonObject = HttpUtils.httpGet(url);
      
              String openId = jsonObject.getString("openid");
              String access_Token = jsonObject.getString("access_token");
              String accessToken = weiXinShareService.getAccessToken();
      
    4. 获取用户信息

          // 拉取用户信息(需scope为 snsapi_userinfo)
              url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_Token +
                      "&openid=" + openId +
                      "&lang=zh_CN";
              JSONObject userInfoJson = HttpUtils.httpGet(url);
              log.info("拉取到的用户信息"+userInfoJson.toJSONString());
              if(String.valueOf(userInfoJson.get("errcode")).equals("40014")){
                  return ResultJson.failure(ResultCode.NOT_ONLY_CODE);
              }
      
    5. 总体代码

          @GetMapping("/getUserInfo")
          public  ResultJson getUserInfo(String code,HttpServletResponse response) throws Exception {
              //判断信息是否传入
              if(code==null){
                  return ResultJson.failure(ResultCode.ID_NOTFOUND);
              }
              String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +  weiXinProperties.getAppid() +
                      "&secret=" +  weiXinProperties.getAppsecret() +
                      "&code=" + code +
                      "&grant_type=authorization_code";
              JSONObject jsonObject = HttpUtils.httpGet(url);
      
              String openId = jsonObject.getString("openid");
              String access_Token = jsonObject.getString("access_token");
              String accessToken = weiXinShareService.getAccessToken();
      
              // 拉取用户信息(需scope为 snsapi_userinfo)
              url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_Token +
                      "&openid=" + openId +
                      "&lang=zh_CN";
              JSONObject userInfoJson = HttpUtils.httpGet(url);
              log.info("拉取到的用户信息"+userInfoJson.toJSONString());
              if(String.valueOf(userInfoJson.get("errcode")).equals("40014")){
                  return ResultJson.failure(ResultCode.NOT_ONLY_CODE);
              }
              if(userInfoJson!=null){
                //业务操作判断
          }
      

你可能感兴趣的:(项目相关技术点整理,java,vue)