微信公众号开发(二)获取用户信息
2017-10-26 13:41
411 查看
这篇记录下获取用户信息需要注意的地方
通过阅读官方文档以及我个人的实践获取用户信息有以下两种方式:
1:用户关注后直接获取。2:网页授权方式进行获取。Access_Token获取方式
一般有两种获取方式:一个是只通过AppID、AppSecret进行获取的Access_Token,另一种是网页授权时,先通过重定向的链接传递过来的code和AppID、AppSecret参数获取用户的openID,然后使用openID和Access_Token换取用户信息。对应的链接如下:
// 网页授权得到用户基本信息接口 public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN"; // 关注后获取用户基本信息接口 public final static String GetPageUsersUrlSub = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
一、用户关注后直接获取。
方式一,在用户关注公众号后。用户在关注公众号后会向服务器发送关注事件如下:<xml> <ToUserName><![CDATA[gh_30a841420516]]></ToUserName> <FromUserName><![CDATA[oIrD71EUqICgN-Lsra63V7PpLYBE]]></FromUserName> <CreateTime>1508997434789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> <EventKey><![CDATA[]]></EventKey> </xml>如果发送消息会向服务器发送如下:
<xml> <ToUserName><![CDATA[gh_30a841420516]]></ToUserName> <FromUserName><![CDATA[oIrD71EUqICgN-Lsra63V7PpLYBE]]></FromUserName> <CreateTime><![CDATA[1508997410362]]></CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[测试]]></Content> </xml>上面的FromUserName就是 用户的openID,
我们只要获取到Access_Token就可以使用下面的链接来拉取用户信息。
// 关注后获取用户基本信息接口 public final static String GetPageUsersUrlSub = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";获取关注事件的代码:
// 事件类型 String eventType = requestMap.get("Event"); // 关注订阅公众号 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { buffer.append("客户您好!").append("/::)").append("\n"); buffer.append("这是征原电气售后服务公众号。").append("\n\n"); buffer.append("请按照如下格式发送消息给我们:*局 *段 ").append(" "); buffer.append("如 :武局武段"); content = buffer.toString(); //讲用户信息入库。 Map<String,Object> userInfoMap = new HashMap<String, Object>(); userInfoMap = UserinofService.getUserInfoSub(fromUserName, access_token); Date subTime = new Date(); JDBCUtil.getInstance().saveUser(MessageUtil.EVENT_TYPE_SUBSCRIBE, userInfoMap); }
在这段代码
UserinofService.getUserInfoSub(fromUserName, access_token);我们插入了用户的openID和access_token
实现代码如下:
/** * 使用 openID、access_token直接获取用户的信息 * @param openID * @param access_token * @return */ public static Map<String,Object> getUserInfoSub(String openID,String access_token) { String requestUrl = ParamesAPI.GetPageUsersUrlSub.replace("ACCESS_TOKEN", access_token).replace("OPENID", openID); Map<String,Object> result =new HashMap<String,Object>(); try { JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null); //OpenidJSONO可以得到的内容:access_token expires_in refresh_token openid scope String openid =String.valueOf(OpenidJSONO.get("openid")); String nickname=String.valueOf(OpenidJSONO.get("nickname")); String sex=String.valueOf(OpenidJSONO.get("sex"));//用户保存的作用域 String province=String.valueOf(OpenidJSONO.get("province")); String city=String.valueOf(OpenidJSONO.get("city")); String country=String.valueOf(OpenidJSONO.get("country")); String headimgurl=String.valueOf(OpenidJSONO.get("headimgurl")); String privilege=String.valueOf(OpenidJSONO.get("privilege")); String unionid=String.valueOf(OpenidJSONO.get("unionid")); result.put("openid", openid); result.put("nickname", nickname); result.put("sex",sex); result.put("province", province); result.put("city", city); result.put("country", country); result.put("headimgurl", headimgurl); result.put("privilege", privilege); result.put("unionid", unionid); } catch (Exception e) { e.printStackTrace(); } return result; }
二、通过网页授权的方式进行获取
1、这种方式第一点需要先配置网页回调域名:
按照上面的策略配置完回调域名后,最后测试一下是否可用。当然了配置时也会提醒你的。
2、获取code
下面的是我的链接,这个链接配置在自定义菜单的url中即可。 https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx7dd2a9413ea84e&redirect_uri=http%3a%2f%2fmy5vne.natappfree.cc%2fWeChat%2findex.jsp&response_type=code&scope=snsapi_userinfo&state=34#wechat_redirect
官方文档如上所示。
接着编写代码获取code。这个在request.getParameter("code");方法获取即可。
3、通过code、AppID、AppSecret获取openID和AccessToken。
/** * * @param code 识别得到用户id必须的一个值 * 得到网页授权凭证和用户id * @return */ public static Map<String,Object> oauth2GetOpenid(String code) { String appid = ParamesAPI.AppID;//自己的配置appid String appsecret = ParamesAPI.AppSecret;//自己的配置APPSECRET; String requestUrl = ParamesAPI.GetPageAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code); Map<String,Object> result =new HashMap<String,Object>(); try { JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null); //OpenidJSONO可以得到的内容:access_token expires_in refresh_token openid scope String Openid =String.valueOf(OpenidJSONO.get("openid")); String AccessToken=String.valueOf(OpenidJSONO.get("access_token")); TokenThread.getAccessToken().setToken(AccessToken); String Scope=String.valueOf(OpenidJSONO.get("scope"));//用户保存的作用域 String refresh_token=String.valueOf(OpenidJSONO.get("refresh_token")); result.put("Openid", Openid); result.put("AccessToken", AccessToken); result.put("scope",Scope); result.put("refresh_token", refresh_token); } catch (Exception e) { e.printStackTrace(); } return result; }
使用下面的这个链接:
// 网页授权得到用户基本信息接口 public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
上面的链接请求中返回的数据包括了openID和AccessToken。
4、使用openID和AccessToken来拉取用户信息。
实现代码如下:
/** * * @param code 识别得到用户id必须的一个值 * 得到网页授权凭证和用户id * @return */ public static Map<String,Object> getUserInfo(String openID,String access_token) { String requestUrl = ParamesAPI.GetPageUsersUrl.replace("ACCESS_TOKEN", access_token).replace("OPENID", openID); Map<String,Object> result =new HashMap<String,Object>(); try { JSONObject OpenidJSONO=WeixinUtil.HttpRequest(requestUrl, "GET", null); //OpenidJSONO可以得到的内容:access_token expires_in refresh_token openid scope String openid =String.valueOf(OpenidJSONO.get("openid")); String nickname=String.valueOf(OpenidJSONO.get("nickname")); String sex=String.valueOf(OpenidJSONO.get("sex"));//用户保存的作用域 String province=String.valueOf(OpenidJSONO.get("province")); String city=String.valueOf(OpenidJSONO.get("city")); String country=String.valueOf(OpenidJSONO.get("country")); String headimgurl=String.valueOf(OpenidJSONO.get("headimgurl")); String privilege=String.valueOf(OpenidJSONO.get("privilege")); String unionid=String.valueOf(OpenidJSONO.get("unionid")); result.put("openid", openid); result.put("nickname", nickname); result.put("sex",sex); result.put("province", province); result.put("city", city); result.put("country", country); result.put("headimgurl", headimgurl); result.put("privilege", privilege); result.put("unionid", unionid); } catch (Exception e) { e.printStackTrace(); } return result; }
自我感觉应该注意的是这两种方法他们的请求链接是不一样的,一定要注意,要不会犯错。
留作笔记,以备用之。
设置
相关文章推荐
- 微信公众号开发:用户授权获取用户信息
- 微信公众号开发接口列表大全之根据code获取用户基本信息
- 微信公众号开发(四)--微信网页授权,获取用户信息
- 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)
- C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息一
- java微信公众号开发获取微信用户信息
- 微信公众号开发-微信网页授权获取用户openid以及用户信息的步骤
- 微信公众号开发系列-网页授权获取用户基本信息
- C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)
- 微信公众号开发之授权获取用户信息
- 微信公众号开发_如何获取用户信息?
- 微信公众号开发-微信网页授权获取用户openid以及用户信息的步骤
- Django微信公众号开发(一)公众号内网页授权登录后微信获取用户信息
- 微信公众号PHP开发怎么获取用户的基本信息(姓名、性别、年龄等)
- 微信公众号开发之授权获取用户信息
- 微信公众号开发--获取用户信息中文乱码的解决方案
- 微信公众号开发系列-网页授权获取用户基本信息
- 微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆
- php 开发微信公众号杂记————非登录获取用户信息
- 微信公众号开发授权获取用户信息流程?