一.前言
为什么需要OAuth2.0网页授权接口,主要是为了获取微信用户的基本信息(比如用户绑定,用户统计等等)
特别注意:只有认证的服务号有此接口权限
那么订阅号如何实现这个功能呢?可以通过另一个服务号来使用这个接口获取用户基本信息,因为对于未关注此服务号的用户,这个接口同样能够获取到用户基本信息。
二.前期准备
1.我的开发环境与工具说明
开发机器:一台Mac Book Pro
开发工具:
MyElipse
![](https://img.haomeiwen.com/i80578/d2b6e8ab6b8b4692.png)
系统环境:OS X EI Capitan 版本 10.11.5
微信web开发者工具
![](https://img.haomeiwen.com/i80578/7c99a03d99a2144b.png)
注册一个微信公众号(订阅号或者服务号)
https://mp.weixin.qq.com/
主要是用开发者测试帐号测试
![](https://img.haomeiwen.com/i80578/a97f96db8ebb4b76.png)
![](https://img.haomeiwen.com/i80578/287d5827676a5850.png)
![](https://img.haomeiwen.com/i80578/5d347cf0df27829c.png)
注册一个新浪SAE帐号(用来部署JAVA服务)
三.实现过程
流程解析图
![](https://img.haomeiwen.com/i80578/e98974f11ecb2fc9.png)
1.check代码,并部署到新浪SAE
源码地址:https://github.com/andli0626/wx_auth_by_java
通过myelipsecheck源码,并输入自己测试微信号的appID,appsecret
![](https://img.haomeiwen.com/i80578/6dae2872d7ce8d6c.png)
导出war包
![](https://img.haomeiwen.com/i80578/42a69b38f73f9087.png)
![](https://img.haomeiwen.com/i80578/7b6c4780f888c6b8.png)
部署到新浪SAE
![](https://img.haomeiwen.com/i80578/c862bc9301ade998.png)
![](https://img.haomeiwen.com/i80578/95a58344512c51a3.png)
上次war包
![](https://img.haomeiwen.com/i80578/22e2ad268b15b52e.png)
![](https://img.haomeiwen.com/i80578/dddebdb86b1980dc.png)
核心代码
public class OAuthServlet extends HttpServlet {
private static final long serialVersionUID = -1847238807216447030L;
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)) {
String APPID = "";
String SECRET = "";
// 获取网页授权access_token
WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken(APPID, SECRET, code);
// 网页授权接口访问凭证
String accessToken = weixinOauth2Token.getAccessToken();
// 用户标识
String openId = weixinOauth2Token.getOpenId();
// 获取用户信息
SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);
// 设置要传递的参数
request.setAttribute("snsUserInfo", snsUserInfo);
}
// 跳转到index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
web.xml配置
<servlet>
<servlet-name>oauthServlet</servlet-name>
<servlet-class>org.liufeng.course.servlet.OAuthServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>oauthServlet</servlet-name>
<url-pattern>/oauthServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
2.配置授权回调域名
![](https://img.haomeiwen.com/i80578/c492bb7d708df02c.png)
![](https://img.haomeiwen.com/i80578/b51f127c41927ed0.png)
新浪SAE已经提供了测试的域名,还是很方便的
![](https://img.haomeiwen.com/i80578/2f35f84d2aff8e9d.png)
必须配置,如果配置不正确,会导致以下错误
![](https://img.haomeiwen.com/i80578/11ad8bf4d9385fcd.png)
3.构造网页授权链接
![](https://img.haomeiwen.com/i80578/30d5a7e0f829e88f.png)
主要是3个参数:
appid
redirect_uri 授权后重定向的回调链接地址
scope 应用授权作用域
snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid)
snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。
我的新浪SAE重定向页面是:
https://wxauth.applinzi.com/authServlet
那么网页授权链接为
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8015b2139267655d&redirect_uri=https://wxauth.applinzi.com/oauthServlet&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
4.测试方法
第一种:通过微信测试帐号
![](https://img.haomeiwen.com/i80578/7748f0a9234be27c.png)
通过pc端的微信客户端,直接把网页授权链接发送到手机端
![](https://img.haomeiwen.com/i80578/bf72c83f4853abae.png)
![](https://img.haomeiwen.com/i80578/33c35d4106a191be.png)
第二种:通过微信web开发者工具
直接将网页授权链接拷贝到地址栏,访问即可
![](https://img.haomeiwen.com/i80578/c1ff9552bd518fb3.png)
![](https://img.haomeiwen.com/i80578/e202cdb1ad03b5de.png)
常见错误说明
![](https://img.haomeiwen.com/i80578/c3fe7782c0ee1cfa.png)
应该是没有接口权限,需要进行开发者认证
![](https://img.haomeiwen.com/i80578/2e6522b33b1e8b3a.png)
参考资料
《微信公众平台应用开发方法,技巧与案例》
微信公众平台官方指南
https://mp.weixin.qq.com/wiki
网友评论