微信小程序登录源码片断,建议读懂即可用,不建议复制

 @PostMapping("/minapp/login")
    @ApiOperation(value = "微信小程序登录(包括第一次登录)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "code", value = "用户code",required = true, paramType = "body"),
            @ApiImplicitParam(name = "phoneCode", value = "手机code",required = true, paramType = "body"),
    })
    public R mpLogin(@ApiIgnore  @RequestBody MpRequestPojo mpRequestPojo) throws HttpRequestMethodNotSupportedException {
        String code = mpRequestPojo.getCode();
        if(StringUtils.isBlank(code)){
            return R.error("微信小程序用户code不能为空");
        }
        String phoneCode = mpRequestPojo.getPhoneCode();
        if(StringUtils.isBlank(phoneCode)){
            return R.error("微信小程序手机code不能为空");
        }
        //获取access_token
        String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxMiniappsAppId +
                "&secret="+wxMiniappsSecret;
        String jsonData = restTemplate.getForObject(accessTokenUrl, String.class);
        log.info("accessToken返回:"+jsonData);
        JSONObject jsonObject = null;
        if(StringUtils.isBlank(jsonData)){
            return R.error("获取小程序AccessToken信息失败");
        }
        if (StringUtils.contains(jsonData, "errcode")) {
            return R.error("获取小程序AccessToken失败");
        }
        try {
            jsonObject = JSONObject.parseObject(jsonData);
        }catch (Exception e){
            return R.error("获取小程序AccessToken失败");
        }
        String accessToken = jsonObject.getString("access_token");
        //获取手机信息
        String baseUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
        log.info(baseUrl);
        HttpHeaders headers = new HttpHeaders();
        Map<String,Object> requestMap = new HashMap<>();
        // 手机号调用凭证
        requestMap.put("code", phoneCode);
        HttpEntity<Map> entity = new HttpEntity<>(requestMap, headers);
        jsonData = restTemplate.postForObject(baseUrl,entity, String.class);
        log.info("userphonenumber返回:"+ jsonData);
        if(StringUtils.isBlank(jsonData)){
            return R.error("获取小程序手机信息失败");
        }
        try {
            jsonObject = JSONObject.parseObject(jsonData);
        }catch (Exception e){
            return R.error("获取小程序手机信息失败");
        }
        if(jsonObject.getInteger("errcode")!=0){
            return R.error("获取小程序手机信息失败");
        }
        JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
        String phoneNumber = phoneInfo.getString("phoneNumber");
        //获取openid
        String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                "appid=" + wxMiniappsAppId +
                "&secret=" + wxMiniappsSecret +
                "&js_code=" + code +
                "&grant_type=authorization_code";
        jsonData = restTemplate.getForObject(url, String.class);
        log.info(jsonData);
        if(StringUtils.isBlank(jsonData)){
            return R.error("获取小程序openid信息失败");
        }
        if (StringUtils.contains(jsonData, "errcode")) {
            return R.error("获取小程序openid信息失败");
        }
        try {
            jsonObject = JSONObject.parseObject(jsonData);
        }catch (Exception e){
            return R.error("获取小程序openid信息失败");
        }
        if(null==jsonObject){
            return R.error("获取小程序openid信息失败");
        }
        String minappOpenid = jsonObject.getString("openid");
        if(StringUtils.isBlank(minappOpenid)){
            return R.error("获取小程序openid信息失败");
        }
        minappOpenid = StringUtils.trim(minappOpenid);
        if(StringUtils.isNotBlank(phoneNumber)) {
            UserdetailmetaEntity userdetailmetaEntityOne = userdetailmetaService.getInfoByCellphone(phoneNumber);
            if (null != userdetailmetaEntityOne) {
                Long id = userdetailmetaEntityOne.getId();
                String minappOpenidOne = userdetailmetaEntityOne.getMinappOpenid();
                //绑定openid
                if (StringUtils.isBlank(minappOpenidOne)) {
                    QueryWrapper<UserdetailmetaEntity> userdetailmetaEntityQueryWrapper1 = new QueryWrapper<>();
                    userdetailmetaEntityQueryWrapper1.lambda().ne(UserdetailmetaEntity::getId, id)
                            .eq(UserdetailmetaEntity::getMinappOpenid, minappOpenid).select(UserdetailmetaEntity::getId);
                    userdetailmetaEntityQueryWrapper1.last("LIMIT 1");
                    UserdetailmetaEntity userdetailmetaEntity1 = userdetailmetaService.getOne(userdetailmetaEntityQueryWrapper1);
                    if (null == userdetailmetaEntity1) {
                        UserdetailmetaEntity userdetailmetaEntityNew = new UserdetailmetaEntity();
                        userdetailmetaEntityNew.setId(id);
                        userdetailmetaEntityNew.setMinappOpenid(minappOpenid);
                        userdetailmetaService.updateById(userdetailmetaEntityNew);
                    }else{
                        return R.error("小程序绑定了其他手机号");
                    }
                }else{
                    if(!minappOpenidOne.equals(minappOpenid)){
                        return R.error("小程序绑定了其他手机号");
                    }
                }
                //有查询到则返回jwt token
                Map<String, String> parameters = new HashMap<>();
                Map<String, Object> map = new HashMap<>();
                Long userId = userdetailmetaEntityOne.getUserId();
                map.put("cellphone", phoneNumber);
                String redisMd5Password = "123456";
                redisTemplate.opsForValue().set(PASSWORD_MD5_USERID_KEY + phoneNumber, redisMd5Password, 3, TimeUnit.MINUTES);
                //封装成一个UserPassword方式的参数体
                parameters.put("username", JSON.toJSONString(map));
                //放入用户ID做密码
                parameters.put("password", redisMd5Password);
                //授权模式
                parameters.put("grant_type", AdminPwdGranter.GRANT_TYPE);
                User clientUser = new User("all", "secret", new ArrayList<>());
                //生成已经认证的client
                AccountLoginToken token = new AccountLoginToken(clientUser, new ArrayList<>());
                //调用自带的获取token方法。
                OAuth2AccessToken oAuth2AccessToken = tokenEndpoint.postAccessToken(token, parameters).getBody();
                Map<String, Object> additionInfo = oAuth2AccessToken.getAdditionalInformation();
                Date expiration = oAuth2AccessToken.getExpiration();
                String tokenGroupId = (String) additionInfo.get("tokenGroupId");
                String accessTokenStr = oAuth2AccessToken.getValue();
                long betweenDay = DateUtil.between(new Date(), expiration, DateUnit.SECOND);
                Map<String, Object> objectMap = new HashMap<>();
                objectMap.put("tokenGroupId", tokenGroupId);
                redisTemplate.opsForValue().set(JWT_TOKEN_USERID_KEY + userId + "_" + tokenGroupId, objectMap, betweenDay, TimeUnit.SECONDS);
                Map<String, Object> data = new HashMap<>();
                data.put("accessToken", accessTokenStr);
                data.put("cellphone", phoneNumber);
                data.put("realname", userdetailmetaEntityOne.getRealname());
                data.put("faceImageUrl", userdetailmetaEntityOne.getFaceImageUrl());
                return R.ok(data);
            } else {
                String md5key = DigestUtils.md5Hex(jsonData + "MINAPP_LOGIN");
                String redisKey = "MINAPP_LOGIN_" + md5key;
                redisTemplate.opsForValue().set(redisKey, jsonData, Duration.ofDays(1));
                Map<String, String> map = new HashMap<>();
                map.put("minappTempKey", redisKey);
                map.put("cellphone", phoneNumber);
                return R.ok().put(map);
            }
        }else{
            String md5key = DigestUtils.md5Hex(jsonData + "MINAPP_LOGIN");
            String redisKey = "MINAPP_LOGIN_" + md5key;
            redisTemplate.opsForValue().set(redisKey, jsonData, Duration.ofDays(1));
            Map<String, String> map = new HashMap<>();
            map.put("minappTempKey", redisKey);
            return R.ok().put(map);
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值