您的位置:首页 > 移动开发 > 微信开发

微信公众号开发(二)获取用户信息

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;
}


自我感觉应该注意的是这两种方法他们的请求链接是不一样的,一定要注意,要不会犯错。
留作笔记,以备用之。

设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: