简介
在小程序的项目中,一样平常都需要使用微信登录的接口,微信登录有两个接口,一个是能获取到手机号、微信名、头像等信息的接口,还有一个只能获取到openId这个微信唯一标识符的api接口,在这里,我写的是第二种wx.login()接口。
预备工作(所需参数)
在登录接口,需要在小程序的官网去申请一下appleId和apple Secret,如果没有这两个东西,我们无法完成测试和开发。
业务流程解析
这边放一张微信官方文档的图片。
我们通过这张图片可以知道大体上微信登录是一个什么流程,那么我们在这边文章内里就是实现这几个步骤。
其中下面自界说登录态我是使用了Sa-token这个开源库来进行实现,没有选择使用JWT也是因为Sa-token比较方便。下面是具体的操纵步骤
代码实现
1.通过code+appleid+appSecret获取openId
这这里,我是单独抽出了一个方法来实现Http哀求,因为获取openId需要发送Http哀求给微信小程序端。我创建的这个类是HttpUtils
- /**
- * 通过code获取openid
- *
- * @param code 微信临时凭证
- * @return
- */
- public static String getOpenidByCode(String code) {
- String APPID = "你的APPID";
- String SECRET = "你的appSecret";
- String JSCODE = code;
- String authorization_code = "authorization_code";
- RestTemplate restTemplate = new RestTemplate();
- String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APPID + "&secret=" + SECRET + "&js_code=" + JSCODE + "&grant_type=" + authorization_code;
- String str = restTemplate.getForObject(url, String.class);
- System.out.println(str);
- return str;
- }
复制代码 在这段代码中,只需要更换一下APPID和SECRET这两个参数就可以了,只要微信小程序申请之后就可以获得。
2.根据openId获取用户信息,返回token值
在这接下去代码逻辑中,我们获取到token值之后,要去数据库中寻找用户信息,如果没有注册,那么就去注册,如果注册了就直接返回userInfo信息,然后根据openId使用Sa-token这个库的API来生成token信息并且返回。
- /**
- * 微信登录接口
- * @param code 调用 wx.login() 获取的 临时登录凭证code
- * @return LoginRes
- */
- public Result login(String code) {
- // 获取code
- System.out.println("code:"+code);
- // 根据code获取openId,之后还需要转换
- String str = HttpUtils.getOpenidByCode(code);
- // 将获取的到的json字符串转换为map集合
- // 此处这个方法的作用就是将微信发送过来的JSON数据转换为Map,使用Hutool的类也是可以实现的。
- Map<String, Object> stringToMap = new HashMap<>();
- stringToMap = FormatConversionUtils.stringToMap(str);
- // 检测如果登陆错误,那么就返回错误信息
- if(stringToMap.containsKey("errmsg")){
- return Result.error(stringToMap.get("errmsg").toString());
- }
- // 获取openid
- final String openId = stringToMap.get("openid").toString();
- // 查询个人信息并存入数据库中并且返回token
- TbUser tbUser = tbUserMapper.selectOne(
- new QueryWrapper<TbUser>()
- .eq("openid", openId));
- // 用户不存在,为第一次登陆用户,那么跳转到身份认证界面
- if(tbUser == null){
- System.out.println("创建用户");
- /*
- 此处省略创建用户的逻辑,每个人的数据库都不相同
- */
- return Result.success(new LoginRes(getToken(openId), tokenInfo,userinfoDto, 0));
- }
- if(tbUser.getStatus() == 1){
- return Result.error("账号异常,请联系管理员");
- }
- // 账号存在,返回个人账号信息和token
- TbUserinfo res = tbUserinfoMapper.selectOne(
- new QueryWrapper<TbUserinfo>()
- .eq("openid", openId));
- UserinfoDto userinfoDto = new UserinfoDto();
- userinfoDto = BeanToBean(res,userinfoDto);
- SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
- return Result.success(new LoginRes(getToken(openId), tokenInfo,userinfoDto,1));
- }
- /*
- 这个方法就是使用Sa-token类进行登录,如果对这个方法有疑惑的话可以专门去看一下Sa-token的文档。
- */
- public String getToken(String openId){
- // 生成token
- StpUtil.login(openId);
- // 返回token
- final String token;
- token = StpUtil.getTokenValue();
- return token;
- }
复制代码 这边再展示一下newLogin的类,内里有四个字段,在我这项目中都是前端需要的信息,大家可以根据现实需求进行改变。
- @Data
- public class LoginRes {
- // 由openid生成的唯一token
- private String token;
- // SaTokenInfo
- private SaTokenInfo tokenInfo;
- // 用户信息
- private UserinfoDto userinfoDto;
- // 0未实名 1已实名
- private Integer status;
- public LoginRes() {
- }
- public LoginRes(String token, SaTokenInfo saTokenInfo,UserinfoDto userinfoDto, Integer status) {
- this.token = token;
- this.tokenInfo = saTokenInfo;
- this.userinfoDto = userinfoDto;
- this.status = status;
- }
- }
复制代码 总结
那么通过上面的代码,我们就可以完成微信登录这一接口的开发(简陋版)。如果有什么疑问的话,那么可以批评区复兴这个文章,如果我看到会尽快复兴的,感谢您的观看。
结束语
以上就是我们此次文章所报告小程序接入微信登录API的全部知识了,如果你觉得这篇对文章对你有所帮助的话,不妨给我一个免费的点赞,关注加收藏,这对我的鼓励很大,感谢你对我文章的支持,让我们下一篇文章再见! |