6.3.3 方法封装

1.封装获取access_token方法

笔者将调用接口获取网页授权access_token的操作封装成getOauth2AccessToken()方法,该方法的实现如下:

  1. /**
  2. * 获取网页授权凭证
  3. *
  4. * @param appId 公众账号的唯一标识
  5. * @param appSecret 公众账号的密钥
  6. * @param code
  7. * @return WeixinAouth2Token
  8. */
  9. public static WeixinOauth2Token getOauth2AccessToken(String appId,
  10. String appSecret, String code) {
  11. WeixinOauth2Token wat = null;
  12. // 拼接请求地址
  13. String requestUrl = "https:// api.weixin.qq.com/sns/oauth2/
  14. access_token?appid=APPID&secret=SECRET&code=COD
  15. E&grant_type=authorization_code";
  16. requestUrl = requestUrl.replace("APPID", appId);
  17. requestUrl = requestUrl.replace("SECRET", appSecret);
  18. requestUrl = requestUrl.replace("CODE", code);
  19. // 获取网页授权凭证
  20. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
  21. if (null != jsonObject) {
  22. try {
  23. wat = new WeixinOauth2Token();
  24. wat.setAccessToken(jsonObject.getString("access_token"));
  25. wat.setExpiresIn(jsonObject.getInt("expires_in"));
  26. wat.setRefreshToken(jsonObject.getString("refresh_token"));
  27. wat.setOpenId(jsonObject.getString("openid"));
  28. wat.setScope(jsonObject.getString("scope"));
  29. } catch (Exception e) {
  30. wat = null;
  31. int errorCode = jsonObject.getInt("errcode");
  32. String errorMsg = jsonObject.getString("errmsg");
  33. log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);
  34. }
  35. }
  36. return wat;
  37. }

getOauth2AccessToken()方法的返回值是WeixinOauth2Token对象,它封装了调用接口返回的所有参数,该类的代码如下:

  1. package org.liufeng.course.pojo;
  2.  
  3. /**
  4. * 网页授权信息
  5. *
  6. * @author liufeng
  7. * @date 2013-11-09
  8. */
  9. public class WeixinOauth2Token {
  10. // 网页授权接口调用凭证
  11. private String accessToken;
  12. // 凭证有效时长
  13. private int expiresIn;
  14. // 用于刷新凭证
  15. private String refreshToken;
  16. // 用户标识
  17. private String openId;
  18. // 用户授权作用域
  19. private String scope;
  20.  
  21. public String getAccessToken() {
  22. return accessToken;
  23. }
  24.  
  25. public void setAccessToken(String accessToken) {
  26. this.accessToken = accessToken;
  27. }
  28.  
  29. public int getExpiresIn() {
  30. return expiresIn;
  31. }
  32.  
  33. public void setExpiresIn(int expiresIn) {
  34. this.expiresIn = expiresIn;
  35. }
  36.  
  37. public String getRefreshToken() {
  38. return refreshToken;
  39. }
  40.  
  41. public void setRefreshToken(String refreshToken) {
  42. this.refreshToken = refreshToken;
  43. }
  44.  
  45. public String getOpenId() {
  46. return openId;
  47. }
  48.  
  49. public void setOpenId(String openId) {
  50. this.openId = openId;
  51. }
  52.  
  53. public String getScope() {
  54. return scope;
  55. }
  56.  
  57. public void setScope(String scope) {
  58. this.scope = scope;
  59. }
  60. }

2.封装刷新access_token方法

笔者将调用接口刷新网页授权access_token的操作封装成refreshOauth2AccessToken()方法,该方法的实现如下:

  1. /**
  2. * 刷新网页授权凭证
  3. *
  4. * @param appId 公众账号的唯一标识
  5. * @param refreshToken
  6. * @return WeixinAouth2Token
  7. */
  8. public static WeixinOauth2Token refreshOauth2AccessToken
  9. (String appId, String refreshToken) {
  10. WeixinOauth2Token wat = null;
  11. // 拼接请求地址
  12. String requestUrl = "https:// api.weixin.qq.com/sns/oauth2/
  13. refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
  14. requestUrl = requestUrl.replace("APPID", appId);
  15. requestUrl = requestUrl.replace("REFRESH_TOKEN", refreshToken);
  16. // 刷新网页授权凭证
  17. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
  18. if (null != jsonObject) {
  19. try {
  20. wat = new WeixinOauth2Token();
  21. wat.setAccessToken(jsonObject.getString("access_token"));
  22. wat.setExpiresIn(jsonObject.getInt("expires_in"));
  23. wat.setRefreshToken(jsonObject.getString("refresh_token"));
  24. wat.setOpenId(jsonObject.getString("openid"));
  25. wat.setScope(jsonObject.getString("scope"));
  26. } catch (Exception e) {
  27. wat = null;
  28. int errorCode = jsonObject.getInt("errcode");
  29. String errorMsg = jsonObject.getString("errmsg");
  30. log.error("刷新网页授权凭证失败 errcode:{} errmsg:{}", errorCode,
  31. errorMsg);
  32. }
  33. }
  34. return wat;
  35. }

refreshOauth2AccessToken()方法的返回值也是WeixinOauth2Token对象,前面有该方法的定义。

3.封装获取用户信息方法

笔者将通过网页授权access_token获取用户信息的操作封装成getSNSUserInfo()方法,该方法的实现如下:

  1. /**
  2. * 通过网页授权获取用户信息
  3. *
  4. * @param accessToken 网页授权接口调用凭证
  5. * @param openId 用户标识
  6. * @return SNSUserInfo
  7. */
  8. @SuppressWarnings( { "deprecation", "unchecked" })
  9. public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {
  10. SNSUserInfo snsUserInfo = null;
  11. // 拼接请求地址
  12. String requestUrl = "https:// api.weixin.qq.com/sns/
  13. userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
  14. requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID",
  15. openId);
  16. // 通过网页授权获取用户信息
  17. JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);
  18.  
  19. if (null != jsonObject) {
  20. try {
  21. snsUserInfo = new SNSUserInfo();
  22. // 用户的标识
  23. snsUserInfo.setOpenId(jsonObject.getString("openid"));
  24. // 昵称
  25. snsUserInfo.setNickname(jsonObject.getString("nickname"));
  26. // 性别(1是男性,2是女性,0是未知)
  27. snsUserInfo.setSex(jsonObject.getInt("sex"));
  28. // 用户所在国家
  29. snsUserInfo.setCountry(jsonObject.getString("country"));
  30. // 用户所在省份
  31. snsUserInfo.setProvince(jsonObject.getString("province"));
  32. // 用户所在城市
  33. snsUserInfo.setCity(jsonObject.getString("city"));
  34. // 用户头像
  35. snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
  36. // 用户特权信息
  37. snsUserInfo.setPrivilegeList (JSONArray.toList
  38. (jsonObject.getJSONArray("privilege"), List.class));
  39. } catch (Exception e) {
  40. snsUserInfo = null;
  41. int errorCode = jsonObject.getInt("errcode");
  42. String errorMsg = jsonObject.getString("errmsg");
  43. log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
  44. }
  45. }
  46. return snsUserInfo;
  47. }

getSNSUserInfo()方法的返回值是SNSUserInfo对象,它封装了调用接口返回的所有参数,该类的代码如下:

  1. package org.liufeng.course.pojo;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. * 通过网页授权获取的用户信息
  7. *
  8. * @author liufeng
  9. * @date 2013-11-09
  10. */
  11. public class SNSUserInfo {
  12. // 用户标识
  13. private String openId;
  14. // 用户昵称
  15. private String nickname;
  16. // 性别(1是男性,2是女性,0是未知)
  17. private int sex;
  18. // 国家
  19. private String country;
  20. // 省份
  21. private String province;
  22. // 城市
  23. private String city;
  24. // 用户头像链接
  25. private String headImgUrl;
  26. // 用户特权信息
  27. private List<String> privilegeList;
  28.  
  29. public String getOpenId() {
  30. return openId;
  31. }
  32.  
  33. public void setOpenId(String openId) {
  34. this.openId = openId;
  35. }
  36.  
  37. public String getNickname() {
  38. return nickname;
  39. }
  40.  
  41. public void setNickname(String nickname) {
  42. this.nickname = nickname;
  43. }
  44.  
  45. public int getSex() {
  46. return sex;
  47. }
  48.  
  49. public void setSex(int sex) {
  50. this.sex = sex;
  51. }
  52.  
  53. public String getCountry() {
  54. return country;
  55. }
  56.  
  57. public void setCountry(String country) {
  58. this.country = country;
  59. }
  60.  
  61. public String getProvince() {
  62. return province;
  63. }
  64.  
  65. public void setProvince(String province) {
  66. this.province = province;
  67. }
  68.  
  69. public String getCity() {
  70. return city;
  71. }
  72.  
  73. public void setCity(String city) {
  74. this.city = city;
  75. }
  76.  
  77. public String getHeadImgUrl() {
  78. return headImgUrl;
  79. }
  80.  
  81. public void setHeadImgUrl(String headImgUrl) {
  82. this.headImgUrl = headImgUrl;
  83. }
  84.  
  85. public List<String> getPrivilegeList() {
  86. return privilegeList;
  87. }
  88.  
  89. public void setPrivilegeList(List<String> privilegeList) {
  90. this.privilegeList = privilegeList;
  91. }
  92. }