当前位置:网站首页>微信小程序获取用户手机号码
微信小程序获取用户手机号码
2022-08-03 11:05:00 【詹Sir(开源字节)】
我们在做小程序开发的过程中,经常会涉及到用户认证的问题,最普遍的就是获取用户的手机号码一键登录
获取用户手机号码 分为以下几步:
1、第一点击页面获取授权code
2、第二获取小程序token
3、第三根据token与code获取手机号码
4、执行登录认证逻辑

接下来我们来实现以上四步
首先先看前端页面获取code与手机号码:
<button open-type="getPhoneNumber" @getphonenumber="weChatLogin" class="clearBtn">
<view class="loginType">
<view class="item">
<view class="icon"><u-icon size="60" name="weixin-fill" color="rgb(83,194,64)"></u-icon></view>
微信
</view>
</view>
</button>
weChatLogin(e){
uni.showLoading({title:"登录中....",mask:true})
let code= e.detail.code;
let url = "/api/miniWxApi/getPhoneNum?code="+code;
this.$u.get(url).then(res => {
let phoneNum = res.phoneNum
let weChatUrl = "/api/weChatLogin";
this.$u.post(weChatUrl,{
username: phoneNum,
code: code
}).then(data => {
uni.hideLoading();
// 登录成功初始化token与用户信息
this.$u.vuex('vuex_token', data.token);
this.$u.vuex('vuex_user', data.loginUser);
uni.switchTab({
url: '/pages/index/index'
})
});
});
},
接下来我们看后端获取token与认证逻辑:
/**
* 获取用户手机号码
*/
@GetMapping("/getPhoneNum")
public AjaxResult getPhoneNum(String code){
AjaxResult ajax = AjaxResult.success();
// Object token = getAccessToken();
Object token = WxUtil.obtainAccessToken(APPID, SECRET);
String phoneNum = WxUtil.getPhoneNum(token,code);
ajax.put("phoneNum",phoneNum);
return ajax;
}
/**
* 获取AccessToken
*/
@GetMapping("/getAccessToken")
public AjaxResult getAccessToken(){
AjaxResult ajax = AjaxResult.success();
Object token = redisCache.getCacheObject(accessTokenKey);
if(StringUtils.isNull(token)){
token = WxUtil.obtainAccessToken(APPID, SECRET);
redisCache.setCacheObject(accessTokenKey,token,30,TimeUnit.MINUTES);
}
ajax.put(accessTokenKey,token);
return ajax;
}
/**
* 微信小程序注册/登录
*/
@PostMapping("/weChatLogin")
public AjaxResult weChatLogin(HttpServletRequest request,@RequestBody LoginBody loginBody)
{
AjaxResult ajax = AjaxResult.success();
String msg = "登录成功";
if (StringUtils.isEmpty(loginBody.getUsername())){
msg = "用户名不能为空";
return error(msg);
}
// 判断是否为新用户
SysUser sysUser = userService.selectUserByUserName(loginBody.getUsername());
// 不是新用户,创建用户
if(sysUser == null){
sysUser = new SysUser();
sysUser.setUserName(loginBody.getUsername());
sysUser.setNickName(loginBody.getUsername());
sysUser.setPassword(loginBody.getUsername());
sysUser.setPhonenumber(loginBody.getUsername());
sysUser.setPassword(SecurityUtils.encryptPassword(loginBody.getUsername()));
sysUser.setDeptId(110L);
Long[] postIds = new Long[1];
postIds[0] = 8L;
Long[] roleIds = new Long[1];
roleIds[0] = 5L;
sysUser.setPostIds(postIds);
sysUser.setRoleIds(roleIds);
// 保存完用户后,还需要设置用户的角色,部门与岗位
userService.insertUser(sysUser);
}
// 生成token
LoginUser loginUser = new LoginUser(sysUser,null);
String token = tokenService.createToken(loginUser);
ajax.put(Constants.TOKEN, token);
ajax.put("loginUser", loginUser);
return ajax;
}
如上步骤即可实现uniapp微信小程序登录,开源字节坚持写优雅的代码,以上代码可在开源字节低代码平台中免费获取
如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/209.html
边栏推荐
- 深度学习经典网络 -- Inception系列(稀疏结构)
- 卷起来!阿里高工携18位高级架构师耗时57天整合的1658页面试总结
- 使用.NET简单实现一个Redis的高性能克隆版(一)
- FR9811S6 SOT-23-6 23V, 2A Synchronous Step-Down DC/DC Converter
- 在 Chrome 开发者工具里通过 network 选项模拟网站的离线访问模式
- Why is the new earth blurred, in-depth analysis of white balls, viewing pictures, and downloading problems
- 【LeetCode—第2题 两数之和 代码详解 】附有源码,可直接复制
- 怎么在外头使用容器里php命令
- Lease recovery system based on PHP7.2+MySQL5.7
- 再谈“雷克萨斯”安全装置失效!安全手册疑点重重,网友:细思极恐
猜你喜欢

Activiti产生的背景和作用

fast planner中拓扑路径搜索

FR9811S6 SOT-23-6 23V, 2A Synchronous Step-Down DC/DC Converter

3分钟实现内网穿透(基于ngrok实现)

numpy

如何通过DBeaver 连接 TDengine?

for in 和 for of的区别

ETL data cleaning case in MapReduce

Who is more popular for hybrid products, depending on technology or market?

"Global Digital Economy Conference" landed in N World, Rongyun provides communication cloud service support
随机推荐
下午见!2022京东云数据库新品发布会
Win10/11 删除文件资源管理器左侧栏目文件夹
卷起来!阿里高工携18位高级架构师耗时57天整合的1658页面试总结
Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...
LeetCode 899 Ordered queue [lexicographical order] HERODING's LeetCode road
Matplotlib
MapReduce中ETL数据清洗案例
巴比特 | 元宇宙每日必读:玩家离场,平台关停,数字藏品市场正逐渐降温,行业的未来究竟在哪里?...
Web Server 设置缓存响应字段的一些推荐方案
LyScript implements memory stack scanning
C - 为什么指针常常初始化为 NULL?
VRRP协议的作用及VRRP+OSPF配置方法
数据库一席谈:打造开源的数据生态,支撑产业数字化浪潮
袋鼠云思枢:数驹 DTengine,助力企业构建高效的流批一体数据湖计算平台
【无标题】函数,对象,方法的区别
MySQL database combat (1)
记住用户名案例(js)
[Bubble sort and odd-even sorting]
build --repot
Classical Architecture and Memory Classification of Embedded Software Components