文档章节

微信OAuth2.0

CurtainRight
 CurtainRight
发布于 2016/03/19 20:51
字数 843
阅读 146
收藏 11

1、配置回调域名(注意必须腾讯能够访问到的外网,也就是回调URL的IP或者域名)

1、通过code换取access_token

/**
	 * 获取网页授权凭证
	 *
	 * @param appId 公众账号的唯一标识
	 * @param appSecret 公众账号的密钥
	 * @param code
	 * @return WeixinAouth2Token
	 */
	public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
		WeixinOauth2Token wat = null;
		// 拼接请求地址
		String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
		requestUrl = requestUrl.replace("APPID", appId);
		requestUrl = requestUrl.replace("SECRET", appSecret);
		requestUrl = requestUrl.replace("CODE", code);
		// 获取网页授权凭证
		JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
		if (null != jsonObject) {
			try {
				wat = new WeixinOauth2Token();
				wat.setAccessToken(jsonObject.getString("access_token"));
				wat.setExpiresIn(jsonObject.getInt("expires_in"));
				wat.setRefreshToken(jsonObject.getString("refresh_token"));
				wat.setOpenId(jsonObject.getString("openid"));
				wat.setScope(jsonObject.getString("scope"));
			} catch (Exception e) {
				wat = null;
				int errorCode = jsonObject.getInt("errcode");
				String errorMsg = jsonObject.getString("errmsg");
				log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
			}
		}
		return wat;
	}

2、拉去用户信息(注意:现在有uniond

/**
	 * 通过网页授权获取用户信息
	 *
	 * @param accessToken 网页授权接口调用凭证
	 * @param openId 用户标识
	 * @return SNSUserInfo
	 */
	@SuppressWarnings( { "deprecation", "unchecked" })
	public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
		SNSUserInfo snsUserInfo = null;
		// 拼接请求地址
		String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
		requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
		// 通过网页授权获取用户信息
		JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);

		if (null != jsonObject) {
			try {
				snsUserInfo = new SNSUserInfo();
				// 用户的标识
				snsUserInfo.setOpenId(jsonObject.getString("openid"));
				// 昵称
				snsUserInfo.setNickname(jsonObject.getString("nickname"));
				// 性别(1是男性,2是女性,0是未知)
				snsUserInfo.setSex(jsonObject.getInt("sex"));
				// 用户所在国家
				snsUserInfo.setCountry(jsonObject.getString("country"));
				// 用户所在省份
				snsUserInfo.setProvince(jsonObject.getString("province"));
				// 用户所在城市
				snsUserInfo.setCity(jsonObject.getString("city"));
				// 用户头像
				snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
				snsUserInfo.setUnionid(jsonObject.getString("unionid"));
				// 用户特权信息
				snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));
			} catch (Exception e) {
				snsUserInfo = null;
				int errorCode = jsonObject.getInt("errcode");
				String errorMsg = jsonObject.getString("errmsg");
				log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
			}
		}
		return snsUserInfo;
	}

3、Servlet验证回调

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("gb2312");
		response.setCharacterEncoding("gb2312");

		// 用户同意授权后,能获取到code
		String code = request.getParameter("code");

		// 用户同意授权
		if (!"authdeny".equals(code)) {
			// 获取网页授权access_token
			WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("appId", "appSecret", code);
			// 网页授权接口访问凭证
			String accessToken = weixinOauth2Token.getAccessToken();
			// 用户标识
			String openId = weixinOauth2Token.getOpenId();
			// 获取用户信息
			SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);

			// 设置要传递的参数
			request.setAttribute("snsUserInfo", snsUserInfo);
		}
		// 跳转到index.jsp
		request.getRequestDispatcher("wechat.jsp").forward(request, response);
	}

4、jsp回调效果页面

<% 
		// 获取由OAuthServlet中传入的参数
		SNSUserInfo user = (SNSUserInfo)request.getAttribute("snsUserInfo"); 
		if(null != user) {
	%>
	<table width="100%" cellspacing="0" cellpadding="0">
		<tr><td width="20%">属性</td><td width="80%">值</td></tr>
		<tr><td>OpenID</td><td><%=user.getOpenId()%></td></tr>
		<tr><td>昵称</td><td><%=user.getNickname()%></td></tr>
		<tr><td>性别</td><td><%=user.getSex()%></td></tr>
		<tr><td>国家</td><td><%=user.getCountry()%></td></tr>
		<tr><td>省份</td><td><%=user.getProvince()%></td></tr>
		<tr><td>城市</td><td><%=user.getCity()%></td></tr>
		<tr><td>头像</td><td><%=user.getHeadImgUrl()%></td></tr>
		<tr><td>特权</td><td><%=user.getPrivilegeList()%></td></tr>
	</table>
	<%
		}
		else 
			out.print("用户不同意授权,未获取到用户信息!");
	%>

5、发送URL到微信(加密回调的URL)

https://open.weixin.qq.com/connect/oauth2/authorize?appid=appId&redirect_uri=你加密后的回调URL&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
/**
	 * URL编码(utf-8)
	 *
	 * @param source
	 * @return
	 */
	public static String urlEncodeUTF8(String source) {
		String result = source;
		try {
			result = java.net.URLEncoder.encode(source, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return result;
	}

注意:

1、这里是先讲解代码,再登录请求

2、这个博客中的微信机器人中包括的登录不是OAuth2.0,我觉得应该是通过微信开放平台的接口(这个登录应该是网站登录,这个OAuth2.0是授权登录(微信客户端))(http://my.oschina.net/biezhi/blog/618493?fromerr=vy6WIPOx)

3、最后一步发送的URL必须在微信中打开

4、Demo: http://yunpan.cn/cLTssBMDMmmBB  访问密码 b34b(我的博客中的微信开放第一步中也有)

© 著作权归作者所有

CurtainRight
粉丝 6
博文 172
码字总数 61177
作品 0
武汉
程序员
私信 提问
加载中

评论(1)

k
kittyzero
你好,代码可以发我下吗?360网盘没法用了。1085836597@qq.com
关于微信里的 oauth2.0协议

微信浏览器的oauth2.0与普通的oauth2.0有区别吗,在跳转的时候它附带上了微信登录者的信息 跳回来的链接假设是url1 访问: 用微信web调试工具发现 之后经过2个微信服务的跳转 第一个 第二个 ...

hphper
2016/05/01
551
2
OAuth2.0认证流程是如何实现的?

导读 大家也许都有过这样的体验,我们登录一些不是特别常用的软件或网站的时候可以使用QQ、微信或者微博等账号进行授权登陆。例如我们登陆豆瓣网的时候,如果不想单独注册豆瓣网账号的话,就...

无敌码农
05/06
0
0
非空/QrF.OAuth.WeChat

QrF.OAuth.WeChat .net Core2.2 WebApi通过OAuth2.0实现微信登录 前言 微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。 微信网页授权是通过OAuth2.0机制实现...

非空
03/13
0
0
获取微信用户信息

微信公众平台开发(76) 获取用户基本信息 本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称、头像、性别、国家、省份、城市、语言。 本文的方法将囊括订阅号和服务号以及自定义菜单...

bengozhong
2016/03/18
125
0
微信接入流程

注册企业服务号并认证,注意:订阅号不支持第三方开发。 登录微信管理后台,在设置》基本配置中绑定开发的网站信息。(注意:接入微信只支持80和443端口,带有端口号的外网地址是不可以接入的...

bluecoffee
2016/04/25
265
0

没有更多内容

加载失败,请刷新页面

加载更多

创龙基于TI TMS320C6748(定点/浮点DSP C674x) + Xilinx Spartan-6 FPGA处理器规格书

由广州创龙自主研发的SOM-TL6748F核心板是一款定点/浮点DSP C674x + Xilinx Spartan-6 FPGA工业级双核核心板,66mm*38.6mm,功耗小、成本低、性价比高。采用沉金无铅工艺的8层板设计,专业的...

Tronlong创龙
29分钟前
6
0
DataV教你如何给可视化应用一键美颜

如果你平时经常接触数据统计、数据展示和决策分析,相信你对DataV一定有所了解。DataV作为一站式实时数据可视化应用搭建工具,拥有图形化、拖拽式、近乎零代码的使用体验,能帮助大家轻松搭建...

阿里云官方博客
31分钟前
6
0
Apache Flink 1.9.0版本新功能介绍

摘要:Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。目前,Apache Flink 1.9.0版本已经...

大涛学长
31分钟前
7
0
网站变成灰色CSS代码

为方便站点哀悼,特提供css滤镜代码,以表哀悼。以下为全站CSS代码。 [css]html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }[/css] 使 用方法:这段代码可以变网...

前端老手
37分钟前
4
0
bootstrap4

临时接手个bootstrap4的项目 ,作下笔记 一.栅格系统 相对于原来的bs3,bs4具有了范围更大的适应区间.在过去的bs3中的xs sm md lg 中,bs4又增加了一个xl这个区间,为超大屏幕做出了适应。  ...

东东笔记
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部