您好,小程序模板欢迎您。
小程序模板
当前位置 : 首页> 小程序教程> 微信小程序的登陆及通过openid换取token

微信小程序的登陆及通过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 claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        //claims.put(Constants.LOGIN_REFRESH_KEY, refreshUserToken);
        return createToken(claims);
    }

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

联系客服 意见反馈

签到成功!

已连续签到1天,签到3天将获得积分VIP1天

知道了