美文网首页
Spring Boot 实现微信扫码登陆方法

Spring Boot 实现微信扫码登陆方法

作者: 刘小刀tina | 来源:发表于2020-03-07 22:42 被阅读0次

    1. 调用微信开放平台的接口 按照如下步骤操作:

    image.png

    1. 控制类

    
    /**
    * (1)调用微信平台提供的接口生成二维码
    * (2)用户扫描二维码后 调用回调函数 返回扫描之后的票据
    * (3)拿到票据之后请求微信地址 获取到一个凭证
    * (4)拿到凭证后请求微信地址 获取到用户的相关信息
    **/
    @Controller
    @RequestMapping(value = "/api/ucenter/wx")
    @CrossOrigin
    
    public class WxApiController {
    
    
       @Autowired
       private UcenterMemberService ucenterMemberService ;//
    
    
       //第一步 : 生成二维码
       @GetMapping(value = "login") // /api/ucenter/wx/login
      // @ResponseBody
       public String getQrConnect(HttpSession session){
    
           //1. 微信开放平台授权baseUrl
            String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                    "?appid=%s" +
                    "&redirect_uri=%s" +
                    "&response_type=code" +
                    "&scope=snsapi_login" +
                    "&state=%s" +
                    "#wechat_redirect";
    
            //2. 扫描之后的回调地址
           String  redirectUrl=null;
           try {
               //3. 对回调的url进行编码
               redirectUrl =  URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, "UTF-8");
           } catch (Exception e) {
               e.printStackTrace();
           }
           //4 拼接出来最终生成二维码的地址
           String state = "tina";//TODD 为了测试:这个值传递是注册内网穿透的域名名称 实现域名跳转
           String qrcodeUrl = String.format(baseUrl,ConstantPropertiesUtil.WX_OPEN_APP_ID,redirectUrl,state);
           // 5重定向到二维码的地址
           return "redirect:"+qrcodeUrl;
       }
    
    
       //用户扫描二维码会调用该回调函数获取到用户的相关信息
       @GetMapping(value = "callback")
       public String callback(String code,String state){
           //获取扫描之后的票据code
    
           //拿到票据之后去请求微信地址
           String baseAccessTokenUrl = "https://api.weixin.qq.com/oauth2/access_token" +
                   "?appid=%s" +
                   "&secret=%s" +
                   "&code=%s" +
                   "&grant_type=authorization_code";
           String accessTokenUrl = String.format(baseAccessTokenUrl,ConstantPropertiesUtil.WX_OPEN_APP_ID,ConstantPropertiesUtil.WX_OPEN_APP_SECRET,code); //拼接出最终的微信地址
    
           //请求微信地址获取凭证
          String result =  HttpClientUtils.get(accessTokenUrl);//HttpClientUtils这个工具需要额外引入 此次为贴代码
    
           //将获取的凭证信息进行解析
           Gson gson = new Gson();
           HashMap map = gson.fromJson(result, HashMap.class);
           String accessToken =  (String)map.get("access_token");
           String  openid = (String)map.get("openid");
           UcenterMember member = ucenterMemberService.getById(openid);
    
           if(member == null ){
               //为空则说明是新用户,则拿着凭证和微信ID请求微信地址获取用户的相关信息
               String baseUrlInfoUrl =  "https://api.weixin.qq.com/sns/userinfo" +
                       "?access_token=%s" +
                       "&openid=%s";
               //拼接成最终的微信地址
               String userInfoUrl = String.format(baseUrlInfoUrl,accessToken,openid);
               String resultUserInfo =  HttpClientUtils.get(userInfoUrl) ;
               //将获取的用户信息转换json
               HashMap userInfomap = gson.fromJson(resultUserInfo, HashMap.class);
               String  nickname = (String)userInfomap.get("nickname");//用户的微信昵称
               String headimgurl = (String)userInfomap.get("headimgurl");//用户的微信头像
               //TODD 将新获取的用户信息调用sql方法存储到数据库中, 然后标记登陆状态
    
    
           }
           //否则说名是老用户 用户的相关信息为member,标记登陆状态
    
           //重定义向到前端页面中
           return "redirect:http://3000";
       }
    
       
    
    }
    
    

    2. 配置

    #微信开发平台的appid
    wx.open.app_id=wxc606fb748aedee7c
    #微信开放平台
    wx.open.app_secret=6c94e426cc7f49e29b42231ee202b1a3
    #微信开放平台 重定向url
    wx.open.redirect_url=http://yaohuan.work/api/ucenter/wx/callback
    

    相关文章

      网友评论

          本文标题:Spring Boot 实现微信扫码登陆方法

          本文链接:https://www.haomeiwen.com/subject/snrkdhtx.html