springboot配置微信公众号获取openid

 


前言

作为一个程序员小白要时刻记录自己近期学习成果。最近也是接了一个项目通过微信公众号获取openid拿取微信账号信息绑定


一、微信公众号是什么?

微信公众平台开发概述 | 微信开放文档https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

二、使用步骤

1.申请微信公众号测试号

微信公众平台进入申请测试号然后获取测试号的appID、appsecret,拿到这些信息就可以开始在springboot项目中的application.yml配置

2.springboot配置微信公众号

3.网页授权

1.第一步:用户同意授权,获取code(具体步骤可查看微信开放文档

公众号拿取微信授权接口地址然后在application中配置,为方便后面我把整个步骤所需要的微信接口都配置进去

wechat:
  appid: wx6f59d6140611d9ee
  secret: 84cce012e3ccb3f873412b53dfd1c0b2
  #微信授权接口地址
  api-auth: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
  #获取微信授权的access-token的接口地址
  api-auth-access-token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
  #获取微信用户信息接口地址
  api-userinfo: https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
  #微信用户授权成功后回调接口地址
  auth-call-back: http://xinyushiaolu.oicp.net/edu-user/weChatApi/authCallBack

然后在controller类中写授权接口然后前端调用接口,注意跳转回调redirect_uri这个参数是你授权回调的地址会页面将跳转至 redirect_uri/?code=CODE&state=STATE。拿取code

   /**
     * 微信授权
     *
     * @param response
     * @param studentNumber
     * @param authSucceedSkipUrl
     * @return
     * @throws IOException
     */
    @GetMapping("/getWeChat")
    public String getWeChat(HttpServletResponse response, String studentNumber, String authSucceedSkipUrl) throws IOException {
        String uRLEncoderAuthCallBack = URLEncoder.encode(weChatConfig.getAuthCallBack(), "utf-8");

        // 用户授权跳转地址
        String apiAuthUrl = weChatConfig.getApiAuth()
                .replace("APPID", weChatConfig.getAppid())
                .replace("REDIRECT_URI", uRLEncoderAuthCallBack)
                .replace("SCOPE", "snsapi_userinfo")
                .replace("STATE", studentNumber + "," + authSucceedSkipUrl);
        response.sendRedirect(apiAuthUrl);
        log.info("用户授权跳转地址apiAuthUrl = {}", apiAuthUrl);
        return "redirect:" + apiAuthUrl;
    }

weChatConfig类是为了引入刚才在application配置的微信appid等接口方便调用

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

前端在需要的地方调用一下该接口进行授权,我们为此做一个回调接口让授权直接跳该网址获取code,然后通过code换取access_token和openid

则此时开发者可以通过access_token和openid拉取用户信息了然后保存到数据库,该接口一次把这几步做到位了

/**
     * 微信授权回调接口
     *
     * @param code
     * @param state
     * @return
     * @throws IOException
     */
    @GetMapping("/authCallBack")
    public Object authCallBack(String code, String state) throws IOException {
        if (StringUtils.isEmpty(code)) {
            return Result.error(CommonExceptionEnum.PARAMETER_VERIFY_ERROR);
        }
        log.info("微信授权回调, code = {}  ,state = {}", code, state);
        //获取微信授权access_token
        String apiAuthAccessTokenUrl = weChatConfig.getApiAuthAccessToken()
                .replace("APPID", weChatConfig.getAppid())
                .replace("SECRET", weChatConfig.getSecret())
                .replace("CODE", code);
        String result = HttpUtil.get(apiAuthAccessTokenUrl);
        log.info("微信授权access_token返回参数:{}", result);
        HashMap<String, String> wechatAuthTokenMap = JSON.parseObject(result, HashMap.class);

        String accessToken = wechatAuthTokenMap.get("access_token");
        String openid = wechatAuthTokenMap.get("openid");

        //如果微信的返回access_token为空
        if (StringUtils.isBlank(accessToken)) {
            return Result.error(CommonExceptionEnum.WECHAT_LOGIN_ERROR);
        }
        //调用微信通过OPENID和ACCESS_TOKEN获取用户信息接口
        String apiUserinfoUrl = weChatConfig.getApiUserinfo()
                .replace("ACCESS_TOKEN", accessToken)
                .replace("OPENID", openid);
        //获取微信用户信息
        String resultUserinfo = HttpUtil.get(apiUserinfoUrl);
        log.info("微信用户信息:{}", resultUserinfo);
        WechatUserInfoDTO wechatUserInfoDTO = JSON.parseObject(resultUserinfo, WechatUserInfoDTO.class);

        //更新数据
        String[] stateArr = state.split(",");
        if (stateArr.length != 2) {
            return Result.error(CommonExceptionEnum.WECHAT_LOGIN_ERROR);
        }
        UpdateWrapper<User> uw = new UpdateWrapper<>();
        uw.eq("student_number", stateArr[0]);
        log.info("getStuNumber=" +  stateArr[0]);
        uw.set("openid", wechatUserInfoDTO.getOpenid())
                .set("bind", 1)
                .set("wechat_avatar", wechatUserInfoDTO.getHeadimgurl())
                .set("nick_name" ,wechatUserInfoDTO.getNickname());

        boolean updateStatus = userBindService.update(uw);
        if(!updateStatus){
            return Result.error(CommonExceptionEnum.STUDENT_NO_EXIST_ERROR);
        }
        log.info("用户授权登录成功跳转地址:{}",stateArr[1]);
        return "redirect:"+stateArr[1];
    }

 
 

 

总结

该文章只是我对自己这段时间的学习的一个总结和记录,当然有不好的地方请指正!同时希望自己能够坚持向自己目标前进,让自己水平不断提高

### 使用 Spring Boot 开发微信公众号应用 #### 集成准备 为了实现基于Spring Boot微信公众号开发,需先完成必要的准备工作。这包括注册微信公众平台账号并创建相应的公众号,在此过程中会获得`AppID`和`AppSecret`两个重要参数[^1]。 #### 授权流程解析 当用户访问链接时,通过OAuth2.0授权机制来获取用户的同意授权。具体来说,就是构建一个带有特定参数(如`appid`, `redirect_uri`, `response_type`, `scope`, 和`state`)的URL请求发送给微信服务器。一旦用户确认授权,则会被重定向到指定页面,并附带授权码作为查询字符串的一部分。 ```java @GetMapping("/auth") public String auth(@RequestParam(value="code") String code){ // 处理接收到的授权码... } ``` #### 获取用户信息 利用上一步得到的授权码可以向微信接口申请换取access_token以及openid。之后再凭借这些凭证调用微信API取得更详细的用户资料,比如昵称、头像等个人信息。 ```json { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" } ``` ```java // 假设已经成功获得了 access_token 和 openid String accessToken = "..."; String openId = "..."; RestTemplate restTemplate = new RestTemplate(); Map<String, Object> params = Map.of( "access_token", accessToken, "openid", openId, "lang", "zh_CN" ); ResponseEntity<Map> response = restTemplate.getForEntity( "https://api.weixin.qq.com/sns/userinfo?" + "access_token={access_token}&openid={openid}&lang={lang}", Map.class, params ); System.out.println(response.getBody()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值