From 806447abf1c207f979cc9077e207ae562b49ec69 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Fri, 28 Nov 2014 16:22:02 +0800 Subject: [PATCH] =?UTF-8?q?issue=20#39=20=E4=BC=81=E4=B8=9A=E5=8F=B7?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0oauth2=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/api/WxCpConfigStorage.java | 2 + .../cp/api/WxCpInMemoryConfigStorage.java | 11 +++ .../me/chanjar/weixin/cp/api/WxCpService.java | 20 +++++ .../weixin/cp/api/WxCpServiceImpl.java | 35 ++++++++ .../weixin/cp/demo/WxCpDemoServer.java | 81 ++++++++++++++++++- ...oServlet.java => WxCpEndpointServlet.java} | 47 +++-------- .../weixin/cp/demo/WxCpOAuth2Servlet.java | 48 +++++++++++ .../src/test/resources/test-config.sample.xml | 1 + .../mp/api/WxMpInMemoryConfigStorage.java | 3 +- .../weixin/mp/demo/WxMpDemoServer.java | 3 - .../weixin/mp/demo/WxMpOAuth2Servlet.java | 3 - 11 files changed, 206 insertions(+), 48 deletions(-) rename weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/{WxCpDemoServlet.java => WxCpEndpointServlet.java} (56%) create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java index 7837a6f4..36c9cfba 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpConfigStorage.java @@ -27,6 +27,8 @@ public interface WxCpConfigStorage { public int getExpiresIn(); + public String getOauth2redirectUri(); + public String getHttp_proxy_host(); public int getHttp_proxy_port(); diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java index 49e5f392..9ff1f187 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java @@ -18,6 +18,8 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { protected String agentId; protected int expiresIn; + protected String oauth2redirectUri; + protected String http_proxy_host; protected int http_proxy_port; protected String http_proxy_username; @@ -88,6 +90,15 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { this.agentId = agentId; } + @Override + public String getOauth2redirectUri() { + return this.oauth2redirectUri; + } + + public void setOauth2redirectUri(String oauth2redirectUri) { + this.oauth2redirectUri = oauth2redirectUri; + } + public String getHttp_proxy_host() { return http_proxy_host; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java index 1355f17a..7de0d779 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java @@ -274,6 +274,26 @@ public interface WxCpService { */ public void tagAddUsers(String tagId, List userIds) throws WxErrorException; + /** + *
+   * 构造oauth2授权的url连接
+   * 详情请见: http://qydev.weixin.qq.com/wiki/index.php?title=企业获取code
+   * 
+ * @param state + * @return code + */ + public String oauth2buildAuthorizationUrl(String state); + + /** + *
+   * 用oauth2获取用户信息
+   * http://qydev.weixin.qq.com/wiki/index.php?title=根据code获取成员信息
+   * 
+ * @param code + * @return [userid, deviceid] + */ + public String[] oauth2getUserInfo(String code) throws WxErrorException; + /** * 移除标签成员 * diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java index ba4d26e3..c83d4b55 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpServiceImpl.java @@ -316,6 +316,41 @@ public class WxCpServiceImpl implements WxCpService { execute(new SimplePostRequestExecutor(), url, jsonObject.toString()); } + @Override + public String oauth2buildAuthorizationUrl(String state) { + String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" ; + url += "appid=" + wxCpConfigStorage.getCorpId(); + url += "&redirect_uri=" + URIUtil.encodeURIComponent(wxCpConfigStorage.getOauth2redirectUri()); + url += "&response_type=code"; + url += "&scope=snsapi_base"; + if (state != null) { + url += "&state=" + state; + } + url += "#wechat_redirect"; + return url; + } + + @Override + public String[] oauth2getUserInfo(String code) throws WxErrorException { + String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?"; + url += "access_token=" + wxCpConfigStorage.getAccessToken(); + url += "&code=" + code; + url += "agendid=" + wxCpConfigStorage.getAgentId(); + + try { + RequestExecutor executor = new SimpleGetRequestExecutor(); + String responseText = executor.execute(getHttpclient(), httpProxy, url, null); + JsonElement je = Streams.parse(new JsonReader(new StringReader(responseText))); + JsonObject jo = je.getAsJsonObject(); + return new String[] {GsonHelper.getString(jo, "UserId"), GsonHelper.getString(jo, "DeviceId")}; + } catch (ClientProtocolException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String get(String url, String queryParam) throws WxErrorException { return execute(new SimpleGetRequestExecutor(), url, queryParam); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java index b56d1780..12b7609d 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java @@ -1,20 +1,93 @@ package me.chanjar.weixin.cp.demo; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.cp.api.*; +import me.chanjar.weixin.cp.bean.WxCpXmlMessage; +import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; +import me.chanjar.weixin.cp.bean.WxCpXmlOutTextMessage; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import javax.xml.bind.JAXBException; +import java.io.InputStream; +import java.util.Map; -/** - * @author Daniel Qian - */ public class WxCpDemoServer { + + private static WxCpConfigStorage wxCpConfigStorage; + private static WxCpService wxCpService; + private static WxCpMessageRouter wxCpMessageRouter; + public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletHandler handler = new ServletHandler(); server.setHandler(handler); - handler.addServletWithMapping(WxCpDemoServlet.class, "/*"); + ServletHolder endpointServletHolder = new ServletHolder(new WxCpEndpointServlet(wxCpConfigStorage, wxCpService, wxCpMessageRouter)); + handler.addServletWithMapping(endpointServletHolder, "/*"); + + ServletHolder oauthServletHolder = new ServletHolder(new WxCpOAuth2Servlet(wxCpService)); + handler.addServletWithMapping(oauthServletHolder, "/oauth2/*"); + server.start(); server.join(); } + + private static void init() { + try { + InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); + WxCpDemoInMemoryConfigStorage config = WxCpDemoInMemoryConfigStorage.fromXml(is1); + + wxCpConfigStorage = config; + wxCpService = new WxCpServiceImpl(); + wxCpService.setWxCpConfigStorage(config); + + WxCpMessageHandler handler = new WxCpMessageHandler() { + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, + WxCpService wxCpService) { + WxCpXmlOutTextMessage m = WxCpXmlOutMessage + .TEXT() + .content("测试加密消息") + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()) + .build(); + return m; + } + }; + + WxCpMessageHandler oauth2handler = new WxCpMessageHandler() { + @Override + public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, + WxCpService wxCpService) { + String href = "测试oauth2"; + return WxCpXmlOutMessage + .TEXT() + .content(href) + .fromUser(wxMessage.getToUserName()) + .toUser(wxMessage.getFromUserName()).build(); + } + }; + + wxCpMessageRouter = new WxCpMessageRouter(wxCpService); + wxCpMessageRouter + .rule() + .async(false) + .content("哈哈") // 拦截内容为“哈哈”的消息 + .handler(handler) + .end() + .rule() + .async(false) + .content("oauth") + .handler(oauth2handler) + .end() + ; + + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServlet.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java similarity index 56% rename from weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServlet.java rename to weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java index 16413a3d..320cc540 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpDemoServlet.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpEndpointServlet.java @@ -19,49 +19,21 @@ import java.util.Map; /** * @author Daniel Qian */ -public class WxCpDemoServlet extends HttpServlet { +public class WxCpEndpointServlet extends HttpServlet { protected WxCpConfigStorage wxCpConfigStorage; protected WxCpService wxCpService; protected WxCpMessageRouter wxCpMessageRouter; - @Override public void init() throws ServletException { - // - super.init(); - try { - InputStream is1 = ClassLoader.getSystemResourceAsStream("test-config.xml"); - WxCpDemoInMemoryConfigStorage config = WxCpDemoInMemoryConfigStorage.fromXml(is1); - - wxCpConfigStorage = config; - wxCpService = new WxCpServiceImpl(); - wxCpService.setWxCpConfigStorage(config); - - WxCpMessageHandler handler = new WxCpMessageHandler() { - @Override public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService) { - WxCpXmlOutTextMessage m = WxCpXmlOutMessage - .TEXT() - .content("测试加密消息") - .fromUser(wxMessage.getToUserName()) - .toUser(wxMessage.getFromUserName()) - .build(); - return m; - } - }; - - wxCpMessageRouter = new WxCpMessageRouter(wxCpService); - wxCpMessageRouter - .rule() - .async(false) - .content("哈哈") // 拦截内容为“哈哈”的消息 - .handler(handler) - .end(); - - } catch (JAXBException e) { - throw new RuntimeException(e); - } + public WxCpEndpointServlet(WxCpConfigStorage wxCpConfigStorage, WxCpService wxCpService, + WxCpMessageRouter wxCpMessageRouter) { + this.wxCpConfigStorage = wxCpConfigStorage; + this.wxCpService = wxCpService; + this.wxCpMessageRouter = wxCpMessageRouter; } - @Override protected void service(HttpServletRequest request, HttpServletResponse response) + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); @@ -85,7 +57,8 @@ public class WxCpDemoServlet extends HttpServlet { return; } - WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(request.getInputStream(), wxCpConfigStorage, timestamp, nonce, msgSignature); + WxCpXmlMessage inMessage = WxCpXmlMessage + .fromEncryptedXml(request.getInputStream(), wxCpConfigStorage, timestamp, nonce, msgSignature); WxCpXmlOutMessage outMessage = wxCpMessageRouter.route(inMessage); if (outMessage != null) { response.getWriter().write(outMessage.toEncryptedXml(wxCpConfigStorage)); 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 new file mode 100644 index 00000000..02b1bf5d --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/demo/WxCpOAuth2Servlet.java @@ -0,0 +1,48 @@ +package me.chanjar.weixin.cp.demo; + +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.cp.api.WxCpService; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; + +/** + * Created by qianjia on 14/11/28. + */ +public class WxCpOAuth2Servlet extends HttpServlet { + + protected WxCpService wxCpService; + + public WxCpOAuth2Servlet(WxCpService wxCpService) { + this.wxCpService = wxCpService; + } + + @Override protected void service(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + String code = request.getParameter("code"); + try { + response.getWriter().println("

code

"); + response.getWriter().println(code); + + String[] res = wxCpService.oauth2getUserInfo(code); + response.getWriter().println("

result

"); + response.getWriter().println(Arrays.toString(res)); + } catch (WxErrorException e) { + e.printStackTrace(); + } + + response.getWriter().flush(); + response.getWriter().close(); + + } + + +} diff --git a/weixin-java-cp/src/test/resources/test-config.sample.xml b/weixin-java-cp/src/test/resources/test-config.sample.xml index c30d7e35..02c98f3f 100644 --- a/weixin-java-cp/src/test/resources/test-config.sample.xml +++ b/weixin-java-cp/src/test/resources/test-config.sample.xml @@ -9,4 +9,5 @@ 企业号通讯录里的某个userid 企业号通讯录的某个部门id 企业号通讯录里的某个tagid + 网页授权获取用户信息回调地址 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java index 4e43dfa1..82c3d621 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java @@ -16,11 +16,12 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { protected String aesKey; protected int expiresIn; + protected String oauth2redirectUri; + protected String http_proxy_host; protected int http_proxy_port; protected String http_proxy_username; protected String http_proxy_password; - protected String oauth2redirectUri; public void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java index 922c42a1..21d1ce4a 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpDemoServer.java @@ -16,9 +16,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; -/** - * @author Daniel Qian - */ public class WxMpDemoServer { private static WxMpConfigStorage wxMpConfigStorage; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java index 0b6a612a..6ddf4ad3 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/WxMpOAuth2Servlet.java @@ -22,9 +22,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Map; -/** - * @author Daniel Qian - */ public class WxMpOAuth2Servlet extends HttpServlet { protected WxMpService wxMpService;