当前位置:   article > 正文

微信小程序的登陆及通过openid换取token_微信小程序怎么得到token

微信小程序怎么得到token

1.准备工作:

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

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

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

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

返回的json示例:

  1. {
  2. "openid":"xxxxxx",
  3. "session_key":"xxxxx",
  4. "unionid":"xxxxx",
  5. "errcode":0,
  6. "errmsg":"xxxxx"
  7. }

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

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

  1. public class WxLoginBody {
  2. /** 微信openId */
  3. private String openid;
  4. /** userName */
  5. private String username;
  6. /** 密码 */
  7. private String password;
  8. public String getOpenid() {
  9. return openid;
  10. }
  11. public void setOpenid(String openid) {
  12. this.openid = openid;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. @Override
  27. public String toString() {
  28. return "WxLoginBody{" +
  29. "openid='" + openid + '\'' +
  30. ", username='" + username + '\'' +
  31. ", password='" + password + '\'' +
  32. '}';
  33. }
  34. }

4.登陆方法:

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

  1. /**
  2. * 微信登录
  3. */
  4. @PostMapping("/wxLogin")
  5. public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody) {
  6. //获取token
  7. String token = loginService.wxLogin(wxLoginBody);
  8. AjaxResult ajax = AjaxResult.success();
  9. ajax.put(Constants.TOKEN, token);
  10. return ajax;
  11. }

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

  1. /**
  2. * 微信登录
  3. *
  4. * @param wxLoginBody
  5. * @return
  6. */
  7. public String wxLogin(WxLoginBody wxLoginBody){
  8. String username = wxLoginBody.getUsername();
  9. String openid = wxLoginBody.getOpenid();
  10. //还可以获取其他信息
  11. //依据openid判别数据库中是否有该用户
  12. //依据openid查询用户信息
  13. SysUser wxUser = userMapper.selectUserByOpenId(wxLoginBody.getOpenid());
  14. SysUser appUser = userMapper.selectUserByUserName(username);
  15. //假如查不到,则新增,查到了,则更新
  16. SysUser user = new SysUser();
  17. if (appUser == null ) {
  18. // 新增
  19. throw new ServiceException("用户不存在,请注册!");
  20. } else if (wxUser == null) {
  21. //更新注册的用户
  22. user = appUser;
  23. user.setOpenId(wxLoginBody.getOpenid());
  24. user.setUpdateTime(DateUtils.getNowDate());
  25. //新增 用户
  26. userMapper.updateUser(user);
  27. }
  28. else {
  29. //更新
  30. user = wxUser;
  31. user.setUserName(wxLoginBody.getUsername());
  32. user.setUpdateTime(DateUtils.getNowDate());
  33. userMapper.updateUser(user);
  34. }
  35. //组装token信息 弄一个全局缓存的LoginUser 将openid和user信息存进去
  36. //使得代码通过getLoginUser()的方法进行全局调用
  37. LoginUser loginUser = new LoginUser();
  38. loginUser.setOpenId(wxLoginBody.getOpenid());
  39. //假如有的话设置
  40. loginUser.setUser(user);
  41. loginUser.setUserId(user.getUserId());
  42. // 生成token
  43. return tokenService.createToken(loginUser);
  44. }

6.创建token

  1. /**
  2. * 创建令牌
  3. *
  4. * @param loginUser 用户信息
  5. * @return 令牌
  6. */
  7. public String createToken(LoginUser loginUser)
  8. {
  9. String token = IdUtils.fastUUID();
  10. //String refreshUserToken = IdUtils.fastUUID();
  11. loginUser.setToken(token);
  12. //loginUser.setRefreshUserToken(refreshUserToken);
  13. setUserAgent(loginUser);
  14. refreshToken(loginUser);
  15. Map<String, Object> claims = new HashMap<>();
  16. claims.put(Constants.LOGIN_USER_KEY, token);
  17. //claims.put(Constants.LOGIN_REFRESH_KEY, refreshUserToken);
  18. return createToken(claims);
  19. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/258141
推荐阅读
相关标签
  

闽ICP备14008679号