文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

结合若依框架实现微信小程序授权登录

2023-08-16 15:05

关注

1 前言

通过若依框架实现微信小程序的授权登录。

原视频链接:

https://www.bilibili.com/video/BV1iM411E7RE/?spm_id_from=333.337.search-card.all.click&vd_source=c15794e732e28886fefab201ec9c6253

1.1 环境准备

1.2 登录流程

流程图如下:
请添加图片描述

2.小程序代码

2.1 新增按钮微信授权登录

2.2 创建wx.Login和wxHandleLogin方法

wxLogin(){  //获取服务商信息  uni.getProvider({  service: "Oauth",  success: (res) => {  console.log(res);  if(~res.provider.indexOf("WeiXin")){  //登录  uni.login({  provider: "WeiXin",  success: (loginRes) => {  console.log("登录",loginRes);  this.wxLoginForm.code = loginRes.code;  }  })  }  }  })  },

3.后端代码

3.1 yml配置文件中新增微信小程序id和秘钥

public class WxAppConfig {        private String appfId;        private String appfSecret;    public String getAdppId() {        return appId;    }    public void setAppdId(String appId) {        this.appId = appId;    }    public String getAppSecret() {        return appSecret;    }    public void setAppSecret(String appSecret) {        this.appSecret = appSecret;    }}

3.2 在数据库中新增open_id和union_id字段

在这里插入图片描述

3.3 在SysUser中新增两个字段

    private String unionId;        private String openId;    public String getUnionId() {        return unionId;    }    public void setUnionId(String unionId) {        this.unionId = unionId;    }    public String getOpenId() {        return openId;    }    public void setOpenId(String openId) {        this.openId = openId;    }

3.4 SysUserMapper新增selectWxUserByOpenId

     public SysUser selectWxUserByOpenId(String openId);

3.5 SysLoginController新增接口wxLogin

@RestControllerpublic class SysLoginController{@PostMapping("/wxLogin")    public AjaxResult wxLogin(@RequestBody WxLoginBody wxLoginBody)    {        logger.info("登录参数:" + JSON.toJSONString(wxLoginBody));        String code = wxLoginBody.getCode();        //秘钥        String encryptedIv = wxLoginBody.getEncryptedIv();        //加密数据        String encryptedData = wxLoginBody.getEncryptedData();        //想微信服务器发送请求获取用户信息        String url = "https://api.weixin.qq.com/snns/jscode2session?appid=" + wxAppConfig.getAppId() + "&secret=" + wxAppConfig.getAppSecret() + "&js_code=" + code + "&grant_type=authorizatinon_code";        String res = restTemplate.getForObject(url, String.class);        JSONObject jsonObject = JSONObject.parseObject(res);        //获取session_key和openid        String sessionKey = jsonObject.getString("session_key");        String openid = jsonObject.getString("openid");        //解密        String decryptResult = "";        try {            //如果没有绑定微信开放平台,解析结果是没有unionid的。            decryptResult = decrypt(sessionKey,encryptedIv,encryptedData);        } catch (Exception e) {            e.printStackTrace();            return AjaxResult.error("微信登录失败!");        }        if (StringUtils.hasText(decryptResult)){            //如果解析成功,获取token            String token = loginService.wxLogin(decryptResult);            AjaxResult ajax = AjaxResult.success();            ajax.put(Constants.TOKEN, token);            return ajax;        }else{            return AjaxResult.error("微信登录失败!");        }    }    }}

3.6 SysLoginService新增wxLogin方法

    public String wxLogin(String decryptResult){        //字符串转json        JSONObject jsonObject = JSONObject.parseObject(decryptResult);//        String unionid = jsonObject.getString("unionid");        String openId = jsonObject.getString("openId");        //获取nickName        String nickName = jsonObject.getString("nickName");        //获取头像        String avatarUrl = jsonObject.getString("avatarUrl");        //还可以获取其他信息        //根据openid判断数据库中是否有该用户        //根据openid查询用户信息        SysUser wxUser = userMapper.selectWxUserByOpenId(openId);        //如果查不到,则新增,查到了,则更新        SysUser user = new SysUser();        if (wxUser == null) {            // 新增            user.setUserName(IdUtils.fastSimpleUUID());            user.setNickName(nickName);            user.setAvatar(avatarUrl);            wxUser.setUnionId(unionid);            user.setOpenId(openId);            user.setCreateTime(DateUtils.getNowDate());            //新增 用户            userMapper.insertUser(user);        }else {            //更新            user = wxUser;            user.setNickName(nickName);            user.setAvatar(avatarUrl);            user.setUpdateTime(DateUtils.getNowDate());            userMapper.updateUser(user);        }        //组装token信息        LoginUser loginUser = new LoginUser();        loginUser.setOpenId(openId);        //如果有的话设置        loginUser.setUser(user);        loginUser.setUserId(user.getUserId());        // 生成token        return tokenService.createToken(loginUser);    }

来源地址:https://blog.csdn.net/weixin_43684214/article/details/129103891

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯