公众号微信网页授权

洛塔服务号回复014获取代码。

功能说明

打开网页后,获取到用户的openid、头像、昵称等信息。
scope为snsapi_base时无需授权即可获取到openid。
scope为snsapi_userinfo需要授权,才能获取到头像、昵称等(如果已经关注公众号了,则不需要授权也能获取到)

如果直接进入获取用户信息的页面,一般会显示快照,也就是微信用虚拟的数据先把你网页对应内容填充了,然后点击底部获取信息后再替换为真实的,方便用户提前知道页面的样子,以确认是否还要继续授权。

前置条件

  • 前置条件1:设置与开发–>接口权限–>全局搜索网页授权获取用户基本信息,显示已获得
  • 前置条件2:设置与开发–>公众号设置–>授权回调域名,已经成功设置

链接配置

要想获取到用户信息,首先需要的就是拼接链接,按照微信规则拿到获取用户信息的链接地址。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数说明

  • appid:公众号的APPID
  • redirect_uri:跳转到哪个链接地址的url,用urlEncode处理。这个一般是后台get请求的一个链接,用来得到code等数据,得到之后再重定向到对应网页
  • scope:可选值为snsapi_base(不弹出授权页面,只要openid等) snsapi_userinfo(弹出授权页面,可以拿到昵称、头像等)

按照官方的说明,redirect_uri需要用https的形式,但经过测试,http的也正常。

本例的测试链接:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx276049d6a7551dca&redirect_uri=http%3A%2F%2Ftest.lootaa.com%2Flootaa-wechat%2Fwx14&response_type=code&scope=snsapi_userinfo&state=STATE1#wechat_redirect

用code换取access_token和openid

如果scope是snsapi_base,通过本接口直接获取到openid就可以了。如果scope是snsapi_userinfo,则还需要使用access_token继续请求。

		String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code=" + code + "&grant_type=authorization_code";
		String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		System.out.println(result);
		String accessToken = JSON.parseObject(result).getString("access_token");
		String refreshToken = JSON.parseObject(result).getString("refresh_token");
		String openid = JSON.parseObject(result).getString("openid");
		System.out.println("openid是:" + openid);

检查是否需要刷新access_token

这个情况绝大部分是用不到的,看具体业务了。
如果不需要刷新,继续后续业务逻辑;如果需要刷新,就调用下刷新的接口即可。

		// step3. 检查是否需要刷新access_token(大部分情况都用不到)
		// 检查access_token是否有效,如果无效了就刷新下
		url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
		result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		System.out.println(result);
		if(JSON.parseObject(result).getIntValue("errcode") != 0) {
			// 刷新access_token
			url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + refreshToken;
			result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
			System.out.println(result);
			accessToken = JSON.parseObject(result).getString("access_token");
			refreshToken = JSON.parseObject(result).getString("refresh_token");
			openid = JSON.parseObject(result).getString("openid");
			System.out.println("openid是:" + openid);
		}

拉取用户信息

只有scope是snsapi_userinfo的时候才需要。返回的数据里面也会有unionid,这个一般是比较重要的。

		// step4. 拉取用户信息。 scope是snsapi_userinfo的时候才需要
		url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
		result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		// {"openid":"ohUHp6iaFJq6SISTVwHS5lkb9Pb8","nickname":"神经蛙","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTKGqbSKkB2fTiaK9jq69WAUuAaPgvDcEyocuYDnU7WGicJiaJ5MaWAkIBduClXR5ib4LFkjZrdzgkE9Ug\/132","privilege":[],"unionid":"oxayv6tK4OcYx8pWNpBzp6sNNtGk"}
		System.out.println(result);

重定向页面

获取到用户信息后,可以将页面继续跳转,携带着基本的信息。本例为了方便,直接返回了对应文本。

return "这里可以重定向页面,先处理好用户基本信息后直接跳转。" + result;

如果要返回到一个网页,方式可以可以这样

  • 请求参数除了code和state,再加上一个HttpServletResponse response
  • 用response重定向:response.sendRedirect(“https://blog.youkuaiyun.com/m0_58095675”);

完整代码

package com.lootaa.wechat;

import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;

/**
 * 公众号微信网页授权
 * 前置条件1:设置与开发-->接口权限-->全局搜索网页授权获取用户基本信息,显示已获得
 * 前置条件2:设置与开发-->公众号设置-->授权回调域名,已经成功设置,即获取到数据后要跳转的页面
 */
@RestController
public class Test014 {

	public static final String APPID = "wx276049d6a7551dca";
	public static final String SECRET = "cbe109fdf6f399bd72ed3a4afafa21b1";
	
	/**
	 * 完整项目源码可关注公众号"lootaayun"(洛塔),回复014获取
	 */
	@GetMapping("wx14")
	public String get(String code, String state) throws Exception {
		// step1. 打开链接(替换参数) https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
		// APPID即为公众号的APPID
		// redirect_uri是跳转到哪个链接地址的url,用urlEncode处理。这个一般是后台get请求的一个链接,用来得到code等数据,得到之后再重定向到对应网页
		// scope可选值为snsapi_base(不弹出授权页面,只要openid等) snsapi_userinfo(弹出授权页面,可以拿到昵称、头像等)
		// 本例的测试链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx276049d6a7551dca&redirect_uri=http%3A%2F%2Ftest.lootaa.com%2Flootaa-wechat%2Fwx14&response_type=code&scope=snsapi_userinfo&state=STATE1#wechat_redirect

		System.out.println(code);
		System.out.println(state);
		
		// step2. 用code换取access_token和openid
		String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code=" + code + "&grant_type=authorization_code";
		String result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		System.out.println(result);
		String accessToken = JSON.parseObject(result).getString("access_token");
		String refreshToken = JSON.parseObject(result).getString("refresh_token");
		String openid = JSON.parseObject(result).getString("openid");
		System.out.println("openid是:" + openid);
		
		// step3. 检查是否需要刷新access_token(大部分情况都用不到)
		// 检查access_token是否有效,如果无效了就刷新下
		url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
		result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		System.out.println(result);
		if(JSON.parseObject(result).getIntValue("errcode") != 0) {
			// 刷新access_token
			url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APPID + "&grant_type=refresh_token&refresh_token=" + refreshToken;
			result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
			System.out.println(result);
			accessToken = JSON.parseObject(result).getString("access_token");
			refreshToken = JSON.parseObject(result).getString("refresh_token");
			openid = JSON.parseObject(result).getString("openid");
			System.out.println("openid是:" + openid);
		}
		
		// step4. 拉取用户信息。 scope是snsapi_userinfo的时候才需要
		url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
		result = Jsoup.connect(url).ignoreContentType(true).method(Method.GET).timeout(60000).execute().body();
		// {"openid":"ohUHp6iaFJq6SISTVwHS5lkb9Pb8","nickname":"神经蛙","sex":0,"language":"","city":"","province":"","country":"","headimgurl":"https:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTKGqbSKkB2fTiaK9jq69WAUuAaPgvDcEyocuYDnU7WGicJiaJ5MaWAkIBduClXR5ib4LFkjZrdzgkE9Ug\/132","privilege":[],"unionid":"oxayv6tK4OcYx8pWNpBzp6sNNtGk"}
		System.out.println(result);
		
		// step5. 重定向页面
		// 如果已经关注了公众号,则不需要授权就能获取到用户信息。否则会弹出授权页面让确认
		return "这里可以重定向页面,先处理好用户基本信息后直接跳转。" + result;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lootaa

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值