网页授权获取用户基本信息
https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
这个应用是 在微信客户端中访问第三方网页时,如果想要获取用户的一些信息,可以通过这个授权方式获取。
如果不想获取用户的一些信息,则不需要授权。
授权分为两种:一种是静默方式(snsapi_base),另一种是需要提示用户进行点击(snsapi_userinfo )
静默方式获取的用户信息少,仅有openid
另一种方式获取的用户信息多,比如性别、昵称等
静默方式可以直接进入到业务页面,体验较好,如果事先关注过公众号,则可以用这种方式(可以用openid自行查询其他信息)
一个实际应用中的例子:
在微信公众号中有一个菜单,对应链接为
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxc37d78660d2a1328&redirect_uri=http://wx.hehe120.com/wxplatform/menu2quickConsult.html?response_type=code&scope=snsapi_base&state=gh_045a258c1199&connect_redirect=1#wechat_redirect
redirect_uri 对应的就是授权回调域名
如果设置 wx.hehe120.com
是可以对下面的路径进行授权的http://wx.hehe120.com/wxplatform/
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址,请使用urlencode对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
实际当中的步骤
1. 点击这个菜单
2. 这个是静默授权方式,会返回一个 code
3. 拿着这个code 和微信公众号的一些信息获取token
请求:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
响应:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
下面这个是实际项目中如何解析出上面的结果的openid
public static String getOpenID(SysWx sysWx, String code) { // 用户同意授权 String url = WxConstants.AUTHORIZE_URI + "appid=" + sysWx.getAppId() + "&secret=" + sysWx.getSecret() + "&code=" + code + "&grant_type=authorization_code"; String jsonStr = HttpUtils.get(url); JSONObject jsonObject = null; try { jsonObject = JSONObject.fromObject(jsonStr); } catch (JSONException e) { logger.error("获取用户opendId 失败"); } String openid = null; if (jsonObject != null && jsonObject.containsKey("openid")) { openid = jsonObject.getString("openid"); } if (openid == null) { logger.error("获取微信openid 失败,null"); } else { logger.info("获取微信openid:" + openid); } return openid; }
拿到openid 之后就万事大吉了!