/**
* 【方法用途】
* 微信公众平台获取用户账户信息
* 【方法说明】
* 第一次请求access_token,作为网页授权接口调用凭证,也用作后续的接口请求凭证,该凭证有效期2小时,可以无限使用,
* 但仅限于本次用户授权登录绑定的CODE。若凭证过期则需要刷新凭证,本方法只作帐户登录前获取微信用户信息,不需要考虑过期问题。
* 第二次请求用于获取用户信息,需要的参数有:第一次请求返回的"access_token"和"openid"。
* 【备注】
* 在发出获取用户信息请求前,我们需要先为微信用户取得授权码:CODE。
* 此处已经在微信公众号菜单中写入授权请求,请求完毕微信接口会跳转到我们的页面,用户进入页面时就已经取得CODE(GET请求)。
* @return
*/
public String requestPermission(){
try {
System.out.println("########getWeChatPermission#########");
String code = httpServletRequest.getParameter("requestCode");
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+"appid=" + WeChatUtil.APPID
+"&secret=" + WeChatUtil.SECRET
+"&code=" + code
+"&grant_type=authorization_code";
String result = HttpRequestUtil.getRequest(url);
System.out.println(result);
JSONObject permission = JSONObject.fromObject(result);
/*
* 判断返回错误信息的话只有两个内容
* 示例:{"errcode":40029,"errmsg":"invalid code"}
*/
if(permission.size()>2){
//网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
//String access_token = permission.getString("access_token");
//access_token接口调用凭证超时时间,单位(秒)
//String expires_in = permission.getString("expires_in");
//用户刷新access_token
//String refresh_token = permission.getString("refresh_token");
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
这里我们要用上面的这个来获取access_token,而前面我获取到的access_token没什么用,就不用管它了
String url1 = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"
+ "&appid=" + WeChatUtil.APPID
+ "&secret=" + WeChatUtil.SECRET;
String tokenInfo = HttpRequestUtil.getRequest(url1);
JSONObject tokenResult = JSONObject.fromObject(tokenInfo);
String access_token = tokenResult.getString("access_token");
//用户唯一标识
String openid = permission.getString("openid");
//用户授权的作用域,使用逗号(,)分隔
//String scope = permission.getString("scope");
String url2 = "https://api.weixin.qq.com/sns/userinfo?"
+ "access_token=" + access_token
+ "&openid=" + openid
+ "&lang=zh_CN";
String customerInfo = HttpRequestUtil.getRequest(url2);
JSONObject info = JSONObject.fromObject(customerInfo);
/*
* 判断返回错误信息的话只有两个内容
* 示例:{"errcode":40029,"errmsg":"invalid code"}
*/
if(info.size()>2){
//用户昵称
//String nickname = info.getString("nickname");
//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
//String sex = info.getString("sex");
//用户个人资料填写的省份
//String province = info.getString("province");
//普通用户个人资料填写的城市
//String city = info.getString("city");
//国家,如中国为CN
//String country = info.getString("country");
//用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。
//若用户更换头像,原有头像URL将失效。
//String headimgurl = info.getString("headimgurl");
//用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
//String privilege = info.getString("privilege");
map = new HashMap<String, Object>();
map.put("flag", "success");
/*
* 只有在开发人员将公众号绑定到微信开放平台帐号后,才会出现该字段。
* unionid是客户在本公众号平台上的唯一标识,是用于本平台登录的最重要参数
*/
map.put("unionid", info.getString("unionid"));
//此处需要对微信传回的“昵称”进行转码,否则会显示乱码
map.put("nickname", new String(info.getString("nickname").getBytes("ISO8859-1"), "UTF-8"));
map.put("sex", info.getString("sex"));
map.put("openid", openid);
System.out.println("unionid:"+info.getString("unionid"));
json = (JSON) JSON.toJSON(map);
return "success";
}else{
map = new HashMap<String, Object>();
map.put("flag", "error");
map.put("errcode", info.getString("errcode"));
json = (JSON) JSON.toJSON(map);
return "error";
}
}else{
map = new HashMap<String, Object>();
map.put("flag", "error");
map.put("errcode", permission.getString("errcode"));
json = (JSON) JSON.toJSON(map);
return "error";
}
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
public static String getRequest(String url) {
//构造HttpClient实例
HttpClient client = new HttpClient();
GetMethod method = null ;
//接收返回结果
String result = null;
try {
//创建GET方法的实例
method = new GetMethod(url);
//执行HTTP GET方法请求
client.executeMethod(method);
//返回处理结果
result = method.getResponseBodyAsString();
if(result.contains("error")){
result=null;
}
} catch (Exception e) {
// 发生网络异常
System.out.println("发生网络异常!");
e.printStackTrace();
return null;
} finally {
//释放链接
if (method != null) {
method.releaseConnection();
}
//关闭HttpClient实例
if (client != null) {
((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown();
client = null;
}
}
return result;
}