小程序接入微信登录接口 后端最新实现方案(2024-12更新) ...

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

简介

在小程序的项目中,一样平常都需要使用微信登录的接口,微信登录有两个接口,一个是能获取到手机号、微信名、头像等信息的接口,还有一个只能获取到openId这个微信唯一标识符的api接口,在这里,我写的是第二种wx.login()接口。
预备工作(所需参数)

在登录接口,需要在小程序的官网去申请一下appleId和apple Secret,如果没有这两个东西,我们无法完成测试和开发。
业务流程解析

这边放一张微信官方文档的图片。

我们通过这张图片可以知道大体上微信登录是一个什么流程,那么我们在这边文章内里就是实现这几个步骤。

其中下面自界说登录态我是使用了Sa-token这个开源库来进行实现,没有选择使用JWT也是因为Sa-token比较方便。下面是具体的操纵步骤
代码实现

1.通过code+appleid+appSecret获取openId

这这里,我是单独抽出了一个方法来实现Http哀求,因为获取openId需要发送Http哀求给微信小程序端。我创建的这个类是HttpUtils
  1.          /**
  2.      * 通过code获取openid
  3.      *
  4.      * @param code 微信临时凭证
  5.      * @return
  6.      */
  7.     public static String getOpenidByCode(String code) {
  8.         String APPID = "你的APPID";
  9.         String SECRET = "你的appSecret";
  10.         String JSCODE = code;
  11.         String authorization_code = "authorization_code";
  12.         RestTemplate restTemplate = new RestTemplate();
  13.         String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APPID + "&secret=" + SECRET + "&js_code=" + JSCODE + "&grant_type=" + authorization_code;
  14.         String str = restTemplate.getForObject(url, String.class);
  15.         System.out.println(str);
  16.         return str;
  17.     }
复制代码
在这段代码中,只需要更换一下APPID和SECRET这两个参数就可以了,只要微信小程序申请之后就可以获得。
2.根据openId获取用户信息,返回token值

在这接下去代码逻辑中,我们获取到token值之后,要去数据库中寻找用户信息,如果没有注册,那么就去注册,如果注册了就直接返回userInfo信息,然后根据openId使用Sa-token这个库的API来生成token信息并且返回。
  1.          /**
  2.      * 微信登录接口
  3.      * @param code 调用 wx.login() 获取的 临时登录凭证code
  4.      * @return LoginRes
  5.          */
  6.          public Result login(String code) {
  7.         // 获取code
  8.         System.out.println("code:"+code);
  9.         // 根据code获取openId,之后还需要转换
  10.         String str = HttpUtils.getOpenidByCode(code);
  11.         // 将获取的到的json字符串转换为map集合
  12.         // 此处这个方法的作用就是将微信发送过来的JSON数据转换为Map,使用Hutool的类也是可以实现的。
  13.         Map<String, Object> stringToMap = new HashMap<>();
  14.         stringToMap =  FormatConversionUtils.stringToMap(str);
  15.         // 检测如果登陆错误,那么就返回错误信息
  16.         if(stringToMap.containsKey("errmsg")){
  17.             return Result.error(stringToMap.get("errmsg").toString());
  18.         }
  19.         // 获取openid
  20.         final String openId = stringToMap.get("openid").toString();
  21.         // 查询个人信息并存入数据库中并且返回token
  22.         TbUser tbUser = tbUserMapper.selectOne(
  23.                 new QueryWrapper<TbUser>()
  24.                         .eq("openid", openId));
  25.         // 用户不存在,为第一次登陆用户,那么跳转到身份认证界面
  26.         if(tbUser == null){
  27.             System.out.println("创建用户");
  28.             /*
  29.             此处省略创建用户的逻辑,每个人的数据库都不相同
  30.             */
  31.             return Result.success(new LoginRes(getToken(openId), tokenInfo,userinfoDto, 0));
  32.         }
  33.         if(tbUser.getStatus() == 1){
  34.             return Result.error("账号异常,请联系管理员");
  35.         }
  36.         // 账号存在,返回个人账号信息和token
  37.         TbUserinfo res = tbUserinfoMapper.selectOne(
  38.                 new QueryWrapper<TbUserinfo>()
  39.                         .eq("openid", openId));
  40.         UserinfoDto userinfoDto = new UserinfoDto();
  41.         userinfoDto = BeanToBean(res,userinfoDto);
  42.         SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
  43.         return Result.success(new LoginRes(getToken(openId), tokenInfo,userinfoDto,1));
  44.     }
  45.         /*
  46.         这个方法就是使用Sa-token类进行登录,如果对这个方法有疑惑的话可以专门去看一下Sa-token的文档。
  47.         */
  48.         public String getToken(String openId){
  49.         // 生成token
  50.         StpUtil.login(openId);
  51.         // 返回token
  52.         final String token;
  53.         token = StpUtil.getTokenValue();
  54.         return token;
  55.     }
复制代码
这边再展示一下newLogin的类,内里有四个字段,在我这项目中都是前端需要的信息,大家可以根据现实需求进行改变。
  1. @Data
  2. public class LoginRes {
  3.     // 由openid生成的唯一token
  4.     private String token;
  5.     // SaTokenInfo
  6.     private SaTokenInfo tokenInfo;
  7.     // 用户信息
  8.     private UserinfoDto userinfoDto;
  9.     // 0未实名 1已实名
  10.     private Integer status;
  11.     public LoginRes() {
  12.     }
  13.     public LoginRes(String token, SaTokenInfo saTokenInfo,UserinfoDto userinfoDto, Integer status) {
  14.         this.token = token;
  15.         this.tokenInfo = saTokenInfo;
  16.         this.userinfoDto = userinfoDto;
  17.         this.status = status;
  18.     }
  19. }
复制代码
总结

那么通过上面的代码,我们就可以完成微信登录这一接口的开发(简陋版)。如果有什么疑问的话,那么可以批评区复兴这个文章,如果我看到会尽快复兴的,感谢您的观看。
结束语

以上就是我们此次文章所报告小程序接入微信登录API的全部知识了,如果你觉得这篇对文章对你有所帮助的话,不妨给我一个免费的点赞,关注加收藏,这对我的鼓励很大,感谢你对我文章的支持,让我们下一篇文章再见!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表