From a86c8ebfbb296d01f097f54c1b87e959922ec192 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 6 Sep 2016 18:42:34 +0800 Subject: [PATCH 1/5] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8fbe9ac48..8b402e7f3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Weixin Java Tools 微信公众号/企业号开发Java SDK -## [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) +## [![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badge/) ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) [![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) ### 声明:本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。 @@ -11,9 +11,9 @@ ### 详细开发文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。 =========== ## 开发交流工具: -* QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) -* 注意:为保证入群成员质量,请申请入群时认真输入Github帐号ID,即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,谢谢~ * 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码。 +* QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) +* ***注意:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,谢谢~*** =========== From f157963a87af87c5e765df623748363c5976374e Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 6 Sep 2016 18:58:31 +0800 Subject: [PATCH 2/5] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b402e7f3..1a49fb67b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,8 @@ ## 开发交流工具: * 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码。 * QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) -* ***注意:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,谢谢~*** +* ***注意:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像查看,如下图Signed in as下方黄色标识内容即是:*** +![github_id](https://raw.githubusercontent.com/wechat-group/weixin-java-tools/develop/res/github_id.png) =========== From 04ca89a4c7c3fb16295b73d23351ab0b2eb398ef Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 6 Sep 2016 18:59:12 +0800 Subject: [PATCH 3/5] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a49fb67b..c6a776c9f 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ * 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码。 * QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) * ***注意:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像查看,如下图Signed in as下方黄色标识内容即是:*** -![github_id](https://raw.githubusercontent.com/wechat-group/weixin-java-tools/develop/res/github_id.png) +* ![github_id](https://raw.githubusercontent.com/wechat-group/weixin-java-tools/develop/res/github_id.png) =========== From 4732f2112118ea1fb60412f5b66af74db0ec0963 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 6 Sep 2016 19:08:00 +0800 Subject: [PATCH 4/5] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c6a776c9f..a546f16d0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ ### 声明:本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。 ### 最新更新:2.1.0版发布!!! on 2016-08-31 -#### 自2.0.0版本以来,接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到2.X.X版本。 + +#### ***自2.0.0版本以来,接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到2.X.X版本.*** --- ### 详细开发文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。 From f5273ba732f815b792e8b360d0d23f06907ad396 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 7 Sep 2016 20:04:55 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E6=9E=84=E9=80=A0=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BD=91=E7=AB=99=E5=BA=94=E7=94=A8=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E7=99=BB=E5=BD=95=E7=9A=84url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/api/WxConsts.java | 6 + .../me/chanjar/weixin/mp/api/WxMpService.java | 14 ++ .../weixin/mp/api/impl/WxMpServiceImpl.java | 17 ++ .../chanjar/weixin/mp/api/ApiTestModule.java | 9 + .../weixin/mp/api/WxMpMiscAPITest.java | 2 +- .../mp/api/impl/WxMpServiceImplTest.java | 162 ++++++++++++++++++ .../src/test/resources/test-config.sample.xml | 1 + 7 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java index e45643b77..ce2a16a48 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java @@ -164,6 +164,12 @@ public class WxConsts { * 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息 */ public static final String OAUTH2_SCOPE_USER_INFO = "snsapi_userinfo"; + + /** + * 网页应用登录授权作用域 snsapi_login + */ + public static final String QRCONNECT_SCOPE_SNSAPI_LOGIN = "snsapi_login"; + /////////////////////// // 永久素材类型 /////////////////////// diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 7acd2342f..ab205a031 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -152,6 +152,20 @@ public interface WxMpService { */ WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException; + /** + *
+   * 构造第三方使用网站应用授权登录的url
+   * 详情请见: 网站应用微信登录开发指南
+   * URL格式为:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
+   * 
+ * + * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode + * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可 + * @param state 非必填,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验 + * @return url + */ + String buildQrConnectUrl(String redirectURI, String scope, String state); + /** *
    * 构造oauth2授权的url连接
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
index 43777c162..b3f52ed81 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java
@@ -282,6 +282,23 @@ public class WxMpServiceImpl implements WxMpService {
     return url.toString();
   }
 
+  @Override
+  public String buildQrConnectUrl(String redirectURI, String scope,
+      String state) {
+    StringBuilder url = new StringBuilder();
+    url.append("https://open.weixin.qq.com/connect/qrconnect?");
+    url.append("appid=").append(this.wxMpConfigStorage.getAppId());
+    url.append("&redirect_uri=").append(URIUtil.encodeURIComponent(redirectURI));
+    url.append("&response_type=code");
+    url.append("&scope=").append(scope);
+    if (state != null) {
+      url.append("&state=").append(state);
+    }
+    
+    url.append("#wechat_redirect");
+    return url.toString();
+  }
+
   private WxMpOAuth2AccessToken getOAuth2AccessToken(StringBuilder url) throws WxErrorException {
     try {
       RequestExecutor executor = new SimpleGetRequestExecutor();
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
index 4980facad..4557c3425 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/ApiTestModule.java
@@ -44,6 +44,7 @@ public class ApiTestModule implements Module {
 
     private String openId;
     private String kfAccount;
+    private String qrconnectRedirectUrl;
 
     public String getOpenId() {
       return this.openId;
@@ -66,6 +67,14 @@ public class ApiTestModule implements Module {
       this.kfAccount = kfAccount;
     }
 
+    public String getQrconnectRedirectUrl() {
+      return this.qrconnectRedirectUrl;
+    }
+
+    public void setQrconnectRedirectUrl(String qrconnectRedirectUrl) {
+      this.qrconnectRedirectUrl = qrconnectRedirectUrl;
+    }
+
   }
 
 }
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
index 3d80836f9..de0725ea2 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
@@ -23,7 +23,7 @@ public class WxMpMiscAPITest {
 
   @Test
   public void testGetCallbackIP() throws WxErrorException {
-    String[] ipArray = wxService.getCallbackIP();
+    String[] ipArray = this.wxService.getCallbackIP();
     System.out.println(Arrays.toString(ipArray));
     Assert.assertNotNull(ipArray);
     Assert.assertNotEquals(ipArray.length, 0);
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
new file mode 100644
index 000000000..5791367bd
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImplTest.java
@@ -0,0 +1,162 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.inject.Inject;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.mp.api.ApiTestModule;
+import me.chanjar.weixin.mp.api.ApiTestModule.WxXmlMpInMemoryConfigStorage;
+
+import org.testng.Assert;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMpServiceImplTest {
+
+  @Inject
+  private WxMpServiceImpl wxService;
+
+  @Test
+  public void testCheckSignature() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetAccessToken() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetAccessTokenBoolean() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetJsapiTicket() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetJsapiTicketBoolean() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testCreateJsapiSignature() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testCustomMessageSend() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testMassNewsUpload() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testMassVideoUpload() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testMassGroupMessageSend() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testMassOpenIdsMessageSend() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testMassMessagePreview() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testShortUrl() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testTemplateSend() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testSetIndustry() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetIndustry() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testSemanticQuery() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testOauth2buildAuthorizationUrl() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testBuildQrConnectUrl() {
+    String qrConnectUrl = this.wxService
+        .buildQrConnectUrl(
+            ((WxXmlMpInMemoryConfigStorage) this.wxService
+                .getWxMpConfigStorage()).getOauth2redirectUri(),
+            WxConsts.QRCONNECT_SCOPE_SNSAPI_LOGIN, null);
+    Assert.assertNotNull(qrConnectUrl);
+    System.out.println(qrConnectUrl);
+  }
+
+  @Test
+  public void testOauth2getAccessToken() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testOauth2refreshAccessToken() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testOauth2getUserInfo() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testOauth2validateAccessToken() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGetCallbackIP() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testGet() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testPost() {
+    Assert.fail("Not yet implemented");
+  }
+
+  @Test
+  public void testExecute() {
+    Assert.fail("Not yet implemented");
+  }
+
+}
diff --git a/weixin-java-mp/src/test/resources/test-config.sample.xml b/weixin-java-mp/src/test/resources/test-config.sample.xml
index 1f79bea2c..836b26c4a 100644
--- a/weixin-java-mp/src/test/resources/test-config.sample.xml
+++ b/weixin-java-mp/src/test/resources/test-config.sample.xml
@@ -7,5 +7,6 @@
     可以不填写
     某个加你公众号的用户的openId
     网页授权获取用户信息回调地址
+    网页应用授权登陆回调地址
     完整客服账号,格式为:账号前缀@公众号微信号