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 5f3d6daa8..c6d9063fb 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 3507de076..6ff91fc35 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 000000000..9122f18d3
--- /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 21801e4b4..4df875633 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 d652884b6..14d933da8 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();
}