SpringBoot中应用 微信授权登录

总结项目的过程中,这是一个自己探索的点,项目用到了微信授权登录的功能,因为之前没有做过,所以自己也是在网上搜集了很多资料,现在分享给大家。
其实类似于微信授权登录的其他三方登陆,原理是一样的。

这个授权页面相信大家都不陌生
现在我们就来看一下这是怎么实现的,其实很简单。

  • 首先我们在访问登录页面的时候,就去调用微信官方给我们提供的接口,我们需要提供几个参数,分别是 openid、appid、redirect_uri(重定向链接)
    用到的几个参数
  • 下面看返回登录界面的controller代码
    • 一开始这一部分是我用到的一些跟业务相关的代码,大家可以略过,主要看返回的openid、appid、wxUrl
    • openid我在这里是存到了session里面,我们只需要将open入库即可存取用户信息,因为这个openid是唯一的。
    • 还需要注意的就是获取openid的时候,参数code是规定死的,不能改变
	//获取openid和access_token的连接
    private static String getOpenId = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
    //获取用户基本信息的连接
    private static String getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
	@Value("${pay.wxpay.appId}")
    private String appId;
    @Value("${easy.server.path}")
    private String rootUrl;
    @Value("${pay.wxpay.appSecret}")
    private String appSecret;
	
	/**
	* 返回登录页面
	*/
 	@RequestMapping("phoneIndex")
    public String phoneIndex(Model model, Project project, ProjectType projectType, @RequestParam(value = "pageNo", required = false, defaultValue = "1") Integer pageNo, @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize){
    
    

        project.setStart((pageNo - 1) * pageSize);
        project.setPageSize(pageSize);
        List<Project> list = projectService.selectAll1(project);

        if (project.getTypeId() == null) {
    
    
            project.setTypeId(0L);
        }
        if (project.getProjectStatus() == null) {
    
    
            project.setProjectStatus(-1);
        }
        List<Project> projectList = projectService.selectByTypeId(project);
        List<ProjectType> projectTypeList = projectTypeService.list();
        ProjectType projectType1 = null;
        if (project.getTypeId() != null && project.getTypeId() > 0) {
    
    
            projectType1 = projectTypeService.getById(project.getTypeId());
        }

        String production=project.getProjectProduction();
        model.addAttribute("projectModel", project);
        model.addAttribute("projectList", projectList);
        model.addAttribute("projectTypeList", projectTypeList);
        model.addAttribute("typeFlag", project.getTypeId());
        model.addAttribute("project", project);
        model.addAttribute("projectType", projectType);
        model.addAttribute("projectType1", projectType1);
        model.addAttribute("pageNo", pageNo);
        model.addAttribute("pageSize", pageSize);
        model.addAttribute("length", list.size());
        model.addAttribute("openId",httpSession.getAttribute(HbuJzConstants.SESSION_OPEN_ID));
        model.addAttribute("headImg",httpSession.getAttribute(HbuJzConstants.SESSION_HEAD_IMG));
        model.addAttribute("appId",appId);
        model.addAttribute("wxUrl",rootUrl+"/getOpentId");
        return perfix+"/phone/index_1";
    }

	/**
     * @Description: 获取openId
     * @param code   这个参数名称是死的,是微信那边规定好的
     * @return: java.lang.String 
     * @Author: zte
     * @Date: 2020/11/19 16:03
     */
    @RequestMapping("getOpentId")
    public String getOpentId(String code){
    
    
        String getOpenIdUrl = getOpenId.replace("APPID", appId).replace("APPSECRET", appSecret).replace("CODE", code);
        String response = HttpClientUtil.doGet(getOpenIdUrl);
        log.info("响应response => {}", response);
        JSONObject jsonObject = JSONObject.parseObject(response);
        String accessToken = jsonObject.get("access_token") == null ? null :jsonObject.get("access_token").toString();
        String openId = jsonObject.get("openid") == null ? null : jsonObject.get("openid").toString();
        httpSession.setAttribute(HbuJzConstants.SESSION_OPEN_ID,openId);
        httpSession.setAttribute(HbuJzConstants.SESSION_HEAD_IMG,getHeadImg(openId,accessToken));
        return "redirect:/phoneIndex";
    }

	 /**
     *  根据access_token和openid获取用户头像信息
     * @param openId
     * @param accessToken
     * @return
     */
    private String getHeadImg(String openId,String accessToken){
    
    
        String userInfoUrl = getUserInfo.replace("ACCESS_TOKEN",accessToken).replace("OPENID", openId);
        log.info("userInfoUrl => {}", userInfoUrl);
        String userInfo = HttpClientUtil.doGet(userInfoUrl);
        log.info("userInfo => {}", userInfo);
        JSONObject jsonObject = JSONObject.parseObject(userInfo);
        return jsonObject.get("headimgurl").toString();
    }
  • 接下来我们看前端是如何调取的
    在这里插入图片描述
    • 我们可以看到,当获取到的openId为空的时候,这就说明我们还未授权,这个时候就需要去调取微信授权登录的页面,这个是微信官方给我们定义好了的,我们只需要将对应的参数传进去,就可以拉取微信授权的页面(一开始的授权页面)
    • 我们只需要保留用户的openid(入库),就能获取用户的信息,很方便
  • 到这里我们的微信授权就完成了。

猜你喜欢

转载自blog.csdn.net/qq_44922113/article/details/113624884