From 19230472929a28380dde34d3e01cb95b9fecc602 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 26 May 2019 17:03:50 +0800 Subject: [PATCH] =?UTF-8?q?#1053=20=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=A0=B9=E6=8D=AEcode=E8=8E=B7=E5=8F=96=E6=88=90=E5=91=98?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/api/WxCpOAuth2Service.java | 24 ++++++--- .../cp/api/impl/WxCpOAuth2ServiceImpl.java | 52 +++++++++---------- .../weixin/cp/bean/WxCpOauth2UserInfo.java | 28 ++++++++++ .../api/impl/WxCpOAuth2ServiceImplTest.java | 12 ++++- .../weixin/cp/demo/WxCpOAuth2Servlet.java | 5 +- 5 files changed, 85 insertions(+), 36 deletions(-) create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpOauth2UserInfo.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOAuth2Service.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOAuth2Service.java index 5f3d6daa..c6d9063f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOAuth2Service.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpOAuth2Service.java @@ -1,20 +1,25 @@ package me.chanjar.weixin.cp.api; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; import me.chanjar.weixin.cp.bean.WxCpUserDetail; /** *
- * OAuth2相关管理接口
+ * OAuth2相关管理接口.
  *  Created by BinaryWang on 2017/6/24.
  * 
* * @author Binary Wang */ public interface WxCpOAuth2Service { + String URL_GET_USER_INFO = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?code=%s&agentid=%d"; + String URL_GET_USER_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail"; + String URL_OAUTH_2_AUTHORIZE = "https://open.weixin.qq.com/connect/oauth2/authorize"; + /** *
-   * 构造oauth2授权的url连接
+   * 构造oauth2授权的url连接.
    * 
* * @param state 状态码 @@ -24,7 +29,7 @@ public interface WxCpOAuth2Service { /** *
-   * 构造oauth2授权的url连接
+   * 构造oauth2授权的url连接.
    * 详情请见: http://qydev.weixin.qq.com/wiki/index.php?title=企业获取code
    * 
* @@ -57,16 +62,18 @@ public interface WxCpOAuth2Service { * * * @param code 微信oauth授权返回的代码 - * @return [userid, deviceid] + * @return WxCpOauth2UserInfo + * @throws WxErrorException 异常 * @see #getUserInfo(Integer, String) */ - String[] getUserInfo(String code) throws WxErrorException; + WxCpOauth2UserInfo getUserInfo(String code) throws WxErrorException; /** *
    * 根据code获取成员信息
    * http://qydev.weixin.qq.com/wiki/index.php?title=根据code获取成员信息
    * https://work.weixin.qq.com/api/doc#10028/根据code获取成员信息
+   * https://work.weixin.qq.com/api/doc#90000/90135/91023  获取访问用户身份
    * 因为企业号oauth2.0必须在应用设置里设置通过ICP备案的可信域名,所以无法测试,因此这个方法很可能是坏的。
    *
    * 注意: 这个方法不使用WxCpConfigStorage里的agentId,需要开发人员自己给出
@@ -74,10 +81,11 @@ public interface WxCpOAuth2Service {
    *
    * @param agentId 企业号应用的id
    * @param code    通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
-   * @return [UserId, DeviceId, OpenId, user_ticket, expires_in]
+   * @return WxCpOauth2UserInfo
+   * @throws WxErrorException 异常
    * @see #getUserInfo(String)
    */
-  String[] getUserInfo(Integer agentId, String code) throws WxErrorException;
+  WxCpOauth2UserInfo getUserInfo(Integer agentId, String code) throws WxErrorException;
 
   /**
    * 
@@ -92,6 +100,8 @@ public interface WxCpOAuth2Service {
    * 
* * @param userTicket 成员票据 + * @return WxCpUserDetail + * @throws WxErrorException 异常 */ WxCpUserDetail getUserDetail(String userTicket) throws WxErrorException; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java index 3507de07..6ff91fc3 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImpl.java @@ -3,30 +3,31 @@ package me.chanjar.weixin.cp.api.impl; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.URIUtil; import me.chanjar.weixin.common.util.json.GsonHelper; import me.chanjar.weixin.cp.api.WxCpOAuth2Service; import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; import me.chanjar.weixin.cp.bean.WxCpUserDetail; import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder; +import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_PRIVATEINFO; +import static me.chanjar.weixin.common.api.WxConsts.OAuth2Scope.SNSAPI_USERINFO; + /** *
- *
+ * oauth2相关接口实现类.
  * Created by Binary Wang on 2017-6-25.
- * @author Binary Wang
- *
- * @author Binary Wang
  * 
+ * + * @author Binary Wang */ +@AllArgsConstructor public class WxCpOAuth2ServiceImpl implements WxCpOAuth2Service { - private WxCpService mainService; - - public WxCpOAuth2ServiceImpl(WxCpService mainService) { - this.mainService = mainService; - } + private final WxCpService mainService; @Override public String buildAuthorizationUrl(String state) { @@ -43,50 +44,49 @@ public class WxCpOAuth2ServiceImpl implements WxCpOAuth2Service { @Override public String buildAuthorizationUrl(String redirectUri, String state, String scope) { - StringBuilder url = new StringBuilder("https://open.weixin.qq.com/connect/oauth2/authorize?"); - url.append("appid=").append(this.mainService.getWxCpConfigStorage().getCorpId()); + StringBuilder url = new StringBuilder(WxCpOAuth2Service.URL_OAUTH_2_AUTHORIZE); + url.append("?appid=").append(this.mainService.getWxCpConfigStorage().getCorpId()); url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectUri)); url.append("&response_type=code"); url.append("&scope=").append(scope); - if (WxConsts.OAuth2Scope.SNSAPI_PRIVATEINFO.equals(scope) - || WxConsts.OAuth2Scope.SNSAPI_USERINFO.equals(scope)) { + if (SNSAPI_PRIVATEINFO.equals(scope) || SNSAPI_USERINFO.equals(scope)) { url.append("&agentid=").append(this.mainService.getWxCpConfigStorage().getAgentId()); } if (state != null) { url.append("&state=").append(state); } + url.append("#wechat_redirect"); return url.toString(); } @Override - public String[] getUserInfo(String code) throws WxErrorException { + public WxCpOauth2UserInfo getUserInfo(String code) throws WxErrorException { return this.getUserInfo(this.mainService.getWxCpConfigStorage().getAgentId(), code); } @Override - public String[] getUserInfo(Integer agentId, String code) throws WxErrorException { - String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?code=%s&agentid=%d", - code, agentId); - String responseText = this.mainService.get(url, null); + public WxCpOauth2UserInfo getUserInfo(Integer agentId, String code) throws WxErrorException { + String responseText = this.mainService.get(String.format(WxCpOAuth2Service.URL_GET_USER_INFO, code, agentId), null); JsonElement je = new JsonParser().parse(responseText); JsonObject jo = je.getAsJsonObject(); - return new String[]{GsonHelper.getString(jo, "UserId"), - GsonHelper.getString(jo, "DeviceId"), - GsonHelper.getString(jo, "OpenId"), - GsonHelper.getString(jo, "user_ticket"), - GsonHelper.getString(jo, "expires_in") - }; + + return WxCpOauth2UserInfo.builder() + .userId(GsonHelper.getString(jo, "UserId")) + .deviceId(GsonHelper.getString(jo, "DeviceId")) + .openId(GsonHelper.getString(jo, "OpenId")) + .userTicket(GsonHelper.getString(jo, "user_ticket")) + .expiresIn(GsonHelper.getString(jo, "expires_in")) + .build(); } @Override public WxCpUserDetail getUserDetail(String userTicket) throws WxErrorException { - String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail"; JsonObject param = new JsonObject(); param.addProperty("user_ticket", userTicket); - String responseText = this.mainService.post(url, param.toString()); + String responseText = this.mainService.post(WxCpOAuth2Service.URL_GET_USER_DETAIL, param.toString()); return WxCpGsonBuilder.create().fromJson(responseText, WxCpUserDetail.class); } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpOauth2UserInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpOauth2UserInfo.java new file mode 100644 index 00000000..9122f18d --- /dev/null +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpOauth2UserInfo.java @@ -0,0 +1,28 @@ +package me.chanjar.weixin.cp.bean; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + *
+ *  用oauth2获取用户信息的结果类
+ *  Created by BinaryWang on 2019/5/26.
+ * 
+ * + * @author Binary Wang + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class WxCpOauth2UserInfo { + private String openId; + private String deviceId; + private String userId; + private String userTicket; + private String expiresIn; +} diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImplTest.java index 21801e4b..4df87563 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpOAuth2ServiceImplTest.java @@ -4,10 +4,13 @@ import com.google.inject.Inject; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.cp.api.ApiTestModule; import me.chanjar.weixin.cp.api.WxCpService; +import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo; import me.chanjar.weixin.cp.bean.WxCpUserDetail; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import static org.assertj.core.api.Assertions.assertThat; + /** *
  *  Created by BinaryWang on 2018/4/22.
@@ -28,6 +31,13 @@ public class WxCpOAuth2ServiceImplTest {
 
   @Test
   public void testGetUserInfo() throws WxErrorException {
-    this.wxService.getOauth2Service().getUserInfo("abc");
+    final WxCpOauth2UserInfo result = this.wxService.getOauth2Service().getUserInfo("abc");
+    assertThat(result).isNotNull();
+    System.out.println(result);
   }
+
+  @Test
+  public void testBuildAuthorizationUrl() {
+  }
+
 }
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
index d652884b..14d933da 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.cp.demo;
 
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
 
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -30,9 +31,9 @@ public class WxCpOAuth2Servlet extends HttpServlet {
       response.getWriter().println("

code

"); response.getWriter().println(code); - String[] res = this.wxCpService.getOauth2Service().getUserInfo(code); + WxCpOauth2UserInfo res = this.wxCpService.getOauth2Service().getUserInfo(code); response.getWriter().println("

result

"); - response.getWriter().println(Arrays.toString(res)); + response.getWriter().println(res); } catch (WxErrorException e) { e.printStackTrace(); }