• 公众号微信网页授权


    洛塔服务号回复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
    
    • 1

    参数说明

    • 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
    
    • 1

    用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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    检查是否需要刷新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);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    拉取用户信息

    只有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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    重定向页面

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

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

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

    • 请求参数除了code和state,再加上一个HttpServletResponse response
    • 用response重定向:response.sendRedirect(“https://blog.csdn.net/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;
    	}
    	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
  • 相关阅读:
    The rise of language models
    Python复习笔记5——常用模块
    探究Linux独立服务器的SSH
    web自动化测试(一)之web控件定位
    PS占用CPU太高,导致电脑异常卡顿
    离线安装 K3S
    反序列化相关
    简单解说思科命令大全
    微服务架构 | 分布式存储 -算法
    代码整洁之道
  • 原文地址:https://blog.csdn.net/m0_58095675/article/details/127706769