OAuth2 - 第三方登录之微信登录

要使用微信登录,需要在微信开放平台去注册开发者资质,只能是企业类型用户。在注册之后会提供微信id微信秘钥,此外还需要申请网站应用名称域名地址。流程参考微信登录功能

一、生成微信登录的二维码

微信提供了生成二维码的固定地址,也提供了将二维码嵌入到自己页面的方式,这里采用前者。
第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login)。然后可以访问https://open.weixin.qq.com/connect/qrconnect这个地址来生成二维码,并且必须附带以下参数:
微信登录二维码参数

书写方法
@GetMapping("/login")
public String login(){
   
   String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
		   "?appid=%s" +
		   "&redirect_uri=%s" +
		   "&response_type=code" +
		   "&scope=snsapi_login" +
		   "&state=%s" +
		   "#wechat_redirect";
	// 对回调地址进行编码 - 该地址在申请微信登录时配置
	String redirect_url = ConstantWxUtils.WX_OPEN_REDIRECT_URL;
	try{
   
		 redirect_url = URLEncoder.encode(redirect_url,"utf-8");
	}catch (Exception e){
   
		e.printStackTrace();
	}
	String url = String.format(
			baseUrl,
			ConstantWxUtils.WX_OPEN_APP_ID,  // 微信ID
			redirect_url,
			"lcy"
	);
	return "redirect:" + url;
}
二、回调方法

第一步会生成一个网页,里面有一个二维码。微信扫描二维码之后,就会跳转到设置的回调地址(方法),我们需要在这个回调方法里处理业务逻辑(获取用户信息、保存用户信息等)。

/**
 * 授权登录之后的回调方法
 * @param code 临时票据
 */
@GetMapping("/callback")
public String callback(String code, String state){
   
	try {
   
		// 拿着code去请求微信的固定地址,得到access_token和openid
		String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
				"?appid=%s" +
				"&secret=%s" +
				"&code=%s" +
				"&grant_type=authorization_code";
		String accessTokenUrl = String.format(
				baseAccessTokenUrl,
				ConstantWxUtils.WX_OPEN_APP_ID,     // 微信id
				ConstantWxUtils.WX_OPEN_APP_SECRET, // 微信秘钥
				code
		);
		// 发送get请求 - 获取的结果是JSON字符串
		String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
		// 将字符串转换成Map对象,获取access_token和openid
		Gson gson = new Gson();
		HashMap mapAccessToken = gson.fromJson(accessTokenInfo, HashMap.class);
		String access_token = (String) mapAccessToken.get("access_token");
		String openid = (String) mapAccessToken.get("openid");
		// 根据openid查询是数据库中是否有相同微信数据
		User user = userService.getOpenIdUser(openid);
		// 获取用户信息
		if (user == null){
   
			String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
					"?access_token=%s" +
					"&openid=%s";
			// 拼接两个参数
			String userInfoUrl = String.format(
					baseUserInfoUrl,
					access_token,
					openid
			);
			// 发送请求
			String userInfo = HttpClientUtils.get(userInfoUrl);
			// 转换成Map对象,并获取昵称、头像等信息
			HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
			String nickname = (String) userInfoMap.get("nickname");
			String headimgurl = (String) userInfoMap.get("headimgurl");

			user = new User();
			user.setOpenid(openid);     // openId
			user.setNickname(nickname);	// 昵称
			user.setAvatar(headimgurl);	// 头像地址
			userService.save(user);   // 保存到数据库
		}
		// 生成Token字符串
		String jwtToken = JwtUtils.getJwtToken(user.getId()
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值