话不多说,直接上代码!!!
@Override
public Long login(String code) {
//1 获取code值,使用微信工具包对象,获取微信唯一标识openid
String openid = null;
try {
WxMaJscode2SessionResult sessionInfo =
wxMaService.getUserService().getSessionInfo(code);
openid = sessionInfo.getOpenid();
} catch (WxErrorException e) {
throw new RuntimeException(e);
}
//2 根据openid查询数据库表,判断是否第一次登录
//如果openid不存在返回null,如果存在返回一条记录
//select * from customer_info ci where ci.wx_open_id = ''
LambdaQueryWrapper<CustomerInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CustomerInfo::getWxOpenId,openid);
CustomerInfo customerInfo = customerInfoMapper.selectOne(wrapper);
//3 如果第一次登录,添加信息到用户表
if(customerInfo == null) {
customerInfo = new CustomerInfo();
customerInfo.setNickname(String.valueOf(System.currentTimeMillis()));
customerInfo.setAvatarUrl("https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg");
customerInfo.setWxOpenId(openid);
customerInfoMapper.insert(customerInfo);
}
//4 记录登录日志信息
CustomerLoginLog customerLoginLog = new CustomerLoginLog();
customerLoginLog.setCustomerId(customerInfo.getId());
customerLoginLog.setMsg("小程序登录");
customerLoginLogMapper.insert(customerLoginLog);
//5 返回用户id
return customerInfo.getId();
}
-
获取OpenID:
- 通过微信小程序登录后返回的
code
,使用微信开发工具包(假设为wxMaService
)的getUserService().getSessionInfo(code)
方法,向微信服务器请求用户的openid
。openid
是微信为每个用户分配的唯一标识符。 - 如果请求过程中出现
WxErrorException
异常,则抛出运行时异常RuntimeException
。
- 通过微信小程序登录后返回的
-
查询用户信息:
- 使用
LambdaQueryWrapper
构建查询条件,根据获取到的openid
查询数据库中是否已存在对应的用户信息(假设存储在customer_info
表中)。 - 如果查询结果为空(
customerInfo == null
),则表示该用户是首次登录。
- 使用
-
处理首次登录:
- 如果用户是首次登录,则创建一个新的
CustomerInfo
对象,并为其设置默认的昵称(这里使用当前时间戳的字符串形式,实际应用中可能不这样做)、默认头像URL和openid
。 - 将新创建的
CustomerInfo
对象插入到数据库中。
- 如果用户是首次登录,则创建一个新的
-
记录登录日志:
- 无论用户是首次登录还是再次登录,都会创建一个
CustomerLoginLog
对象来记录登录日志。该对象包含用户ID(从CustomerInfo
中获取)和登录信息(这里固定为"小程序登录")。 - 将登录日志插入到数据库中。
- 无论用户是首次登录还是再次登录,都会创建一个
-
返回用户ID:
- 最后,返回用户的ID(无论是首次登录还是已存在的用户)。这个ID可以用于后续的用户认证或数据关联。