若依框架(ruoyi)实现微信小程序登录功能&&获取手机号-springboot

首先还是一样的问题,拿到问题不要直接盲目写,先阅读官方文档

官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
在这里插入图片描述
tip:先把流程捋清楚,其实什么都不是问题


一、service业务逻辑层

appId、appSecret都是商家唯一有的,可自行前往商户平台获取
我把这两个值存储在配置类中方便获取

 /**
     * 微信小程序登录
     * @param code
     * @return
     */
  public AjaxResult wxlogin(String code) {
  //请求微信登录的地址 
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code";
        String replaceUrl = url.replace("{0}", appId).replace("{1}", appSecret).replace("{2}", code); //替换为需要的值
        JSONObject jsonObject = JSONObject.parseObject(HttpUtils.sendGet(replaceUrl));    //转为json格式接收
//请求成功后 获取数据
        String openid = jsonObject.getString("openid");
        String nickname = jsonObject.getString("nickname");
        String session_key = jsonObject.getString("session_key");
        redisTemplate.opsForValue().set("openid", openid);
        if (openid == null) {
            return AjaxResult.error("登录失败");
        }
        //查询用户是否存在,用来判断是否为第一次登录,记住openId是每个用户的标识
        WechatUser wxUser = wechatUserMapper.selectWxUserByOpenId(openid);
//        不存在的话则是创建一个新用户存放数据
        WechatUser user = new WechatUser();
        if (wxUser == null) {
            user.setOpenId(openid);
//            插入操作 username根据自己要求存储 
            user.setUsername(generateRandomUsername(prefix));
            if (nickname != null) {
                user.setNickName(nickname);
            }
            user.setNickName(generateRandomUsername(prefix));
            if (unionId != null) {
                user.setUnionId(unionId);
            }
            user.setCreateTime(DateUtils.getNowDate());
            user.setLoginTime(DateUtils.getCurrentTimestamp());
            user.setTime(1);
            wechatUserMapper.insertWechatUser(user);
        } else {
            //更新
            user = wxUser;
            user.setUpdateTime(DateUtils.getNowDate());
            user.setLoginTime(DateUtils.getCurrentTimestamp());
            user.setTime(user.getTime() + 1);
            wechatUserMapper.updateWechatUser(user);
        }
//        组装token信息  当前登录用户的信息
        LoginUser loginUser = new LoginUser();
        loginUser.setWxuser(user);
        loginUser.setOpenId(openid);
        loginUser.setSessionKey(session_key);

        String token = tokenService.createToken(loginUser);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("token", token);
        ajax.put("userInfo", user);
        return ajax;


  /**
     * 获取手机号
     * @param code
     * @return
     */
 public AjaxResult getPhoneNumber(String code) {
        String openid = tokenService.getOpenidFromToken(tokenService.getToken(request));
        AjaxResult accessToken1 = getAccessToken();
        String accessToken = (String) accessToken1.get("access_token");
        String phoneUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("code", code);
        map.put("openid", openid);
        String res = HttpUtils.sendPost(phoneUrl, JSONObject.toJSONString(map));
        JSONObject jsonObject = JSONObject.parseObject(res);
        Integer errcode = jsonObject.getInteger("errcode");
        if (errcode == 0) {
            JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
            String phoneNumber = phoneInfo.getString("phoneNumber");
            AjaxResult ajax = AjaxResult.success();
            ajax.put("phoneNumber", phoneNumber);
//        放在数据库里面
            WechatUser wechatUser = wechatUserMapper.selectWxUserByOpenId(openid);
            if (wechatUser != null) {
                wechatUser.setPhoneNumber(phoneNumber);
                wechatUserMapper.updateWechatUser(wechatUser);
            }
            return ajax;
        } else {
            redisTemplate.delete("accessToken");
            getAccessToken();
            return AjaxResult.error("微信错误" + jsonObject.getString("errmsg"));
        }

  /**
     * getAcessToken方法 经常会使用 则被我封装了
     * @param code
     * @return
     */
   public AjaxResult getAccessToken() {
        String accToken = redisTemplate.opsForValue().get("accessToken");
        if (StringUtils.isBlank(accToken)) {
            String url = "https://api.weixin.qq.com/cgi-bin/token?appid={0}&secret={1}&grant_type=client_credential";
            String replaceUrl = url.replace("{0}", appId).replace("{1}", appSecret);
            JSONObject jsonObject = JSONObject.parseObject(HttpUtils.sendGet(replaceUrl));
            Integer errcode = jsonObject.getInteger("errcode");
            if (ObjectUtils.isEmpty(errcode)) {
                String accessToken = jsonObject.getString("access_token");
                redisTemplate.opsForValue().set("accessToken", accessToken, 7000, TimeUnit.SECONDS);
                AjaxResult ajax = AjaxResult.success();
                ajax.put("access_token", accessToken);
                return ajax;
            } else {
                return AjaxResult.error("微信错误" + jsonObject.getString("errmsg"));
            }
        } else {
            AjaxResult ajax = AjaxResult.success();
            ajax.put("access_token", accToken);
            return ajax;
        }
    }
    }

二、controller层

    @ApiOperation("小程序登录接口")
    @PostMapping("/wxlogin")
    public AjaxResult wxLogin(@RequestBody String code) {

        return AjaxResult.success(wechatLoginService.wxlogin(code));
    }

    @ApiOperation("获取用户手机号")
    @PostMapping("/getPhoneNumber")
    public AjaxResult getPhoneNumber(@RequestBody String code) {
        return AjaxResult.success(wechatLoginService.getPhoneNumber(code));
    }```



评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值