springboot实战之获取微信用户基本信息

目标

现实项目开发过程,经常需要获取微信用户信息,基于微信公众号或小程序开发

实现

1. 根据code获取access_token

private AccessTokenVo WeCharUserToken(final String code) throws Exception {
        String accessToken = "";
        //log.info("获取accsstoken"+redisCache.getCacheObject(ACCESS_TOKEN));
        if (!StrUtil.isNotEmpty(accessToken)){
            //code 前端获取的code(填写前端获取的code参数)
            AccessTokenVo accessTokenVo = new AccessTokenVo();
            if (code == null || code.isEmpty()) {
                //throw new ServiceException("微信登录验证请求code为空",HttpStatus.BAD_REQUEST);
                throw new Exception("微信登录验证请求code为空");
            }
            //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
            final String tokenUrl =
                    "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WeChatConfig.appId + "&secret=" + WeChatConfig.secret +
                            "&code=" + code + "&grant_type=" + WeChatConfig.grantType + "&secret=" + WeChatConfig.secret;
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            //请求
            RestTemplate restTemplate = new RestTemplate();
            HttpEntity request = new HttpEntity<>(headers);
            try {
                // ... 处理响应
                ResponseEntity responseString = restTemplate.postForEntity(tokenUrl, request, String.class);
                String jsonContent = responseString.getBody();
                ObjectMapper mapper = new ObjectMapper();
                int statusCode = responseString.getStatusCodeValue();
                log.info("statusCode{}", statusCode);
                try {
                    Map jsonMap = mapper.readValue(jsonContent, new TypeReference>() {});
                    if(jsonMap.containsKey("errcode"))
                        throw new ServiceException("code不正确",HttpStatus.CODE_EXPIRE);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                JSONObject jsonObject = JSONObject.parseObject(jsonContent);
                accessTokenVo = jsonObject.toJavaObject(AccessTokenVo.class);
                Integer time = accessTokenVo.getExpires_in();
                redisCache.setCacheObject(ACCESS_TOKEN, accessTokenVo, time - 3600, TimeUnit.MINUTES);
                return accessTokenVo;
            } catch (HttpClientErrorException e) {
                // 服务器返回错误码,如401, 403, 404等
                System.out.println("服务器返回错误: " + e.getStatusCode());
                System.out.println("错误信息: " + e.getStatusText());
                System.out.println("错误堆栈: " + e.getStackTrace());

            } catch (HttpServerErrorException e) {
                // 客户端请求错误,如500, 503等
                System.out.println("服务器返回错误: " + e.getStatusCode());
                System.out.println("错误信息: " + e.getStatusText());
                System.out.println("错误堆栈: " + e.getStackTrace());
            }
           
        }
        //字符串转实体
        log.info("获取accsstoken"+accessToken);
        AccessTokenVo accessTokenVo= JSONUtil.toBean(accessToken,AccessTokenVo.class);
        return accessTokenVo;
    }

2. 根据accesstoken获取用户信息

public WeCharUserInfo getWeChartUserInfo(final String code) throws Exception {
        AccessTokenVo accessTokenVo = this.WeCharUserToken(code);
        if (accessTokenVo == null) {
            //throw new ServiceException("后端获取用户token 失败",HttpStatus.CODE_EXPIRE);
            throw new Exception("后端获取用户token 失败");
        }
        String token = accessTokenVo.getAccess_token();
        if (token == null || token.isEmpty()) {
            //throw new ServiceException("获取token失败",HttpStatus.CODE_EXPIRE);
            throw new Exception("获取token失败");
        }
        log.info("open id:{}", accessTokenVo.getOpenid());
        log.info("token:{}", token);
        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + accessTokenVo.getOpenid()+"&lang=zh_CN";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        //请求
        RestTemplate restTemplate = new RestTemplate();
        HttpEntity request = new HttpEntity<>(headers);
        ResponseEntity responseString = restTemplate.postForEntity(url, request, String.class);
        JSONObject jsonObject = JSONObject.parseObject(responseString.getBody());
        log.info("获取用户信息->jsonContent{}", responseString.getBody());
        //生成微信用户信息
        WeCharUserInfo weCharUserInfo = jsonObject.toJavaObject(WeCharUserInfo.class);
        log.info("获取用户信息->weCharUserInfo{}", weCharUserInfo);
        return weCharUserInfo;
    }

3. AccessTokenVo实体

public class AccessTokenVo {
    /**
     * 接口调用凭证
     */
    private String access_token;
    /**
     * access_token接口调用凭证超时时间,单位(秒)
     */
    private Integer expires_in;
    /**
     * 用户刷新access_token
     */
    private String refresh_token;
    /**
     * 用户授权的作用域,使用逗号(,)分隔
     */
    private String scope;

    private String openid;

}

 欢迎点赞,留言,评论,转发。

 

你可能感兴趣的:(spring,boot,微信,java)