微信小程序的登陆及通过openid换取token

1.准备工作:

微信小程序需要用到 appid , appSecret,code 。appid , appSecret,这两个参数可通过小程序后台进行查看,code由前端传给后端

2.获取openid。这里的参数中的appid,appSecret 可以在配置文件或常量中写死。openid是微信登陆时用户信息的唯一凭证,同一微信用户在同一微信小程序中的openid是永远不会变的。如果我们有多个小程序给同一批用户使用,则需要使用“unionid“。前端只需要传一个code过来就可以。

我们获取到openid后可根据需要进行存储,换取token。

//小程序获取Openid的实现
    public static JSONObject getOpenidByCodeNew(String appid, String appSecret, String code) {
        StringBuilder builder = new StringBuilder();
        //这里的url 为请求微信小程序登陆接口的url,请求方法为get 可储存在常量中以方便调用
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        // 构建请求参数 
        builder.append(url).append("?").append("appid=").append(appid)
                .append("&secret=").append(appSecret).append("&js_code=").append(code)
                .append("&grant_type=authorization_code");
        System.out.println(builder);
        //通过http请求的工具类发送get请求  并拿到返回结果
        String result = HttpClientUtils.sendGet(builder.toString());
        JSONObject json = JSONObject.parseObject(result);
        return json;
    }

返回的json示例:

{
"openid":"xxxxxx",
"session_key":"xxxxx",
"unionid":"xxxxx",
"errcode":0,
"errmsg":"xxxxx"
}

其中openid是用户在同一小程序的标识,unionid可用作同一开发者的不同小程序(公众号)的用户标识。这两个的作用都类似于userid

3.创建登陆的用户实体类,里边的字段可以根据需要填写,如id,username,nickname,password,openid,unionid,phone,createTime,updateTime等

public class WxLoginBody {

    /** 微信openId */
    private String openid;

    /** userName */
    private String username;

    /** 密码 */
    private String password;

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "WxLoginBody{" +
                "openid='" + openid + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

4.登陆方法:

这里的参数为上文中创建的登陆体,token在service中生成,并将token返回给前端

/**
     * 微信登录
     */
    @PostMapping("/wxLogin")
    public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody) {

            //获取token
            String token = loginService.wxLogin(wxLoginBody);
            AjaxResult ajax = AjaxResult.success();
            ajax.put(Constants.TOKEN, token);
            return ajax;

    }

 5.service实现类,由于我对app做了兼容,需要用户同时拥有username和openid,且需要用户手动注册。若想要无感登陆,则只需判断在用户不存在后直接为其创建用户存入用户表中。

/**
     * 微信登录
     *
     * @param  wxLoginBody
     * @return
     */
    public String wxLogin(WxLoginBody wxLoginBody){


        String username = wxLoginBody.getUsername();
        String openid = wxLoginBody.getOpenid();

        //还可以获取其他信息
        //依据openid判别数据库中是否有该用户
        //依据openid查询用户信息
        SysUser wxUser = userMapper.selectUserByOpenId(wxLoginBody.getOpenid());
        SysUser appUser = userMapper.selectUserByUserName(username);
        //假如查不到,则新增,查到了,则更新

        SysUser user = new SysUser();
        if (appUser == null ) {
            // 新增
            throw new ServiceException("用户不存在,请注册!");

        } else if (wxUser == null) {
            //更新注册的用户
            user = appUser;
            user.setOpenId(wxLoginBody.getOpenid());
            user.setUpdateTime(DateUtils.getNowDate());
            //新增 用户
            userMapper.updateUser(user);
        }

        else {
            //更新
            user = wxUser;
            user.setUserName(wxLoginBody.getUsername());
            user.setUpdateTime(DateUtils.getNowDate());
            userMapper.updateUser(user);
        }
        //组装token信息 弄一个全局缓存的LoginUser 将openid和user信息存进去
        //使得代码通过getLoginUser()的方法进行全局调用
        LoginUser loginUser = new LoginUser();
        loginUser.setOpenId(wxLoginBody.getOpenid());
        //假如有的话设置
        loginUser.setUser(user);
        loginUser.setUserId(user.getUserId());
        // 生成token
        return tokenService.createToken(loginUser);
    }

6.创建token

/**
     * 创建令牌
     *
     * @param loginUser 用户信息
     * @return 令牌
     */
    public String createToken(LoginUser loginUser)
    {
        String token = IdUtils.fastUUID();
        //String refreshUserToken = IdUtils.fastUUID();
        loginUser.setToken(token);
        //loginUser.setRefreshUserToken(refreshUserToken);
        setUserAgent(loginUser);
        refreshToken(loginUser);

        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        //claims.put(Constants.LOGIN_REFRESH_KEY, refreshUserToken);
        return createToken(claims);
    }

7.至此,微信小程序的登陆已完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值