小程序授权登录

提示:小程序授权登录代码


前言

小程序授权。


一、获取授权参数?

示例: /**

     * 获取授权参数
     * @return
     */
    @PostMapping("wxAppOauthParams")
    public RetBean wxAppOauthParams(HttpServletRequest request){
        String clientType = request.getHeader("Client-Type");
        Map<String,Object> map = new HashMap<>();
        String state = UUID.randomUUID().toString().replace("-", "");
        stringRedisTemplate.opsForValue().set(state, "1",300 );
        map.put("clientType", clientType);
        map.put("appid", WechatAppConstant.APPID);
        map.put("scope", "snsapi_userinfo");
        map.put("state",state);
        return new RetBean(true, CommonConstant.SUCCESS_CODE, "",map);
    }

二、解析用户信息并存库

1.引入库

代码如下(示例):

 /**
     * 微信小程序授权
     * @param code
     * @param encryptedData
     * @param iv
     * @return
     */
    @PostMapping("wxLogin")
    public RetBean wxLogin(HttpServletRequest request,String code,String encryptedData,String iv){
        if (StringUtils.isEmpty(code)){
            return new RetBean(false, CommonConstant.FAIL_CODE, "code不能爲空");
        }
        if (StringUtils.isEmpty(encryptedData)){
            return new RetBean(false, CommonConstant.FAIL_CODE, "encryptedData不能爲空");
        }
        if (StringUtils.isEmpty(iv)){
            return new RetBean(false, CommonConstant.FAIL_CODE, "iv不能爲空");
        }
        String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                "appid="+ WechatAppletConstant.APPID+
                "&secret="+ WechatAppletConstant.SECRET+
                "&js_code="+code+"&grant_type=authorization_code";
        String jsonDate = this.restTemplate.getForObject(url, String.class);
        if (StringUtils.contains(jsonDate, "errcode")){
            return new RetBean(false, CommonConstant.FAIL_CODE, "登录失败");
        }
        JSONObject result = JSON.parseObject(jsonDate);
        System.out.println(result);
        String sessionKey = result.get("session_key").toString();
        //通过解码获取用户信息
        JSONObject userInfo = decryptUserInfo(encryptedData,sessionKey,iv);
        System.out.println(userInfo);
        //向微信账户表中添加数据
        WechatAccounts wechatAccounts = new WechatAccounts();
        wechatAccounts.setUuid(UUID.randomUUID().toString().replace("-", ""));
        wechatAccounts.setOauthType("APPLET_USER");
        String unionid = userInfo.get("unionId").toString();
        System.out.println(userInfo.get("avatarUrl"));
        if (unionid==null){
            return new RetBean(false, CommonConstant.FAIL_CODE, "请绑定微信开放平台");
        }
        wechatAccounts.setAppletOpenid(userInfo.get("openId").toString());
        wechatAccounts.setUnionid(unionid);
        wechatAccounts.setNickName(userInfo.getString("nickName"));
        wechatAccounts.setGender(Integer.valueOf(userInfo.getString("gender")));
        wechatAccounts.setProvince(userInfo.getString("province"));
        wechatAccounts.setCountry(userInfo.getString("country"));
        wechatAccounts.setCity(userInfo.getString("city"));
        wechatAccounts.setAvatar(userInfo.getString("avatarUrl"));
        wechatAccounts.setDataState(1);
        wechatAccounts.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        wechatAccounts.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        System.out.println(wechatAccounts);
        //检验数据是否已存在,存在更新不存在新增
        WechatAccounts wechatAccounts1 = this.wechatAccountsService.selectOneWechatAccount(userInfo.get("openId").toString());
        if (wechatAccounts1==null){
            //新增
            int i = this.wechatAccountsService.addOne(wechatAccounts);
            if (i==0){
                return new RetBean(false, CommonConstant.FAIL_CODE, "授权失败");
            }
            return new RetBean(true, CommonConstant.SUCCESS_CODE,"授权成功",wechatAccounts );
        }
        return new RetBean(true, CommonConstant.SUCCESS_CODE,"授权成功",wechatAccounts1 );
    }

三、登录

 /**
     * 小程序登录注册接口
     *
     * @param request
     * @return
     */
    @Override
    public RetBean appletRegister(HttpServletRequest request, HttpServletResponse response) {
        String requestHeader1 = request.getHeader("Request-Source");
        String requestHeader = requestHeader1.toUpperCase();
        String clientType = request.getHeader("Client-Type");
        Map<String, String> map = QuYouCommonUtil.requestToMap(request);
        String wechatOpenid = map.get("wechatOpenid");
        String avatar = map.get("avatar");
        if (StringUtils.isEmpty(avatar)){
            return new RetBean(false, CommonConstant.FAIL_CODE, "头像不能为空","");
        }
        String unionid = map.get("unionid");
        String nickName = map.get("nickName");
        String mobile = map.get("mobile");
        String isLogin = map.get("isLogin");
        String replace = UUID.randomUUID().toString().replace("-", "");
        Map<String, Object> registerLoginMap = new HashMap<>();
        //创建一个QueryWrapper的对象
        QueryWrapper<Accounts> wrapper = new QueryWrapper<>();
        wrapper.eq("wechat_openid", wechatOpenid);
        //向数据库中查找是否存在
        Accounts accounts3 = this.platFormAccountPlusMapper.selectOne(wrapper);
        if (accounts3 == null) {
            Accounts accounts = new Accounts();
            accounts.setUuid(UUID.randomUUID().toString().replace("-", ""));
            accounts.setUserUuid(replace);
            accounts.setUserTypeValue(requestHeader);
            accounts.setName(nickName);
            accounts.setMobile(mobile);
            accounts.setWechatOpenid(wechatOpenid);
            accounts.setWechatUnionid(unionid);
            accounts.setDataState(1);
            accounts.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
            int i = this.platFormAccountPlusMapper.insert(accounts);
            if (i == 0) {
                return new RetBean(false, CommonConstant.FAIL_CODE, "向accounts表中添加数据失败");
            }
            Users users = new Users();
            users.setUuid(replace);
            users.setNickName(nickName);
            users.setTypeValue(requestHeader);
            users.setMobile(mobile);
            users.setAvatar(avatar);
            users.setStatus(1);
            users.setDataState(1);
            users.setUserType("APPLET_USER");
            users.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
            users.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
//            users.setUserTags(new ArrayList<UserTags>());
            int k = this.platFormUserPlusMapper.insert(users);
            if (k == 0) {
                return new RetBean(false, 500, "向用户表中添加数据失败", null);
            }
        }
        if (isLogin.equals("1")) {
            //登录成功生成token
            QueryWrapper<Accounts> acountWrapper = new QueryWrapper<>();
            acountWrapper.eq("wechat_openid", wechatOpenid);
            Accounts accounts1 = this.platFormAccountPlusMapper.selectOne(acountWrapper);
            Users users1 = this.platFormUserPlusMapper.selectOne(new QueryWrapper<Users>().eq("uuid", accounts1.getUserUuid()));

            String token = GetToken.getToken(users1, accounts1);
            String refreshToken = UUID.randomUUID().toString().replace("-", "");
            String tokenId = UUID.randomUUID().toString().replace("-", "");
            //数据库中保存一份token
            String replace1 = UUID.randomUUID().toString().replace("-", "");
            Tokens tokens = new Tokens()
                    .setUuid(users1.getUuid())
                    .setClientType(clientType)
                    .setSource(requestHeader)
                    .setUserTypeValue(requestHeader)
                    .setToken(token)
                    .setTokenId(tokenId)
                    .setRefreshToken(refreshToken)
                    .setUserUuid(users1.getUuid())
                    .setAccountUuid(accounts1.getUuid());
            if (tokensService.findOneByUserUuid(users1.getUuid()) == null||tokensService.findOneByUserUuid(users1.getUuid()).equals("")) {
                tokensService.addOne(tokens);
            } else {
               int i = tokensService.updateByUserUuid(tokens);
                System.out.println(i);
            }
            //redis中保存一份token标识,做用户退出标识
            String flagKey = requestHeader + clientType + token;
//                    System.out.println(flagKey);
            String key = DigestUtils.md5DigestAsHex(flagKey.getBytes());
            stringRedisTemplate.opsForValue().set(key, "1", 7, TimeUnit.DAYS);

            response.setHeader("token", token);
            response.setHeader("refreshToken", refreshToken);
            HashMap<Object, Object> map1 = new HashMap<>();
            map1.put("token", token);
            map1.put("refreshToken", refreshToken);
            map1.put("tokenId", tokenId);

            //登录成功做日志记录
            LoginLogs loginLogs = new LoginLogs();
            loginLogs.setAccountUuid(accounts1.getUuid());
            loginLogs.setClientType(clientType);
            loginLogs.setSource(requestHeader);
            loginLogs.setUserUuid(replace);
            loginLogs.setUserHost(request.getRemoteHost());
            loginLogs.setUserIp(request.getRemoteAddr());
            loginLogs.setUserTypeValue(requestHeader);
            int j = loginLogsService.addOne(loginLogs);

            registerLoginMap.put("tokenInfo", map1);
            Accounts accounts2 = this.accountsService.findOneBywechatOpenid(wechatOpenid);
            Users users = this.usersService.findOneByUuid(accounts2.getUserUuid());
            registerLoginMap.put("userInfo", users);
            return new RetBean(true, 200, "注册并登录成功", registerLoginMap);
        }
            return new RetBean(true, 200, "登录成功", null);
    }

总结

提示:这里对文章进行总结:
例如:以上是小程序授权登录的整个过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值