JWT+HttpClient+SpringBoot实现微信登陆获取Token
JWT
JWT(JSON Web Token)是一种用于在网络应用间传递声明的基于JSON的开放标准。JWT通常用于身份验证和授权。它包含了一些被称为声明的信息,这些声明可以被验证和信任。JWT由三部分组成:头部、载荷和签名。头部包含了令牌的元数据,载荷包含了令牌的声明信息,签名用于验证令牌的真实性和完整性。
HttpClient
HttpClient是一个用于发送HTTP请求的开源库,它提供了一个简化的编程接口,用于处理HTTP连接、发送请求和接收响应。它支持多种HTTP方法(如GET、POST、PUT、DELETE等),可以设置请求头、请求体和查询参数,并且可以处理重定向、连接超时、代理等HTTP相关的功能。
功能实现
前期准备
mapper
/**
* 微信用户Mapper接口
*/
public interface WxUserInfoMapper extends BaseMapper<WxUserInfo> {
}
service
/**
* 微信用户Service接口
*/
public interface WxUserInfoService extends IService<WxUserInfo> {
}
service实现类
/**+
* 微信用户serviceImpl
*/
@Service("wxUserInfoService")
public class WxUserInfoServiceImpl extends ServiceImpl<WxUserInfoMapper, WxUserInfo> implements WxUserInfoService {
// 通过@Autowired注解,Spring容器会在运行时自动查找并注入一个匹配类型的WxUserInfoMapper对象,
// 使得WxUserInfoServiceImpl类可以直接使用该对象进行数据库操作,而无需手动创建或获取该对象。
@Autowired
private WxUserInfoMapper wxUserInfoMapper;
}
WxUserInfo 实体
@Data
@TableName("t_wxUserInfo")
public class WxUserInfo {
private Integer id;//用户编号
private String openid;//用户唯一标识
private String nickName="微信用户"; // 用户昵称
private String avatarUrl="default.png"; // 用户头像图片的 URL
@JsonSerialize(using=CustomDateTimeSerializer.class)
private Date registerDate; // 注册日期
@JsonSerialize(using=CustomDateTimeSerializer.class)
private Date lastLoginDate; // 最后登录日期
private String status; // 用户状态 状态 0 可用 1 封禁
@TableField(select = false,exist = false)
private String code;//微信用户code 接收前端传来的
}
功能实现
在application.yml加上小程序登录需要的参数
weixin:
jscode2sessionUrl: https://api.weixin.qq.com/sns/jscode2session
appid: 改成你的
secret: 改成你的
定义Properties属性类来映射上面的配置
@Component
@ConfigurationProperties(prefix = "weixin")
@Data
public class WeixinProperties {
private String jscode2sessionUrl;//登陆凭证校验请求地址
private String appid;//小程序的appid
private String secret;//小程序密钥
}
controller
@RestController
@RequestMapping("/user")
public class WeixinUserController {
@Autowired
private WxUserInfoService wxUserInfoService;
//实体映射
@Autowired
private WeixinProperties weixinProperties;
//httpClient注入
@Autowired
private HttpClientUtil httpClientUtil;
/**
* 微信用户登陆
* @param wxUserInfo
* @return
*/
@RequestMapping("/wxLogin")
public R wxLogin(@RequestBody WxUserInfo wxUserInfo){
/**
* jscode2session拼接
*
* 这段代码是用来获取用户的会话信息的。具体解释如下:
* - `weixinProperties.getJscode2sessionUrl()` :获取微信小程序的jscode2session接口的URL。
* - `weixinProperties.getAppid()` :获取微信小程序的appid。
* - `weixinProperties.getSecret()` :获取微信小程序的密钥。
* - `wxUserInfo.getCode()` :获取用户的登录凭证code。
* - `grant_type=authorization_code` :授权类型为授权码模式。
* 通过将上述参数拼接在一起,形成一个完整的URL,然后发送HTTP请求到该URL,
* 即可获取用户的会话信息,包括用户的唯一标识openid、会话密钥session_key等。
*/
String jscode2sessionUrl=weixinProperties.getJscode2sessionUrl()+"?appid="+weixinProperties.getAppid()+"&secret="+weixinProperties.getSecret()+"&js_code="+wxUserInfo.getCode()+"&grant_type=authorization_code";
System.out.println("jscode2sessionUrl----:"+jscode2sessionUrl);
String result = httpClientUtil.sendHttpGet(jscode2sessionUrl);//通过httpClientUtil工具类发送HTTP GET请求获取结果。
System.out.println("reslut:"+result);
//将请求的结果解析数据为json格式
JSONObject jsonObject = JSON.parseObject(result);
//通过解析后的数据获取openid
String openid = jsonObject.get("openid").toString();
//插入用户到数据库 不存在=》添加 存在=》更新
WxUserInfo resultWxUserInfo = wxUserInfoService.getOne(new QueryWrapper<WxUserInfo>().eq("openid", openid));//根据openid查询当前用户是否存在
if (resultWxUserInfo==null){//resultWxUserInfo为空,表示不存在
System.out.println("用户不存在");
wxUserInfo.setOpenid(openid);//设置openid
wxUserInfo.setRegisterDate(new Date());//设置注册时间=当前日期
wxUserInfo.setLastLoginDate(new Date());//设置最后登陆的日期
wxUserInfoService.save(wxUserInfo);
}else {
System.out.println("用户已存在,执行跟新操作");
resultWxUserInfo.setLastLoginDate(new Date());//更新用户信息
wxUserInfoService.saveOrUpdate(resultWxUserInfo);
}
//status=1 代表此用户已经被封禁
if (resultWxUserInfo!=null && resultWxUserInfo.getStatus().equals("1")){
return R.error(400,"用户被封禁");
}else {//说明该用户存在且账户正常
//利用JWT生成Token
//SystemConstant.JWT_TTL为过期时间
String token = JwtUtils.createJWT(openid, wxUserInfo.getNickName(), SystemConstant.JWT_TTL);
Map<String,Object> reslutMap=new HashMap<>();
reslutMap.put("token",token);
reslutMap.put("openid",openid);
return R.ok(reslutMap);
}
}
}