在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。

公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

开发者可通过OpenID来获取用户基本信息。请使用https协议。

我们可以看看官方的文档:获取用户的基本信息。

接口调用请求说明

http请求方式: GEThttps://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

参数 是否必须 说明
access_token 调用接口凭证
openid 普通用户的标识,对当前公众号唯一
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{"subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1, "language": "zh_CN", "city": "广州", "province": "广东", "country": "中国", "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", "subscribe_time": 1382694957,"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL""remark": "","groupid": 0
}

参数说明

参数 说明
subscribe 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
openid 用户的标识,对当前公众号唯一
nickname 用户的昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
city 用户所在城市
country 用户所在国家
province 用户所在省份
language 用户的语言,简体中文为zh_CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
subscribe_time 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)
remark 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
groupid 用户所在的分组ID

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

根据上面的信息,我们定义一个用户信息类来存放用户的基本信息。

[java] view plain copyprint?
  1. package com.howin.pojo;
  2. /**
  3. * 类名: WeixinUserInfo </br>
  4. * 描述: 微信用户的基本信息 </br>
  5. * 开发人员: howin </br>
  6. * 创建时间: 2016-08-19 </br>
  7. * 发布版本:V1.0 </br>
  8. */
  9. public class WeixinUserInfo {
  10. // 用户的标识
  11. private String openId;
  12. // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
  13. private int subscribe;
  14. // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
  15. private String subscribeTime;
  16. // 昵称
  17. private String nickname;
  18. // 用户的性别(1是男性,2是女性,0是未知)
  19. private int sex;
  20. // 用户所在国家
  21. private String country;
  22. // 用户所在省份
  23. private String province;
  24. // 用户所在城市
  25. private String city;
  26. // 用户的语言,简体中文为zh_CN
  27. private String language;
  28. // 用户头像
  29. private String headImgUrl;
  30. public String getOpenId() {
  31. return openId;
  32. }
  33. public void setOpenId(String openId) {
  34. this.openId = openId;
  35. }
  36. public int getSubscribe() {
  37. return subscribe;
  38. }
  39. public void setSubscribe(int subscribe) {
  40. this.subscribe = subscribe;
  41. }
  42. public String getSubscribeTime() {
  43. return subscribeTime;
  44. }
  45. public void setSubscribeTime(String subscribeTime) {
  46. this.subscribeTime = subscribeTime;
  47. }
  48. public String getNickname() {
  49. return nickname;
  50. }
  51. public void setNickname(String nickname) {
  52. this.nickname = nickname;
  53. }
  54. public int getSex() {
  55. return sex;
  56. }
  57. public void setSex(int sex) {
  58. this.sex = sex;
  59. }
  60. public String getCountry() {
  61. return country;
  62. }
  63. public void setCountry(String country) {
  64. this.country = country;
  65. }
  66. public String getProvince() {
  67. return province;
  68. }
  69. public void setProvince(String province) {
  70. this.province = province;
  71. }
  72. public String getCity() {
  73. return city;
  74. }
  75. public void setCity(String city) {
  76. this.city = city;
  77. }
  78. public String getLanguage() {
  79. return language;
  80. }
  81. public void setLanguage(String language) {
  82. this.language = language;
  83. }
  84. public String getHeadImgUrl() {
  85. return headImgUrl;
  86. }
  87. public void setHeadImgUrl(String headImgUrl) {
  88. this.headImgUrl = headImgUrl;
  89. }
  90. }
package com.howin.pojo;/**
* 类名: WeixinUserInfo </br>
* 描述: 微信用户的基本信息 </br>
* 开发人员: howin </br>
* 创建时间: 2016-08-19 </br>
* 发布版本:V1.0 </br>*/
public class WeixinUserInfo {// 用户的标识private String openId;// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息private int subscribe;// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间private String subscribeTime;// 昵称private String nickname;// 用户的性别(1是男性,2是女性,0是未知)private int sex;// 用户所在国家private String country;// 用户所在省份private String province;// 用户所在城市private String city;// 用户的语言,简体中文为zh_CNprivate String language;// 用户头像private String headImgUrl;public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public int getSubscribe() {return subscribe;}public void setSubscribe(int subscribe) {this.subscribe = subscribe;}public String getSubscribeTime() {return subscribeTime;}public void setSubscribeTime(String subscribeTime) {this.subscribeTime = subscribeTime;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public String getHeadImgUrl() {return headImgUrl;}public void setHeadImgUrl(String headImgUrl) {this.headImgUrl = headImgUrl;}
}

我们先来看看获取用户信息的接口:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

根据分析,获取用户的基本信息需要一个token。

[java] view plain copyprint?
  1. package com.howin.pojo;
  2. /**
  3. * 类名: TOKEN </br>
  4. * 描述: 凭证 </br>
  5. * 开发人员: howin </br>
  6. * 创建时间: 2016-08-19 </br>
  7. * 发布版本:V1.0 </br>
  8. */
  9. public class Token {
  10. // 接口访问凭证֤
  11. private String accessToken;
  12. // 凭证有效期单位:second
  13. private int expiresIn;
  14. public String getAccessToken() {
  15. return accessToken;
  16. }
  17. public void setAccessToken(String accessToken) {
  18. this.accessToken = accessToken;
  19. }
  20. public int getExpiresIn() {
  21. return expiresIn;
  22. }
  23. public void setExpiresIn(int expiresIn) {
  24. this.expiresIn = expiresIn;
  25. }
  26. }
package com.howin.pojo;/**
* 类名: TOKEN </br>
* 描述: 凭证 </br>
* 开发人员: howin </br>
* 创建时间: 2016-08-19 </br>
* 发布版本:V1.0 </br>*/
public class Token {// 接口访问凭证֤private String accessToken;// 凭证有效期单位:secondprivate int expiresIn;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}
}

https请求,需要的信任管理器

[java] view plain copyprint?
  1. package com.howin.util;
  2. import java.security.cert.CertificateException;
  3. import java.security.cert.X509Certificate;
  4. import javax.net.ssl.X509TrustManager;
  5. /**
  6. * 类名: MyX509TrustManager </br>
  7. * 描述:信任管理器 </br>
  8. * 开发人员: howin </br>
  9. * 创建时间: 2016-08-19 </br>
  10. * 发布版本:V1.0 </br>
  11. */
  12. /*
  13. * 证书管理器的作用是让它新人我们指定的证书,
  14. * 此类中的代码意味着信任所有的证书,不管是不是权威机构颁发的。
  15. */
  16. public class MyX509TrustManager implements X509TrustManager {
  17. // 检查客户端证书
  18. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  19. }
  20. // 检查服务器端证书
  21. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  22. }
  23. // 返回受信任的X509证书数组
  24. public X509Certificate[] getAcceptedIssuers() {
  25. return null;
  26. }
  27. }
package com.howin.util;import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 类名: MyX509TrustManager </br>
* 描述:信任管理器 </br>
* 开发人员: howin </br>
* 创建时间: 2016-08-19 </br>
* 发布版本:V1.0 </br>*/
/** 证书管理器的作用是让它新人我们指定的证书,* 此类中的代码意味着信任所有的证书,不管是不是权威机构颁发的。*/
public class MyX509TrustManager implements X509TrustManager {// 检查客户端证书public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 检查服务器端证书public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 返回受信任的X509证书数组public X509Certificate[] getAcceptedIssuers() {return null;}
}

封装了一个公共类:

[java] view plain copyprint?
  1. package com.howin.util;
  2. import java.io.BufferedReader;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.ConnectException;
  8. import java.net.URL;
  9. import java.net.URLEncoder;
  10. import java.security.MessageDigest;
  11. import java.util.ArrayList;
  12. import java.util.Collections;
  13. import java.util.Comparator;
  14. import java.util.Date;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Random;
  19. import javax.net.ssl.HttpsURLConnection;
  20. import javax.net.ssl.SSLContext;
  21. import javax.net.ssl.SSLSocketFactory;
  22. import javax.net.ssl.TrustManager;
  23. import net.sf.json.JSONException;
  24. import net.sf.json.JSONObject;
  25. import org.slf4j.Logger;
  26. import org.slf4j.LoggerFactory;
  27. import com.howin.pojo.Menu;
  28. import com.howin.pojo.Token;
  29. /**
  30. * 类名: CommonUtil </br>
  31. * 描述: 通用工具类 </br>
  32. * 开发人员: howin </br>
  33. * 创建时间: 2016-08-19 </br>
  34. * 发布版本:V1.0 </br>
  35. */
  36. public class CommonUtil {
  37. private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
  38. private static long tokenTime = 0;
  39. private static long jsTicketTime = 0;
  40. private static Token token = null;
  41. private static String ticket = null;
  42. // 凭证获取(GET)
  43. public final static String token_url = “https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET”;
  44. /**
  45. * 发送https请求
  46. *
  47. * @param requestUrl 请求地址
  48. * @param requestMethod 请求方式(GET、POST)
  49. * @param outputStr 提交的数据
  50. * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  51. */
  52. public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
  53. JSONObject jsonObject = null;
  54. try {
  55. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  56. TrustManager[] tm = { new MyX509TrustManager() };
  57. SSLContext sslContext = SSLContext.getInstance(”SSL”, “SunJSSE”);
  58. sslContext.init(null, tm, new java.security.SecureRandom());
  59. // 从上述SSLContext对象中得到SSLSocketFactory对象
  60. SSLSocketFactory ssf = sslContext.getSocketFactory();
  61. URL url = new URL(requestUrl);
  62. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  63. conn.setSSLSocketFactory(ssf);
  64. conn.setDoOutput(true);
  65. conn.setDoInput(true);
  66. conn.setUseCaches(false);
  67. // 设置请求方式(GET/POST)
  68. conn.setRequestMethod(requestMethod);
  69. // 当outputStr不为null时向输出流写数据
  70. if (null != outputStr) {
  71. OutputStream outputStream = conn.getOutputStream();
  72. // 注意编码格式
  73. outputStream.write(outputStr.getBytes(”UTF-8”));
  74. outputStream.close();
  75. }
  76. // 从输入流读取返回内容
  77. InputStream inputStream = conn.getInputStream();
  78. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, “utf-8”);
  79. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  80. String str = null;
  81. StringBuffer buffer = new StringBuffer();
  82. while ((str = bufferedReader.readLine()) != null) {
  83. buffer.append(str);
  84. }
  85. // 释放资源
  86. bufferedReader.close();
  87. inputStreamReader.close();
  88. inputStream.close();
  89. inputStream = null;
  90. conn.disconnect();
  91. jsonObject = JSONObject.fromObject(buffer.toString());
  92. } catch (ConnectException ce) {
  93. log.error(”连接超时:{}”, ce);
  94. } catch (Exception e) {
  95. log.error(”https请求异常:{}”, e);
  96. }
  97. return jsonObject;
  98. }
  99. /**
  100. * 获取接口访问凭证
  101. *
  102. * @param appid 凭证
  103. * @param appsecret 密钥
  104. * @return
  105. */
  106. public static Token getToken(String appid, String appsecret) {
  107. // 第三方用户唯一凭证
  108. appid = ”wx7504778ec4f99579”;
  109. // 第三方用户唯一凭证密钥
  110. appsecret = ”b77fba754559304c833a258f4a6f1853”;
  111. long now = new Date().getTime();
  112. if(tokenTime!=0&&now-tokenTime<7000000){//token有效时间 7e6 毫秒
  113. return token;
  114. }
  115. String requestUrl = token_url.replace(”APPID”, appid).replace(“APPSECRET”, appsecret);
  116. // 发起GET请求获取凭证
  117. JSONObject jsonObject = httpsRequest(requestUrl, ”GET”, null);
  118. if (null != jsonObject) {
  119. try {
  120. token = new Token();
  121. token.setAccessToken(jsonObject.getString(”access_token”));
  122. token.setExpiresIn(jsonObject.getInt(”expires_in”));
  123. tokenTime = now;
  124. } catch (JSONException e) {
  125. token = null;
  126. // 获取token失败
  127. log.error(”获取token失败 errcode:{} errmsg:{}”, jsonObject.getInt(“errcode”), jsonObject.getString(“errmsg”));
  128. }
  129. }
  130. return token;
  131. }
  132. /**
  133. * 获取jsapi_ticket访问凭证
  134. * */
  135. public static String getJsTicket(){
  136. long now = new Date().getTime();
  137. if(jsTicketTime!=0&&now-jsTicketTime<7000000){//token有效时间 7e6 毫秒
  138. return ticket;
  139. }
  140. //得到token
  141. String accessToken = getToken(null,null).getAccessToken();
  142. //GET方法获得jsapi_ticket
  143. String requestUrl = ”https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi”
  144. .replace(”ACCESS_TOKEN”,accessToken);
  145. // 发起GET请求获取凭证
  146. JSONObject jsonObject = httpsRequest(requestUrl, ”GET”, null);
  147. if(jsonObject!=null){
  148. ticket = jsonObject.getString(”ticket”);
  149. jsTicketTime = now;
  150. }
  151. return ticket;
  152. }
  153. /**
  154. * URL编码(utf-8)
  155. *
  156. * @param source
  157. * @return
  158. */
  159. public static String urlEncodeUTF8(String source) {
  160. String result = source;
  161. try {
  162. result = java.net.URLEncoder.encode(source, ”utf-8”);
  163. } catch (UnsupportedEncodingException e) {
  164. e.printStackTrace();
  165. }
  166. return result;
  167. }
  168. /**
  169. * 根据内容类型判断文件扩展名
  170. *
  171. * @param contentType 内容类型
  172. * @return
  173. */
  174. public static String getFileExt(String contentType) {
  175. String fileExt = ”“;
  176. if (“image/jpeg”.equals(contentType))
  177. fileExt = ”.jpg”;
  178. else if (“audio/mpeg”.equals(contentType))
  179. fileExt = ”.mp3”;
  180. else if (“audio/amr”.equals(contentType))
  181. fileExt = ”.amr”;
  182. else if (“video/mp4”.equals(contentType))
  183. fileExt = ”.mp4”;
  184. else if (“video/mpeg4”.equals(contentType))
  185. fileExt = ”.mp4”;
  186. return fileExt;
  187. }
  188. // 菜单创建(POST) 限100(次/天)
  189. public static String menu_create_url = “https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN”;
  190. /**
  191. * 创建菜单
  192. *
  193. * @param menu 菜单实例
  194. * @param accessToken 有效的access_token
  195. * @return 0表示成功,其他值表示失败
  196. */
  197. public static int createMenu(Menu menu, String accessToken) {
  198. int result = 0;
  199. // 拼装创建菜单的url
  200. String url = menu_create_url.replace(”ACCESS_TOKEN”, accessToken);
  201. // 将菜单对象转换成json字符串
  202. String jsonMenu = JSONObject.fromObject(menu).toString();
  203. // 调用接口创建菜单
  204. JSONObject jsonObject = httpsRequest(url, ”POST”, jsonMenu);
  205. System.out.println(jsonMenu);
  206. if (null != jsonObject) {
  207. if (0 != jsonObject.getInt(“errcode”)) {
  208. result = jsonObject.getInt(”errcode”);
  209. log.error(”创建菜单失败 errcode:{} errmsg:{}”, jsonObject.getInt(“errcode”), jsonObject.getString(“errmsg”));
  210. }
  211. }
  212. return result;
  213. }
  214. /**
  215. * 对Map数组进行排序
  216. * */
  217. public static String FormatQueryParaMap(HashMap<String, String> parameters) throws UnsupportedEncodingException {
  218. String buff = ”“;
  219. List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(
  220. parameters.entrySet());
  221. Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
  222. public int compare(Map.Entry<String, String> o1,
  223. Map.Entry<String, String> o2) {
  224. return (o1.getKey()).toString().compareTo(o2.getKey());
  225. }
  226. });
  227. for (int i = 0; i < infoIds.size(); i++) {
  228. Map.Entry<String, String> item = infoIds.get(i);
  229. if (item.getKey() != “”) {
  230. //              buff += item.getKey() + ”=”+ URLEncoder.encode(item.getValue(), “utf-8”) + ”&”;
  231. buff += item.getKey() + ”=”+ item.getValue() + “&”;
  232. }
  233. }
  234. if (buff.isEmpty() == false) {
  235. buff = buff.substring(0, buff.length() - 1);
  236. }
  237. return buff;
  238. }
  239. /**
  240. * 生成32位随机字符串
  241. * */
  242. public static String CreateNoncestr() {
  243. String chars = ”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”;
  244. String res = ”“;
  245. for (int i = 0; i <16; i++) {
  246. Random rd = new Random();
  247. res += chars.charAt(rd.nextInt(chars.length() - 1));
  248. }
  249. return res;
  250. }
  251. /**
  252. * SHA1加密
  253. * */
  254. public final static String Sha1(String s) {
  255. char hexDigits[]={‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };
  256. try {
  257. byte[] btInput = s.getBytes();
  258. // 获得MD5摘要算法的 MessageDigest 对象
  259. MessageDigest mdInst = MessageDigest.getInstance(”sha-1”);
  260. // 使用指定的字节更新摘要
  261. mdInst.update(btInput);
  262. // 获得密文
  263. byte[] md = mdInst.digest();
  264. // 把密文转换成十六进制的字符串形式
  265. int j = md.length;
  266. char str[] = new char[j * 2];
  267. int k = 0;
  268. for (int i = 0; i < j; i++) {
  269. byte byte0 = md[i];
  270. str[k++] = hexDigits[byte0 >>> 4 & 0xf];
  271. str[k++] = hexDigits[byte0 & 0xf];
  272. }
  273. return new String(str);
  274. } catch (Exception e) {
  275. e.printStackTrace();
  276. return null;
  277. }
  278. }
  279. }
package com.howin.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.howin.pojo.Menu;
import com.howin.pojo.Token;/**
* 类名: CommonUtil </br>
* 描述: 通用工具类 </br>
* 开发人员: howin </br>
* 创建时间: 2016-08-19 </br>
* 发布版本:V1.0 </br>*/
public class CommonUtil {private static Logger log = LoggerFactory.getLogger(CommonUtil.class);private static long tokenTime = 0;private static long jsTicketTime = 0;private static Token token = null;private static String ticket = null;// 凭证获取(GET)public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** 发送https请求* * @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:{}", ce);} catch (Exception e) {log.error("https请求异常:{}", e);}return jsonObject;}/*** 获取接口访问凭证* * @param appid 凭证* @param appsecret 密钥* @return*/public static Token getToken(String appid, String appsecret) {// 第三方用户唯一凭证  appid = "wx7504778ec4f99579";  // 第三方用户唯一凭证密钥  appsecret = "b77fba754559304c833a258f4a6f1853";  long now = new Date().getTime();if(tokenTime!=0&&now-tokenTime<7000000){//token有效时间 7e6 毫秒return token;}String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);// 发起GET请求获取凭证JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {token = new Token();token.setAccessToken(jsonObject.getString("access_token"));token.setExpiresIn(jsonObject.getInt("expires_in"));tokenTime = now;} catch (JSONException e) {token = null;// 获取token失败log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}return token;}/*** 获取jsapi_ticket访问凭证* */public static String getJsTicket(){long now = new Date().getTime();if(jsTicketTime!=0&&now-jsTicketTime<7000000){//token有效时间 7e6 毫秒return ticket;}//得到tokenString accessToken = getToken(null,null).getAccessToken();//GET方法获得jsapi_ticketString requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi".replace("ACCESS_TOKEN",accessToken);// 发起GET请求获取凭证JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);if(jsonObject!=null){ticket = jsonObject.getString("ticket");jsTicketTime = now;}return ticket;}/*** URL编码(utf-8)* * @param source* @return*/public static String urlEncodeUTF8(String source) {String result = source;try {result = java.net.URLEncoder.encode(source, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** 根据内容类型判断文件扩展名* * @param contentType 内容类型* @return*/public static String getFileExt(String contentType) {String fileExt = "";if ("image/jpeg".equals(contentType))fileExt = ".jpg";else if ("audio/mpeg".equals(contentType))fileExt = ".mp3";else if ("audio/amr".equals(contentType))fileExt = ".amr";else if ("video/mp4".equals(contentType))fileExt = ".mp4";else if ("video/mpeg4".equals(contentType))fileExt = ".mp4";return fileExt;}// 菜单创建(POST) 限100(次/天)  public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";  /** * 创建菜单 *  * @param menu 菜单实例 * @param accessToken 有效的access_token * @return 0表示成功,其他值表示失败 */  public static int createMenu(Menu menu, String accessToken) {  int result = 0;  // 拼装创建菜单的url  String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);  // 将菜单对象转换成json字符串  String jsonMenu = JSONObject.fromObject(menu).toString();  // 调用接口创建菜单  JSONObject jsonObject = httpsRequest(url, "POST", jsonMenu);  System.out.println(jsonMenu);if (null != jsonObject) {  if (0 != jsonObject.getInt("errcode")) {  result = jsonObject.getInt("errcode");  log.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  }  }  return result;  }  /*** 对Map数组进行排序  * */public static String FormatQueryParaMap(HashMap<String, String> parameters) throws UnsupportedEncodingException {String buff = "";List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(parameters.entrySet());Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {public int compare(Map.Entry<String, String> o1,Map.Entry<String, String> o2) {return (o1.getKey()).toString().compareTo(o2.getKey());}});for (int i = 0; i < infoIds.size(); i++) {Map.Entry<String, String> item = infoIds.get(i);if (item.getKey() != "") {
//              buff += item.getKey() + "="+ URLEncoder.encode(item.getValue(), "utf-8") + "&";buff += item.getKey() + "="+ item.getValue() + "&";}}if (buff.isEmpty() == false) {buff = buff.substring(0, buff.length() - 1);}return buff;}/*** 生成32位随机字符串* */public static String CreateNoncestr() {String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";String res = "";for (int i = 0; i <16; i++) {Random rd = new Random();res += chars.charAt(rd.nextInt(chars.length() - 1));}return res;}/*** SHA1加密* */public final static String Sha1(String s) {char hexDigits[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };       try {byte[] btInput = s.getBytes();// 获得MD5摘要算法的 MessageDigest 对象MessageDigest mdInst = MessageDigest.getInstance("sha-1");// 使用指定的字节更新摘要mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}
}

获取用户基本信息的方法,写一个测试类直接运行次程序:

[java] view plain copyprint?
  1. package com.howin.weixin.test;
  2. import java.io.BufferedReader;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.ConnectException;
  8. import java.net.URL;
  9. import java.util.List;
  10. import javax.net.ssl.HttpsURLConnection;
  11. import javax.net.ssl.SSLContext;
  12. import javax.net.ssl.SSLSocketFactory;
  13. import javax.net.ssl.TrustManager;
  14. import net.sf.json.JSONArray;
  15. import net.sf.json.JSONObject;
  16. import com.howin.weixin.pojo.SNSUserInfo;
  17. import com.howin.weixin.pojo.WeixinOauth2Token;
  18. import com.howin.weixin.pojo.WeixinUserInfo;
  19. import com.howin.weixin.util.CommonUtil;
  20. import com.howin.weixin.util.MyX509TrustManager;
  21. public class Test {
  22. public static void main(String args[]) {
  23. // 获取接口访问凭证
  24. String accessToken = CommonUtil.getToken(”自己的appid”, “自己的密钥”).getAccessToken();
  25. /**
  26. * 获取用户信息
  27. */
  28. WeixinUserInfo user = getUserInfo(accessToken, ”这里写关注用户的openid”);
  29. //做这个测试的时候可以先关注,或者取消关注,控制台会打印出来此用户的openid
  30. System.out.println(”OpenID:” + user.getOpenId());
  31. System.out.println(”关注状态:” + user.getSubscribe());
  32. System.out.println(”关注时间:” + user.getSubscribeTime());
  33. System.out.println(”昵称:” + user.getNickname());
  34. System.out.println(”性别:” + user.getSex());
  35. System.out.println(”国家:” + user.getCountry());
  36. System.out.println(”省份:” + user.getProvince());
  37. System.out.println(”城市:” + user.getCity());
  38. System.out.println(”语言:” + user.getLanguage());
  39. System.out.println(”头像:” + user.getHeadImgUrl());
  40. }
  41. /**
  42. * 获取用户信息
  43. *
  44. * @param accessToken 接口访问凭证
  45. * @param openId 用户标识
  46. * @return WeixinUserInfo
  47. */
  48. public static WeixinUserInfo getUserInfo(String accessToken, String openId) {
  49. WeixinUserInfo weixinUserInfo = null;
  50. // 拼接请求地址
  51. String requestUrl = ”https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID”;
  52. requestUrl = requestUrl.replace(”ACCESS_TOKEN”, accessToken).replace(“OPENID”, openId);
  53. // 获取用户信息
  54. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, ”GET”, null);
  55. if (null != jsonObject) {
  56. try {
  57. weixinUserInfo = new WeixinUserInfo();
  58. // 用户的标识
  59. weixinUserInfo.setOpenId(jsonObject.getString(”openid”));
  60. // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
  61. weixinUserInfo.setSubscribe(jsonObject.getInt(”subscribe”));
  62. // 用户关注时间
  63. weixinUserInfo.setSubscribeTime(jsonObject.getString(”subscribe_time”));
  64. // 昵称
  65. weixinUserInfo.setNickname(jsonObject.getString(”nickname”));
  66. // 用户的性别(1是男性,2是女性,0是未知)
  67. weixinUserInfo.setSex(jsonObject.getInt(”sex”));
  68. // 用户所在国家
  69. weixinUserInfo.setCountry(jsonObject.getString(”country”));
  70. // 用户所在省份
  71. weixinUserInfo.setProvince(jsonObject.getString(”province”));
  72. // 用户所在城市
  73. weixinUserInfo.setCity(jsonObject.getString(”city”));
  74. // 用户的语言,简体中文为zh_CN
  75. weixinUserInfo.setLanguage(jsonObject.getString(”language”));
  76. // 用户头像
  77. weixinUserInfo.setHeadImgUrl(jsonObject.getString(”headimgurl”));
  78. } catch (Exception e) {
  79. if (0 == weixinUserInfo.getSubscribe()) {
  80. System.err.printf(”用户{}已取消关注”, weixinUserInfo.getOpenId());
  81. } else {
  82. int errorCode = jsonObject.getInt(“errcode”);
  83. String errorMsg = jsonObject.getString(”errmsg”);
  84. System.err.printf(”获取用户信息失败 errcode:{} errmsg:{}”, errorCode, errorMsg);
  85. }
  86. }
  87. }
  88. return weixinUserInfo;
  89. }
  90. /**
  91. * 获取网页授权凭证
  92. *
  93. * @param appId 公众账号的唯一标识
  94. * @param appSecret 公众账号的密钥
  95. * @param code
  96. * @return WeixinAouth2Token
  97. */
  98. public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
  99. WeixinOauth2Token wat = null;
  100. // 拼接请求地址
  101. String requestUrl = ”https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code”;
  102. requestUrl = requestUrl.replace(”APPID”, appId);
  103. requestUrl = requestUrl.replace(”SECRET”, appSecret);
  104. requestUrl = requestUrl.replace(”CODE”, code);
  105. // 获取网页授权凭证
  106. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, ”GET”, null);
  107. if (null != jsonObject) {
  108. try {
  109. wat = new WeixinOauth2Token();
  110. wat.setAccessToken(jsonObject.getString(”access_token”));
  111. wat.setExpiresIn(jsonObject.getInt(”expires_in”));
  112. wat.setRefreshToken(jsonObject.getString(”refresh_token”));
  113. wat.setOpenId(jsonObject.getString(”openid”));
  114. wat.setScope(jsonObject.getString(”scope”));
  115. } catch (Exception e) {
  116. wat = null;
  117. int errorCode = jsonObject.getInt(“errcode”);
  118. String errorMsg = jsonObject.getString(”errmsg”);
  119. System.err.printf(”获取网页授权凭证失败 errcode:{} errmsg:{}”, errorCode, errorMsg);
  120. }
  121. }
  122. return wat;
  123. }
  124. /**
  125. * 通过网页授权获取用户信息
  126. *
  127. * @param accessToken 网页授权接口调用凭证
  128. * @param openId 用户标识
  129. * @return SNSUserInfo
  130. */
  131. @SuppressWarnings( { “deprecation”, “unchecked” })
  132. public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
  133. SNSUserInfo snsUserInfo = null;
  134. // 拼接请求地址
  135. String requestUrl = ”https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID”;
  136. requestUrl = requestUrl.replace(”ACCESS_TOKEN”, accessToken).replace(“OPENID”, openId);
  137. // 通过网页授权获取用户信息
  138. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, ”GET”, null);
  139. if (null != jsonObject) {
  140. try {
  141. snsUserInfo = new SNSUserInfo();
  142. // 用户的标识
  143. snsUserInfo.setOpenId(jsonObject.getString(”openid”));
  144. // 昵称
  145. snsUserInfo.setNickname(jsonObject.getString(”nickname”));
  146. // 性别(1是男性,2是女性,0是未知)
  147. snsUserInfo.setSex(jsonObject.getInt(”sex”));
  148. // 用户所在国家
  149. snsUserInfo.setCountry(jsonObject.getString(”country”));
  150. // 用户所在省份
  151. snsUserInfo.setProvince(jsonObject.getString(”province”));
  152. // 用户所在城市
  153. snsUserInfo.setCity(jsonObject.getString(”city”));
  154. // 用户头像
  155. snsUserInfo.setHeadImgUrl(jsonObject.getString(”headimgurl”));
  156. // 用户特权信息
  157. snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray(”privilege”), List.class));
  158. } catch (Exception e) {
  159. snsUserInfo = null;
  160. int errorCode = jsonObject.getInt(“errcode”);
  161. String errorMsg = jsonObject.getString(”errmsg”);
  162. System.err.printf(”获取用户信息失败 errcode:{} errmsg:{}”, errorCode, errorMsg);
  163. }
  164. }
  165. return snsUserInfo;
  166. }
  167. /**
  168. * 发送https请求
  169. *
  170. * @param requestUrl 请求地址
  171. * @param requestMethod 请求方式(GET、POST)
  172. * @param outputStr 提交的数据
  173. * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  174. */
  175. public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
  176. JSONObject jsonObject = null;
  177. try {
  178. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  179. TrustManager[] tm = { new MyX509TrustManager() };
  180. SSLContext sslContext = SSLContext.getInstance(”SSL”, “SunJSSE”);
  181. sslContext.init(null, tm, new java.security.SecureRandom());
  182. // 从上述SSLContext对象中得到SSLSocketFactory对象
  183. SSLSocketFactory ssf = sslContext.getSocketFactory();
  184. URL url = new URL(requestUrl);
  185. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  186. conn.setSSLSocketFactory(ssf);
  187. conn.setDoOutput(true);
  188. conn.setDoInput(true);
  189. conn.setUseCaches(false);
  190. // 设置请求方式(GET/POST)
  191. conn.setRequestMethod(requestMethod);
  192. // 当outputStr不为null时向输出流写数据
  193. if (null != outputStr) {
  194. OutputStream outputStream = conn.getOutputStream();
  195. // 注意编码格式
  196. outputStream.write(outputStr.getBytes(”UTF-8”));
  197. outputStream.close();
  198. }
  199. // 从输入流读取返回内容
  200. InputStream inputStream = conn.getInputStream();
  201. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, “utf-8”);
  202. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  203. String str = null;
  204. StringBuffer buffer = new StringBuffer();
  205. while ((str = bufferedReader.readLine()) != null) {
  206. buffer.append(str);
  207. }
  208. // 释放资源
  209. bufferedReader.close();
  210. inputStreamReader.close();
  211. inputStream.close();
  212. inputStream = null;
  213. conn.disconnect();
  214. jsonObject = JSONObject.fromObject(buffer.toString());
  215. } catch (ConnectException ce) {
  216. System.err.printf(”连接超时:{}”, ce);
  217. } catch (Exception e) {
  218. System.err.printf(”https请求异常:{}”, e);
  219. }
  220. return jsonObject;
  221. }
  222. /**
  223. * URL编码(utf-8)
  224. *
  225. * @param source
  226. * @return
  227. */
  228. public static String urlEncodeUTF8(String source) {
  229. String result = source;
  230. try {
  231. result = java.net.URLEncoder.encode(source, ”utf-8”);
  232. } catch (UnsupportedEncodingException e) {
  233. e.printStackTrace();
  234. }
  235. return result;
  236. }
  237. }
package com.howin.weixin.test;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.util.List;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;import net.sf.json.JSONArray;
import net.sf.json.JSONObject;import com.howin.weixin.pojo.SNSUserInfo;
import com.howin.weixin.pojo.WeixinOauth2Token;
import com.howin.weixin.pojo.WeixinUserInfo;
import com.howin.weixin.util.CommonUtil;
import com.howin.weixin.util.MyX509TrustManager;public class Test {public static void main(String args[]) {// 获取接口访问凭证String accessToken = CommonUtil.getToken("自己的appid", "自己的密钥").getAccessToken();/*** 获取用户信息*/WeixinUserInfo user = getUserInfo(accessToken, "这里写关注用户的openid");//做这个测试的时候可以先关注,或者取消关注,控制台会打印出来此用户的openidSystem.out.println("OpenID:" + user.getOpenId());System.out.println("关注状态:" + user.getSubscribe());System.out.println("关注时间:" + user.getSubscribeTime());System.out.println("昵称:" + user.getNickname());System.out.println("性别:" + user.getSex());System.out.println("国家:" + user.getCountry());System.out.println("省份:" + user.getProvince());System.out.println("城市:" + user.getCity());System.out.println("语言:" + user.getLanguage());System.out.println("头像:" + user.getHeadImgUrl());}/*** 获取用户信息* * @param accessToken 接口访问凭证* @param openId 用户标识* @return WeixinUserInfo*/public static WeixinUserInfo getUserInfo(String accessToken, String openId) {WeixinUserInfo weixinUserInfo = null;// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);// 获取用户信息JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {weixinUserInfo = new WeixinUserInfo();// 用户的标识weixinUserInfo.setOpenId(jsonObject.getString("openid"));// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息weixinUserInfo.setSubscribe(jsonObject.getInt("subscribe"));// 用户关注时间weixinUserInfo.setSubscribeTime(jsonObject.getString("subscribe_time"));// 昵称weixinUserInfo.setNickname(jsonObject.getString("nickname"));// 用户的性别(1是男性,2是女性,0是未知)weixinUserInfo.setSex(jsonObject.getInt("sex"));// 用户所在国家weixinUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份weixinUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市weixinUserInfo.setCity(jsonObject.getString("city"));// 用户的语言,简体中文为zh_CNweixinUserInfo.setLanguage(jsonObject.getString("language"));// 用户头像weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));} catch (Exception e) {if (0 == weixinUserInfo.getSubscribe()) {System.err.printf("用户{}已取消关注", weixinUserInfo.getOpenId());} else {int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");System.err.printf("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}}return weixinUserInfo;}/*** 获取网页授权凭证* * @param appId 公众账号的唯一标识* @param appSecret 公众账号的密钥* @param code* @return WeixinAouth2Token*/public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {WeixinOauth2Token wat = null;// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";requestUrl = requestUrl.replace("APPID", appId);requestUrl = requestUrl.replace("SECRET", appSecret);requestUrl = requestUrl.replace("CODE", code);// 获取网页授权凭证JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {wat = new WeixinOauth2Token();wat.setAccessToken(jsonObject.getString("access_token"));wat.setExpiresIn(jsonObject.getInt("expires_in"));wat.setRefreshToken(jsonObject.getString("refresh_token"));wat.setOpenId(jsonObject.getString("openid"));wat.setScope(jsonObject.getString("scope"));} catch (Exception e) {wat = null;int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");System.err.printf("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return wat;}/*** 通过网页授权获取用户信息* * @param accessToken 网页授权接口调用凭证* @param openId 用户标识* @return SNSUserInfo*/@SuppressWarnings( { "deprecation", "unchecked" })public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {SNSUserInfo snsUserInfo = null;// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);// 通过网页授权获取用户信息JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {snsUserInfo = new SNSUserInfo();// 用户的标识snsUserInfo.setOpenId(jsonObject.getString("openid"));// 昵称snsUserInfo.setNickname(jsonObject.getString("nickname"));// 性别(1是男性,2是女性,0是未知)snsUserInfo.setSex(jsonObject.getInt("sex"));// 用户所在国家snsUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份snsUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市snsUserInfo.setCity(jsonObject.getString("city"));// 用户头像snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));// 用户特权信息snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));} catch (Exception e) {snsUserInfo = null;int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");System.err.printf("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return snsUserInfo;}/*** 发送https请求* * @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {System.err.printf("连接超时:{}", ce);} catch (Exception e) {System.err.printf("https请求异常:{}", e);}return jsonObject;}/*** URL编码(utf-8)* * @param source* @return*/public static String urlEncodeUTF8(String source) {String result = source;try {result = java.net.URLEncoder.encode(source, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}
}

Java微信开发(通过java程序获取用户个人信息)相关推荐

  1. 小程序获取用户地址信息api

    小程序获取用户地址信息api 前台部分 <view class="address-wraper"><view bindtap="chooseAddres ...

  2. 微信小程序获取用户真实信息

    微信在2020年4月13日到4月28日调整了获取用户信息的接口,4月28日24时后发布的新版本小程序就获取不到用户的真实信息了 附上原文链接:微信用户信息接口调整 注意事项: 调用wx.getUser ...

  3. 微信小程序获取用户位置信息并显示到地图上

    1.配置地理位置用途说明 在app.json中的大括号内输入 "permission": {"scope.userLocation": {"desc& ...

  4. uni-app 对接微信小程序获取用户个人信息和获取用户手机号码

    第一次对接小程序授权的时候以为能一进入这个项目就要调用获取授权信息,后面写好逻辑之后提交审核,一直审核不通过,后面查了原因之后才发现不能一进入页面就调用授权,而且项目需要个人信息和手机号码两个都要获取 ...

  5. 小程序 | 获取用户头像信息接口改进:getUserInfo的使用

    开发小程序过程中,发现最近微信官方新调整了getUserInfo的接口的使用,并发布了一篇<小程序登录.用户信息相关接口调整说明>公告,摸索了一番之后,了解到getUserProfile用 ...

  6. Java微信授权小程序获取用户手机号信息

    注意:目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体).需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限. 官网地址如下: https: ...

  7. JAVA微信开发:[17]如何获取所有关注用户

    该方法获取所有关注公共账号的微信用户的openId集合, 再通过openId集合既可以获取所有的用户的信息.   /** * 获取所有的关注用户 * * @return */ public  List ...

  8. 微信开发_网页授权获取用户的基本信息

    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于OAuth2.0的说明 官方网站:http://oauth.net/   http:/ ...

  9. 微信小程序获取用户简要信息

    因为项目的需要,研究了一下微信获取用户的简单信息,在过程中耗费了许多的时间,想发出来与大家一起分享学习,有大牛看到不足的地方也希望大家指教! 小程序: var utils = require(&quo ...

  10. 微信开发之网页授权获取用户基本信息

    微信官方文档:网页授权获取用户基本信息 具体而言,网页授权流程分为四步: 1.引导用户进入授权页面同意授权,获取code https://open.weixin.qq.com/connect/oaut ...

最新文章

  1. OpenLayer + Ags 综合应用(一)--OpenLayer 地图展现
  2. Selenium3+python自动化009- 截图
  3. 思科服务器与交换机链接配置文件,使用思科S系列交换机上的配置迁移工具转换配置文件...
  4. 澳洲 计算机 本科学费,澳大利亚墨尔本大学一年学费和生活费清单
  5. Python应用实战- 爬虫基础入门知识必会
  6. nginx 在阿里云怎么安装mysql_阿里云Linux服务器安装 nginx+mysql+php
  7. 涂抹果酱_如何玩果酱
  8. LVS——TUN隧道模式(负载均衡)
  9. Promise的deferred对象详解
  10. python获取路径下所有文件_Python 之 glob读取路径下所有文件夹或文件方法
  11. 计算机网络工程税率多少,弱电工程增值税6%、9%、13%税率怎样选择?
  12. idea中代码字体大小调整
  13. 智芯传感压力传感器在咖啡机中的应用
  14. Unity 四种截图方法(相机视图、无UI、有UI、Game窗口)
  15. 国外小伙用石头提炼硅,制作芯片,号称99秒“解决”芯片危机
  16. maven进行install时出现Fatal error compiling错误
  17. 以太坊 2.0 中的验证者经济模型,Part-1
  18. 代理沙特SASO贸促会认证
  19. PEO-b-PTMPM的嵌段共聚物复合囊泡/具有pH响应性的纳米颗粒/卤化银纳米粒子/聚合物纳米
  20. 备注: ubt 16.04 安装 gtx 1060 --- 成功运行 tensorflow - gpu

热门文章

  1. 深入浅出计算机组成原理(二)——给你一张知识地图,计算机组成原理应
  2. 今天我们谈谈关于java自学的那些事儿(为那些目标模糊的码农们)
  3. php v8js 执行外部js,php运行jsv8引擎
  4. DDD到底是不是毒瘤?
  5. PHP容器--Pimple运行流程浅析
  6. ESP32开发学习 LVGL Littlevgl 解码显示JPG图片三种方式JPG_SJPG_C Array
  7. 怎样让PHP提示错误信息
  8. X_mind思维导图应用以及Windows和安卓软件下载(Free)
  9. Ubuntu 16.04下的美化配置过程
  10. 牛逼哄哄的对象深复制