赞
踩
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.至此,微信小程序的登陆已完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。