JWT+HttpClient+SpringBoot实现微信登陆获取Token

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);
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值