wechat-0040,微信公众号,微信网页授权

1. 大体思路,设置好域名,引导用户进入code获取页面,用code换取access_token(和接口调用的acess_token不同),用access_token获取拉取用户信息,跳转到指定页面

具体过程如下

2. 设置好域名,以测试公众号为例

注意域名设置的时候,不能有http:// 具体规则参考微信api


3. 引导用户进入code获取页面,如果有看过我上一篇博客自定义菜单的会发现,我那个时候就做了两个超链接,一个是静默授权,一个用户授权,两者的区别在于scope的不同。这边简述一下

创建两个子菜单,分别指向静默授权和用户授权

// 静默授权
		ChildButton snsapiBaseButton = new ChildButton();
		snsapiBaseButton.setType(MenuParameter.VIEW);
		snsapiBaseButton.setName("静默授权");
		snsapiBaseButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Parameter.APPID
				+ "&redirect_uri=http://" + domainName
				+ "/wechat/snsApiBase&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect");
		// 用户授权
		ChildButton snsapiUserinfoButton = new ChildButton();
		snsapiUserinfoButton.setType(MenuParameter.VIEW);
		snsapiUserinfoButton.setName("用户授权");
		snsapiUserinfoButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Parameter.APPID
				+ "&redirect_uri=http://" + domainName
				+ "/wechat/snsApiUserInfo&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect");
		

注意再用Gson序列化,提交时报40033异常,如果有可以参考上一篇博客,那边提供了解决方法。

4. 获取code

@RequestMapping(value="/snsApiUserInfo")
	public String snsApiUserInfo(HttpServletRequest request, Model model) {
		String code = request.getParameter("code");
	}

5. 获取access_token

private static final String GETACCESSTOKENURL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={appId}&secret={secret}&code={code}&grant_type=authorization_code";
@RequestMapping(value="/snsApiUserInfo")
	public String snsApiUserInfo(HttpServletRequest request, Model model) {
		String code = request.getParameter("code");
		String getAccessTokenurl = GETACCESSTOKENURL.replace("{appId}", Parameter.APPID).replace("{secret}", Parameter.APPSECRET).replace("{code}", code);
		String result = Browser.httpGet(getAccessTokenurl);
		Gson gson = new Gson();
		ReturnMessage returnMessage = gson.fromJson(result, ReturnMessage.class);
		System.out.println(returnMessage);
	}

6. 拉取用户信息

private static final String GETUSERINFOURL = "https://api.weixin.qq.com/sns/userinfo?access_token={accessToken}&openid={openId}&lang=zh_CN";
@RequestMapping(value="/snsApiUserInfo")
	public String snsApiUserInfo(HttpServletRequest request, Model model) {
		String code = request.getParameter("code");
		String getAccessTokenurl = GETACCESSTOKENURL.replace("{appId}", Parameter.APPID).replace("{secret}", Parameter.APPSECRET).replace("{code}", code);
		String result = Browser.httpGet(getAccessTokenurl);
		Gson gson = new Gson();
		ReturnMessage returnMessage = gson.fromJson(result, ReturnMessage.class);
		System.out.println(returnMessage);
		String getUserInfoUrl = GETUSERINFOURL.replace("{accessToken}", returnMessage.getAccessToken()).replace("{openId}", returnMessage.getOpenId());
		String userInfoStr = Browser.httpGet(getUserInfoUrl);
		UserInfo userInfo = gson.fromJson(userInfoStr, UserInfo.class);
		System.out.println(userInfo);
		model.addAttribute(userInfo);
		return "SnsApiUserInfo";
	}

7. 授权后到指定页面

<body>
	<p>用户数据</p>
	openId:<p>${userInfo.openId}</p>
	nickName:<p>${userInfo.nickName}</p>
	sex:<p>${userInfo.sex}</p>
	province:<p>${userInfo.province}</p>
	city:<p>${userInfo.city}</p>
	country:<p>${userInfo.country}</p>
	headImgUrl<p><a href="${userInfo.headImgUrl}">headImgUrl</a></p>
	privilege:<p>${userInfo.privilege}</p>
	unionId<p>${userInfo.unionId}</p>
</body>


猜你喜欢

转载自blog.csdn.net/wrongyao/article/details/80229986