From db896f158e5d815253651557ca63fbe02544795d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 21 Sep 2016 11:17:22 +0800 Subject: [PATCH 01/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a546f16d0..f061f5b09 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Weixin Java Tools 微信公众号/企业号开发Java SDK -## [![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/wechat-group/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/wechat-group/weixin-java-tools) ### 声明:本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。 From 73b38ab7853f6ed53db5e030038dd6cfeb035e60 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 26 Sep 2016 18:43:58 +0800 Subject: [PATCH 02/43] Update README.md --- README.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index f061f5b09..4c0909308 100644 --- a/README.md +++ b/README.md @@ -20,16 +20,16 @@ =========== ## 版本说明 -* 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request。 -* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版)。 -* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问如下地址查看所有最新的版本: -- [【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) -- [【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) - +* 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; +* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); +* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) [【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) +分别查看所有最新的版本。 ## Maven & Gradle * 公众号(订阅号、服务号): + +maven: ```xml com.github.binarywang @@ -37,12 +37,14 @@ 2.1.0 ``` - +gradle: ```groovy compile 'com.github.binarywang:weixin-java-mp:2.1.0' ``` * 企业号: + +maven: ```xml com.github.binarywang @@ -50,7 +52,7 @@ compile 'com.github.binarywang:weixin-java-mp:2.1.0' 2.1.0 ``` - +gradle: ```groovy compile 'com.github.binarywang:weixin-java-cp:2.1.0' ``` @@ -63,16 +65,14 @@ compile 'com.github.binarywang:weixin-java-cp:2.1.0' * https://git.coding.net/binarywang/weixin-java-tools.git -## 目前可参考的Demo项目: -* https://github.com/wechat-group/weixin-java-tools-springmvc -* https://github.com/wechat-group/weixin-mp-demo -* ===========以下为备份仓库,会保持跟主仓库同步 -* http://git.oschina.net/binary/weixin-mp-demo -* https://bitbucket.org/binarywang/weixin-mp-demo +## 目前可参考的Demo项目有两个: +1. https://github.com/wechat-group/weixin-mp-demo +1. https://github.com/wechat-group/weixin-java-tools-springmvc ## 关于代码贡献 +* 非常欢迎和感谢对本项目发起Pull Request的同学,本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 +* 为了便于设置,本项目引入editorconfig插件,请使用eclipse的同学在贡献代码前安装相关插件,IntelliJ IDEA则自带支持,无需额外安装插件。 +* 本项目可以采用两种方式接受代码贡献: -* 非常欢迎和感谢对本项目发起Pull Request的同学,本项目可以采用两种方式接受代码贡献: -* 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 -* 另外一种贡献代码的方式就是加入SDK Developers开发组,如果对自己的代码足够自信,可以随时提交代码,注意要随时进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 -* 本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 +1. 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 +1. 另外一种贡献代码的方式就是加入SDK Developers开发组,如果对自己的代码足够自信,可以随时提交代码,注意要随时进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 From af924030d79346e31f8e5b004fb4fe3901b17edf Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 28 Sep 2016 10:11:49 +0800 Subject: [PATCH 03/43] Update README.md --- README.md | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4c0909308..93da5c677 100644 --- a/README.md +++ b/README.md @@ -2,27 +2,26 @@ ## [![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/wechat-group/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/wechat-group/weixin-java-tools) -### 声明:本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。 +### 注意: +1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** +1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. 最新更新:2016-08-31 发布2.1.0正式版! -### 最新更新:2.1.0版发布!!! on 2016-08-31 - -#### ***自2.0.0版本以来,接口调整比较大,主要是公众号的调整,企业号无过多调整,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。所以如果习惯于1.X.X版本的同学不想做过多更改的话,请慎重考虑升级到2.X.X版本.*** ---- - -### 详细开发文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。 =========== -## 开发交流工具: -* 微信群: 因二维码有时间限制,如有想加入微信群的,请入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) - + +## 开发交流方式: +1. ***入群须知:为保证入群成员质量,请申请入群前,先Star本项目,然后在申请入群时,输入您的Github帐号ID,以便管理员核对,ID即你的github主页地址https://github.com/XXXX 中最后的部分XXXX的内容,或者在github网页右上角点击头像后查看Signed in as后方内容。*** +1. QQ群:343954419 [![Join QQ Group](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=078f7a153d243853e24cf2b542e7a6ccbf2a592bc138080f84d11297f736ec46) +1. 微信群: 因二维码有时间限制,如有想加入微信群的,请入QQ群后咨询获取最新入群二维码; +1. 有功能需求或由于微信官方接口调整导致的代码问题,可以直接提出issue,便于讨论追踪问题; +1. 详细开发文档请看 [Wiki](https://github.com/wechat-group/weixin-java-tools/wiki)。 + =========== ## 版本说明 * 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; * BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); -* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) [【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) +* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) 分别查看所有最新的版本。 ## Maven & Gradle From 74a0ada3f11f3685965165159c0d2378ceb4ed6b Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 15:57:43 +0800 Subject: [PATCH 04/43] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E4=BD=9C=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/api/WxMpCardService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java index 80bf38a6a..d4a36c65b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java @@ -6,8 +6,7 @@ import me.chanjar.weixin.mp.bean.result.WxMpCardResult; /** * 卡券相关接口 - * Created by Binary Wang on 2016/7/27. - * @author binarywang(https://github.com/binarywang) + * @author YuJian(mgcnrx11@hotmail.com) on 01/11/2016 */ public interface WxMpCardService { From 1352385328f133796d1a56d163c51ef493ab1009 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 18:47:03 +0800 Subject: [PATCH 05/43] =?UTF-8?q?=E7=A7=BB=E9=99=A4Group=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpGroupService.java | 71 ---------------- .../me/chanjar/weixin/mp/api/WxMpService.java | 8 -- .../mp/api/impl/WxMpGroupServiceImpl.java | 84 ------------------- .../weixin/mp/api/impl/WxMpServiceImpl.java | 72 ++++------------ .../mp/api/impl/WxMpGroupServiceImplTest.java | 62 -------------- weixin-java-mp/src/test/resources/testng.xml | 3 - 6 files changed, 17 insertions(+), 283 deletions(-) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGroupService.java delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java delete mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGroupService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGroupService.java deleted file mode 100644 index 22255d36e..000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpGroupService.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.chanjar.weixin.mp.api; - -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.WxMpGroup; - -import java.util.List; - -/** - * 用户分组相关操作接口 - * @author Binary Wang - * 分组接口属于老接口,不知道啥时候被替换成用户标签接口 - * - */ -@Deprecated -public interface WxMpGroupService { - - - /** - *
-   * 分组管理接口 - 创建分组
-   * 最多支持创建500个分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
-   * 
- * - * @param name 分组名字(30个字符以内) - */ - WxMpGroup groupCreate(String name) throws WxErrorException; - - /** - *
-   * 分组管理接口 - 查询所有分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
-   * 
- */ - List groupGet() throws WxErrorException; - - /** - *
-   * 分组管理接口 - 查询用户所在分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
-   * 
- * - * @param openid 微信用户的openid - */ - long userGetGroup(String openid) throws WxErrorException; - - /** - *
-   * 分组管理接口 - 修改分组名
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
-   *
-   * 如果id为0(未分组),1(黑名单),2(星标组),或者不存在的id,微信会返回系统繁忙的错误
-   * 
- * - * @param group 要更新的group,group的id,name必须设置 - */ - void groupUpdate(WxMpGroup group) throws WxErrorException; - - /** - *
-   * 分组管理接口 - 移动用户分组
-   * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=分组管理接口
-   *
-   * 如果to_groupid为0(未分组),1(黑名单),2(星标组),或者不存在的id,微信会返回系统繁忙的错误
-   * 
- * - * @param openid 用户openid - * @param to_groupid 移动到的分组id - */ - void userUpdateGroup(String openid, long to_groupid) throws WxErrorException; -} 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 3b7f2125a..5eca11927 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 @@ -322,14 +322,6 @@ public interface WxMpService { */ WxMpUserService getUserService(); - /** - * 返回用户分组相关接口方法的实现类对象,以方便调用个其各种接口 - * - * @return WxMpGroupService - */ - - WxMpGroupService getGroupService(); - /** * 返回用户标签相关接口方法的实现类对象,以方便调用个其各种接口 * diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java deleted file mode 100644 index bfceff616..000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.chanjar.weixin.mp.api.impl; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; -import me.chanjar.weixin.common.util.json.GsonHelper; -import me.chanjar.weixin.mp.api.WxMpGroupService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.WxMpGroup; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.util.List; - -/** - * Created by Binary Wang on 2016/7/21. - */ -@Deprecated -public class WxMpGroupServiceImpl implements WxMpGroupService { - private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/groups"; - private WxMpService wxMpService; - - public WxMpGroupServiceImpl(WxMpService wxMpService) { - this.wxMpService = wxMpService; - } - - @Override - public WxMpGroup groupCreate(String name) throws WxErrorException { - String url = API_URL_PREFIX + "/create"; - JsonObject json = new JsonObject(); - JsonObject groupJson = new JsonObject(); - json.add("group", groupJson); - groupJson.addProperty("name", name); - - String responseContent = this.wxMpService.execute( - new SimplePostRequestExecutor(), - url, - json.toString()); - return WxMpGroup.fromJson(responseContent); - } - - @Override - public List groupGet() throws WxErrorException { - String url = API_URL_PREFIX + "/get"; - String responseContent = this.wxMpService.execute(new SimpleGetRequestExecutor(), url, null); - /* - * 操蛋的微信API,创建时返回的是 { group : { id : ..., name : ...} } - * 查询时返回的是 { groups : [ { id : ..., name : ..., count : ... }, ... ] } - */ - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return WxMpGsonBuilder.INSTANCE.create().fromJson(tmpJsonElement.getAsJsonObject().get("groups"), - new TypeToken>() { - }.getType()); - } - - @Override - public long userGetGroup(String openid) throws WxErrorException { - String url = API_URL_PREFIX + "/getid"; - JsonObject o = new JsonObject(); - o.addProperty("openid", openid); - String responseContent = this.wxMpService.execute(new SimplePostRequestExecutor(), url, o.toString()); - JsonElement tmpJsonElement = new JsonParser().parse(responseContent); - return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("groupid")); - } - - @Override - public void groupUpdate(WxMpGroup group) throws WxErrorException { - String url = API_URL_PREFIX + "/update"; - this.wxMpService.execute(new SimplePostRequestExecutor(), url, group.toJson()); - } - - @Override - public void userUpdateGroup(String openid, long to_groupid) throws WxErrorException { - String url = API_URL_PREFIX + "/members/update"; - JsonObject json = new JsonObject(); - json.addProperty("openid", openid); - json.addProperty("to_groupid", to_groupid); - this.wxMpService.execute(new SimplePostRequestExecutor(), url, json.toString()); - } - -} 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 ba3fcdfc2..ef1f8e879 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 @@ -1,7 +1,21 @@ package me.chanjar.weixin.mp.api.impl; -import java.io.IOException; - +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.StandardSessionManager; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.common.util.RandomUtils; +import me.chanjar.weixin.common.util.crypto.SHA1; +import me.chanjar.weixin.common.util.http.*; +import me.chanjar.weixin.mp.api.*; +import me.chanjar.weixin.mp.bean.*; +import me.chanjar.weixin.mp.bean.result.*; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -13,52 +27,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -import me.chanjar.weixin.common.bean.WxAccessToken; -import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.StandardSessionManager; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.common.util.RandomUtils; -import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; -import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder; -import me.chanjar.weixin.common.util.http.RequestExecutor; -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; -import me.chanjar.weixin.common.util.http.URIUtil; -import me.chanjar.weixin.mp.api.WxMpCardService; -import me.chanjar.weixin.mp.api.WxMpConfigStorage; -import me.chanjar.weixin.mp.api.WxMpDataCubeService; -import me.chanjar.weixin.mp.api.WxMpGroupService; -import me.chanjar.weixin.mp.api.WxMpKefuService; -import me.chanjar.weixin.mp.api.WxMpMaterialService; -import me.chanjar.weixin.mp.api.WxMpMenuService; -import me.chanjar.weixin.mp.api.WxMpPayService; -import me.chanjar.weixin.mp.api.WxMpQrcodeService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpStoreService; -import me.chanjar.weixin.mp.api.WxMpUserBlacklistService; -import me.chanjar.weixin.mp.api.WxMpUserService; -import me.chanjar.weixin.mp.api.WxMpUserTagService; -import me.chanjar.weixin.mp.bean.WxMpIndustry; -import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; -import me.chanjar.weixin.mp.bean.WxMpMassNews; -import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; -import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; -import me.chanjar.weixin.mp.bean.WxMpMassVideo; -import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; -import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; -import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; -import me.chanjar.weixin.mp.bean.result.WxMpUser; +import java.io.IOException; public class WxMpServiceImpl implements WxMpService { @@ -86,8 +55,6 @@ public class WxMpServiceImpl implements WxMpService { private WxMpUserService userService = new WxMpUserServiceImpl(this); - private WxMpGroupService groupService = new WxMpGroupServiceImpl(this); - private WxMpUserTagService tagService = new WxMpUserTagServiceImpl(this); private WxMpQrcodeService qrCodeService = new WxMpQrcodeServiceImpl(this); @@ -559,11 +526,6 @@ public class WxMpServiceImpl implements WxMpService { return this.userService; } - @Override - public WxMpGroupService getGroupService() { - return this.groupService; - } - @Override public WxMpUserTagService getUserTagService() { return this.tagService; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java deleted file mode 100644 index 2216e5534..000000000 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.chanjar.weixin.mp.api.impl; - -import com.google.inject.Inject; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.api.ApiTestModule; -import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.WxMpGroup; -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - -import java.util.List; - -/** - * 测试分组接口 - * - * @author chanjarster - */ -@Deprecated -@Test(groups = "groupAPI") -@Guice(modules = ApiTestModule.class) -public class WxMpGroupServiceImplTest { - - @Inject - protected WxMpServiceImpl wxService; - - protected WxMpGroup group; - - public void testGroupCreate() throws WxErrorException { - WxMpGroup res = this.wxService.getGroupService().groupCreate("测试分组1"); - Assert.assertEquals(res.getName(), "测试分组1"); - } - - @Test(dependsOnMethods="testGroupCreate") - public void testGroupGet() throws WxErrorException { - List groupList = this.wxService.getGroupService().groupGet(); - Assert.assertNotNull(groupList); - Assert.assertTrue(groupList.size() > 0); - for (WxMpGroup g : groupList) { - this.group = g; - Assert.assertNotNull(g.getName()); - } - } - - @Test(dependsOnMethods={"testGroupGet", "testGroupCreate"}) - public void getGroupUpdate() throws WxErrorException { - this.group.setName("分组改名"); - this.wxService.getGroupService().groupUpdate(this.group); - } - - public void testGroupQueryUserGroup() throws WxErrorException { - WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage(); - long groupid = this.wxService.getGroupService().userGetGroup(configStorage.getOpenid()); - Assert.assertTrue(groupid != -1l); - } - - public void testGroupMoveUser() throws WxErrorException { - WxXmlMpInMemoryConfigStorage configStorage = (WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage(); - this.wxService.getGroupService().userUpdateGroup(configStorage.getOpenid(), this.wxService.getGroupService().groupGet().get(3).getId()); - } - -} diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml index d821e398f..6d5310ce1 100644 --- a/weixin-java-mp/src/test/resources/testng.xml +++ b/weixin-java-mp/src/test/resources/testng.xml @@ -5,9 +5,6 @@ - - - From f2a858db7a53a46bf0cdcd55e0eabee452e5a0f6 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 19:00:46 +0800 Subject: [PATCH 06/43] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=A7=BB=E9=99=A4group?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E5=90=8E=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/WxMpService.java | 8 +-- .../weixin/mp/api/WxMpUserTagService.java | 15 +++--- .../weixin/mp/api/impl/WxMpServiceImpl.java | 2 +- .../mp/api/impl/WxMpUserTagServiceImpl.java | 25 +++++---- .../me/chanjar/weixin/mp/bean/WxMpGroup.java | 52 ------------------- ...upMessage.java => WxMpMassTagMessage.java} | 25 ++++----- .../chanjar/weixin/mp/bean/tag/WxUserTag.java | 6 +-- .../mp/util/json/WxMpGroupGsonAdapter.java | 49 ----------------- .../weixin/mp/util/json/WxMpGsonBuilder.java | 32 ++++++++++-- ...ava => WxMpMassTagMessageGsonAdapter.java} | 10 ++-- .../weixin/mp/api/WxMpMassMessageAPITest.java | 10 ++-- .../api/impl/WxMpUserTagServiceImplTest.java | 16 +++--- 12 files changed, 89 insertions(+), 161 deletions(-) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/{WxMpMassGroupMessage.java => WxMpMassTagMessage.java} (82%) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java rename weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/{WxMpMassGroupMessageGsonAdapter.java => WxMpMassTagMessageGsonAdapter.java} (85%) 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 5eca11927..292c56450 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 @@ -4,7 +4,7 @@ import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.http.RequestExecutor; import me.chanjar.weixin.mp.bean.WxMpIndustry; -import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; import me.chanjar.weixin.mp.bean.WxMpMassNews; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; @@ -88,7 +88,7 @@ public interface WxMpService { * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 * * - * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassGroupMessage) + * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage) * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage) */ WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException; @@ -99,7 +99,7 @@ public interface WxMpService { * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 * * - * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassGroupMessage) + * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage) * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage) */ WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException; @@ -112,7 +112,7 @@ public interface WxMpService { * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口 * */ - WxMpMassSendResult massGroupMessageSend(WxMpMassGroupMessage message) throws WxErrorException; + WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException; /** *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
index 406842db1..0fcfb40f8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
@@ -1,11 +1,11 @@
 package me.chanjar.weixin.mp.api;
 
+import java.util.List;
+
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.mp.bean.tag.WxTagListUser;
 import me.chanjar.weixin.mp.bean.tag.WxUserTag;
 
-import java.util.List;
-
 /**
  * 用户标签管理相关接口
  * Created by Binary Wang on 2016/9/2.
@@ -44,7 +44,7 @@ public interface WxMpUserTagService {
    * 
* */ - Boolean tagUpdate(Integer id, String name) throws WxErrorException; + Boolean tagUpdate(Long tagId, String name) throws WxErrorException; /** *
@@ -54,7 +54,7 @@ public interface WxMpUserTagService {
    * 
* */ - Boolean tagDelete(Integer id) throws WxErrorException; + Boolean tagDelete(Long tagId) throws WxErrorException; /** *
@@ -64,7 +64,8 @@ public interface WxMpUserTagService {
    * 
* */ - WxTagListUser tagListUser(Integer tagId, String nextOpenid) throws WxErrorException; + WxTagListUser tagListUser(Long tagId, String nextOpenid) + throws WxErrorException; /** *
@@ -74,7 +75,7 @@ public interface WxMpUserTagService {
    * 
* */ - boolean batchTagging(Integer tagId, String[] openids) throws WxErrorException; + boolean batchTagging(Long tagId, String[] openids) throws WxErrorException; /** *
@@ -84,7 +85,7 @@ public interface WxMpUserTagService {
    * 
* */ - boolean batchUntagging(Integer tagId, String[] openids) throws WxErrorException; + boolean batchUntagging(Long tagId, String[] openids) throws WxErrorException; /** 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 ef1f8e879..0a28ce171 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 @@ -190,7 +190,7 @@ public class WxMpServiceImpl implements WxMpService { } @Override - public WxMpMassSendResult massGroupMessageSend(WxMpMassGroupMessage message) throws WxErrorException { + public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; String responseContent = execute(new SimplePostRequestExecutor(), url, message.toJson()); return WxMpMassSendResult.fromJson(responseContent); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index d2bb3213f..3f6a4dbae 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -1,9 +1,16 @@ package me.chanjar.weixin.mp.api.impl; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; + import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -11,11 +18,6 @@ import me.chanjar.weixin.mp.api.WxMpUserTagService; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; /** * @@ -58,7 +60,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public Boolean tagUpdate(Integer id, String name) throws WxErrorException { + public Boolean tagUpdate(Long id, String name) throws WxErrorException { String url = API_URL_PREFIX + "/update"; JsonObject json = new JsonObject(); @@ -78,7 +80,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public Boolean tagDelete(Integer id) throws WxErrorException { + public Boolean tagDelete(Long id) throws WxErrorException { String url = API_URL_PREFIX + "/delete"; JsonObject json = new JsonObject(); @@ -98,7 +100,8 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public WxTagListUser tagListUser(Integer tagId, String nextOpenid) throws WxErrorException { + public WxTagListUser tagListUser(Long tagId, String nextOpenid) + throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/user/tag/get"; JsonObject json = new JsonObject(); @@ -112,7 +115,8 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public boolean batchTagging(Integer tagId, String[] openids) throws WxErrorException { + public boolean batchTagging(Long tagId, String[] openids) + throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging"; JsonObject json = new JsonObject(); @@ -135,7 +139,8 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public boolean batchUntagging(Integer tagId, String[] openids) throws WxErrorException { + public boolean batchUntagging(Long tagId, String[] openids) + throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging"; JsonObject json = new JsonObject(); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java deleted file mode 100644 index 7dfd4cccc..000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpGroup.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.chanjar.weixin.mp.bean; - -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - -import java.io.Serializable; - -/** - * 微信用户分组 - * @author chanjarster - * - */ -public class WxMpGroup implements Serializable { - - /** - * - */ - private static final long serialVersionUID = 1554709708638735270L; - private long id = -1; - private String name; - private long count; - public long getId() { - return this.id; - } - public void setId(long id) { - this.id = id; - } - public String getName() { - return this.name; - } - public void setName(String name) { - this.name = name; - } - public long getCount() { - return this.count; - } - public void setCount(long count) { - this.count = count; - } - - public static WxMpGroup fromJson(String json) { - return WxMpGsonBuilder.create().fromJson(json, WxMpGroup.class); - } - - public String toJson() { - return WxMpGsonBuilder.create().toJson(this); - } - @Override - public String toString() { - return "WxMpGroup [id=" + this.id + ", name=" + this.name + ", count=" + this.count + "]"; - } - -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java similarity index 82% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java index d77605a61..300b4f906 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassGroupMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassTagMessage.java @@ -1,26 +1,23 @@ package me.chanjar.weixin.mp.bean; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; - import java.io.Serializable; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + /** - * 分组群发的消息 + * 按标签群发的消息 * * @author chanjarster */ -public class WxMpMassGroupMessage implements Serializable { +public class WxMpMassTagMessage implements Serializable { - /** - * - */ private static final long serialVersionUID = -6625914040986749286L; - private Long groupId; + private Long tagId; private String msgtype; private String content; private String mediaId; - public WxMpMassGroupMessage() { + public WxMpMassTagMessage() { super(); } @@ -64,16 +61,16 @@ public class WxMpMassGroupMessage implements Serializable { return WxMpGsonBuilder.INSTANCE.create().toJson(this); } - public Long getGroupId() { - return this.groupId; + public Long getTagId() { + return this.tagId; } /** * 如果不设置则就意味着发给所有用户 - * @param groupId + * @param tagId */ - public void setGroupId(Long groupId) { - this.groupId = groupId; + public void setTagId(Long tagId) { + this.tagId = tagId; } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java index d9e07d044..53e247a77 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java @@ -19,7 +19,7 @@ public class WxUserTag { /** * id 标签id,由微信分配 */ - private Integer id; + private Long id; /** * name 标签名,UTF8编码 @@ -47,11 +47,11 @@ public class WxUserTag { this.count = count; } - public Integer getId() { + public Long getId() { return this.id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java deleted file mode 100644 index a6a48ed74..000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGroupGsonAdapter.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. - * - * This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended - * only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction - * arose from modification of the original source, or other redistribution of this source - * is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. - */ -package me.chanjar.weixin.mp.util.json; - -import com.google.gson.*; -import me.chanjar.weixin.common.util.json.GsonHelper; -import me.chanjar.weixin.mp.bean.WxMpGroup; - -import java.lang.reflect.Type; - -public class WxMpGroupGsonAdapter implements JsonSerializer, JsonDeserializer { - - @Override - public JsonElement serialize(WxMpGroup group, Type typeOfSrc, JsonSerializationContext context) { - JsonObject json = new JsonObject(); - JsonObject groupJson = new JsonObject(); - groupJson.addProperty("name", group.getName()); - groupJson.addProperty("id", group.getId()); - groupJson.addProperty("count", group.getCount()); - json.add("group", groupJson); - return json; - } - - @Override - public WxMpGroup deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - WxMpGroup group = new WxMpGroup(); - JsonObject groupJson = json.getAsJsonObject(); - if (json.getAsJsonObject().get("group") != null) { - groupJson = json.getAsJsonObject().get("group").getAsJsonObject(); - } - if (groupJson.get("name") != null && !groupJson.get("name").isJsonNull()) { - group.setName(GsonHelper.getAsString(groupJson.get("name"))); - } - if (groupJson.get("id") != null && !groupJson.get("id").isJsonNull()) { - group.setId(GsonHelper.getAsPrimitiveLong(groupJson.get("id"))); - } - if (groupJson.get("count") != null && !groupJson.get("count").isJsonNull()) { - group.setCount(GsonHelper.getAsPrimitiveLong(groupJson.get("count"))); - } - return group; - } - -} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index ab3d5769f..df63ac648 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -2,10 +2,35 @@ package me.chanjar.weixin.mp.util.json; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import me.chanjar.weixin.mp.bean.*; + +import me.chanjar.weixin.mp.bean.WxMpCard; +import me.chanjar.weixin.mp.bean.WxMpCustomMessage; +import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.WxMpMassNews; +import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; +import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; +import me.chanjar.weixin.mp.bean.WxMpMassVideo; +import me.chanjar.weixin.mp.bean.WxMpMaterialArticleUpdate; +import me.chanjar.weixin.mp.bean.WxMpMaterialNews; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; -import me.chanjar.weixin.mp.bean.result.*; +import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; +import me.chanjar.weixin.mp.bean.result.WxMpCardResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; +import me.chanjar.weixin.mp.bean.result.WxMpMaterialCountResult; +import me.chanjar.weixin.mp.bean.result.WxMpMaterialFileBatchGetResult; +import me.chanjar.weixin.mp.bean.result.WxMpMaterialNewsBatchGetResult; +import me.chanjar.weixin.mp.bean.result.WxMpMaterialUploadResult; +import me.chanjar.weixin.mp.bean.result.WxMpMaterialVideoInfoResult; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpQrCodeTicket; +import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import me.chanjar.weixin.mp.bean.result.WxMpUserBlacklistGetResult; +import me.chanjar.weixin.mp.bean.result.WxMpUserList; public class WxMpGsonBuilder { @@ -15,9 +40,8 @@ public class WxMpGsonBuilder { INSTANCE.disableHtmlEscaping(); INSTANCE.registerTypeAdapter(WxMpCustomMessage.class, new WxMpCustomMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassNews.class, new WxMpMassNewsGsonAdapter()); - INSTANCE.registerTypeAdapter(WxMpMassGroupMessage.class, new WxMpMassGroupMessageGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMpMassTagMessage.class, new WxMpMassTagMessageGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassOpenIdsMessage.class, new WxMpMassOpenIdsMessageGsonAdapter()); - INSTANCE.registerTypeAdapter(WxMpGroup.class, new WxMpGroupGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpUser.class, new WxMpUserGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpUserList.class, new WxUserListGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpMassVideo.class, new WxMpMassVideoAdapter()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java similarity index 85% rename from weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java rename to weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java index 4ad458486..c32fa9f8e 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassGroupMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java @@ -13,22 +13,22 @@ import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; import java.lang.reflect.Type; -public class WxMpMassGroupMessageGsonAdapter implements JsonSerializer { +public class WxMpMassTagMessageGsonAdapter implements JsonSerializer { @Override - public JsonElement serialize(WxMpMassGroupMessage message, Type typeOfSrc, JsonSerializationContext context) { + public JsonElement serialize(WxMpMassTagMessage message, Type typeOfSrc, JsonSerializationContext context) { JsonObject messageJson = new JsonObject(); JsonObject filter = new JsonObject(); - if(null == message.getGroupId()) { + if(null == message.getTagId()) { filter.addProperty("is_to_all", true); } else { filter.addProperty("is_to_all", false); - filter.addProperty("group_id", message.getGroupId()); + filter.addProperty("group_id", message.getTagId()); } messageJson.add("filter", filter); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java index 3f2c28b80..e093d5750 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMassMessageAPITest.java @@ -14,9 +14,9 @@ import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; -import me.chanjar.weixin.mp.bean.WxMpMassGroupMessage; import me.chanjar.weixin.mp.bean.WxMpMassNews; import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; import me.chanjar.weixin.mp.bean.WxMpMassVideo; import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; @@ -68,11 +68,11 @@ public class WxMpMassMessageAPITest { @Test public void testTextMassGroupMessageSend() throws WxErrorException { - WxMpMassGroupMessage massMessage = new WxMpMassGroupMessage(); + WxMpMassTagMessage massMessage = new WxMpMassTagMessage(); massMessage.setMsgtype(WxConsts.MASS_MSG_TEXT); massMessage.setContent("测试群发消息\n欢迎欢迎,热烈欢迎\n换行测试\n超链接:Hello World"); massMessage - .setGroupId(this.wxService.getGroupService().groupGet().get(0).getId()); + .setTagId(this.wxService.getUserTagService().tagGet().get(0).getId()); WxMpMassSendResult massResult = this.wxService .massGroupMessageSend(massMessage); @@ -83,11 +83,11 @@ public class WxMpMassMessageAPITest { @Test(dataProvider="massMessages") public void testMediaMassGroupMessageSend(String massMsgType, String mediaId) throws WxErrorException { - WxMpMassGroupMessage massMessage = new WxMpMassGroupMessage(); + WxMpMassTagMessage massMessage = new WxMpMassTagMessage(); massMessage.setMsgtype(massMsgType); massMessage.setMediaId(mediaId); massMessage - .setGroupId(this.wxService.getGroupService().groupGet().get(0).getId()); + .setTagId(this.wxService.getUserTagService().tagGet().get(0).getId()); WxMpMassSendResult massResult = this.wxService .massGroupMessageSend(massMessage); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 74a6cfc4f..9fc579c99 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -1,15 +1,17 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.inject.Inject; -import me.chanjar.weixin.mp.api.ApiTestModule; -import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.tag.WxTagListUser; -import me.chanjar.weixin.mp.bean.tag.WxUserTag; +import java.util.List; + import org.testng.Assert; import org.testng.annotations.Guice; import org.testng.annotations.Test; -import java.util.List; +import com.google.inject.Inject; + +import me.chanjar.weixin.mp.api.ApiTestModule; +import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.bean.tag.WxTagListUser; +import me.chanjar.weixin.mp.bean.tag.WxUserTag; /** * @@ -22,7 +24,7 @@ public class WxMpUserTagServiceImplTest { @Inject protected WxMpServiceImpl wxService; - private Integer tagId = 2; + private Long tagId = 2L; @Test public void testTagCreate() throws Exception { From d7e35a1c5630f3e357a727ffec4f568b3ef7ff2b Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 19:01:28 +0800 Subject: [PATCH 07/43] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java index c32fa9f8e..6514ed592 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassTagMessageGsonAdapter.java @@ -8,15 +8,16 @@ */ package me.chanjar.weixin.mp.util.json; +import java.lang.reflect.Type; + import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; + import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; -import java.lang.reflect.Type; - public class WxMpMassTagMessageGsonAdapter implements JsonSerializer { @Override @@ -28,7 +29,7 @@ public class WxMpMassTagMessageGsonAdapter implements JsonSerializer Date: Wed, 28 Sep 2016 19:15:38 +0800 Subject: [PATCH 08/43] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/WxMpServiceImpl.java | 82 +++++++++++++------ 1 file changed, 56 insertions(+), 26 deletions(-) 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 0a28ce171..1a7ffe841 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 @@ -1,21 +1,7 @@ package me.chanjar.weixin.mp.api.impl; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import me.chanjar.weixin.common.bean.WxAccessToken; -import me.chanjar.weixin.common.bean.WxJsapiSignature; -import me.chanjar.weixin.common.bean.result.WxError; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.common.session.StandardSessionManager; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.common.util.RandomUtils; -import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.common.util.http.*; -import me.chanjar.weixin.mp.api.*; -import me.chanjar.weixin.mp.bean.*; -import me.chanjar.weixin.mp.bean.result.*; +import java.io.IOException; + import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -27,7 +13,51 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.bean.WxJsapiSignature; +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.StandardSessionManager; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.common.util.RandomUtils; +import me.chanjar.weixin.common.util.crypto.SHA1; +import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder; +import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder; +import me.chanjar.weixin.common.util.http.RequestExecutor; +import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; +import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor; +import me.chanjar.weixin.common.util.http.URIUtil; +import me.chanjar.weixin.mp.api.WxMpCardService; +import me.chanjar.weixin.mp.api.WxMpConfigStorage; +import me.chanjar.weixin.mp.api.WxMpDataCubeService; +import me.chanjar.weixin.mp.api.WxMpKefuService; +import me.chanjar.weixin.mp.api.WxMpMaterialService; +import me.chanjar.weixin.mp.api.WxMpMenuService; +import me.chanjar.weixin.mp.api.WxMpPayService; +import me.chanjar.weixin.mp.api.WxMpQrcodeService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.WxMpStoreService; +import me.chanjar.weixin.mp.api.WxMpUserBlacklistService; +import me.chanjar.weixin.mp.api.WxMpUserService; +import me.chanjar.weixin.mp.api.WxMpUserTagService; +import me.chanjar.weixin.mp.bean.WxMpIndustry; +import me.chanjar.weixin.mp.bean.WxMpMassNews; +import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage; +import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; +import me.chanjar.weixin.mp.bean.WxMpMassVideo; +import me.chanjar.weixin.mp.bean.WxMpSemanticQuery; +import me.chanjar.weixin.mp.bean.WxMpTemplateMessage; +import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult; +import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult; +import me.chanjar.weixin.mp.bean.result.WxMpUser; public class WxMpServiceImpl implements WxMpService { @@ -178,35 +208,35 @@ public class WxMpServiceImpl implements WxMpService { @Override public WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; - String responseContent = execute(new SimplePostRequestExecutor(), url, news.toJson()); + String responseContent = this.post(url, news.toJson()); return WxMpMassUploadResult.fromJson(responseContent); } @Override public WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo"; - String responseContent = execute(new SimplePostRequestExecutor(), url, video.toJson()); + String responseContent = this.post(url, video.toJson()); return WxMpMassUploadResult.fromJson(responseContent); } @Override public WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; - String responseContent = execute(new SimplePostRequestExecutor(), url, message.toJson()); + String responseContent = this.post(url, message.toJson()); return WxMpMassSendResult.fromJson(responseContent); } @Override public WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; - String responseContent = execute(new SimplePostRequestExecutor(), url, message.toJson()); + String responseContent = this.post(url, message.toJson()); return WxMpMassSendResult.fromJson(responseContent); } @Override public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception { String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; - String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson()); + String responseContent = this.post(url, wxMpMassPreviewMessage.toJson()); return WxMpMassSendResult.fromJson(responseContent); } @@ -216,7 +246,7 @@ public class WxMpServiceImpl implements WxMpService { JsonObject o = new JsonObject(); o.addProperty("action", "long2short"); o.addProperty("long_url", long_url); - String responseContent = execute(new SimplePostRequestExecutor(), url, o.toString()); + String responseContent = this.post(url, o.toString()); JsonElement tmpJsonElement = JSON_PARSER.parse(responseContent); return tmpJsonElement.getAsJsonObject().get("short_url").getAsString(); } @@ -240,20 +270,20 @@ public class WxMpServiceImpl implements WxMpService { throw new IllegalArgumentException("industry id is empty"); } String url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry"; - return execute(new SimplePostRequestExecutor(), url, wxMpIndustry.toJson()); + return this.post(url, wxMpIndustry.toJson()); } @Override public WxMpIndustry getIndustry() throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/template/get_industry"; - String responseContent = execute(new SimpleGetRequestExecutor(), url, null); + String responseContent = this.get(url, null); return WxMpIndustry.fromJson(responseContent); } @Override public WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException { String url = "https://api.weixin.qq.com/semantic/semproxy/search"; - String responseContent = execute(new SimplePostRequestExecutor(), url, semanticQuery.toJson()); + String responseContent = this.post(url, semanticQuery.toJson()); return WxMpSemanticQueryResult.fromJson(responseContent); } From 74783618247914b4eb515f22c4b9a603a109c26f Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 19:45:07 +0800 Subject: [PATCH 09/43] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=9A=84=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/api/impl/WxMpDataCubeServiceImpl.java | 42 ++++--------------- .../mp/api/impl/WxMpUserTagServiceImpl.java | 27 ++---------- 2 files changed, 10 insertions(+), 59 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java index b82b7eaa5..2dbee076a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java @@ -1,32 +1,21 @@ package me.chanjar.weixin.mp.api.impl; +import com.google.gson.JsonObject; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpDataCubeService; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.datacube.*; +import org.apache.commons.lang3.time.FastDateFormat; + import java.text.Format; import java.util.Date; import java.util.List; -import org.apache.commons.lang3.time.FastDateFormat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.JsonObject; - -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpDataCubeService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeArticleTotal; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeInterfaceResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeMsgResult; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserCumulate; -import me.chanjar.weixin.mp.bean.datacube.WxDataCubeUserSummary; - /** * Created by Binary Wang on 2016/8/23. * @author binarywang (https://github.com/binarywang) */ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { - protected final Logger log = LoggerFactory.getLogger(WxMpDataCubeServiceImpl.class); - private static final String API_URL_PREFIX = "https://api.weixin.qq.com/datacube"; private final Format dateFormat = FastDateFormat.getInstance("yyyy-MM-dd"); @@ -44,7 +33,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeUserSummary.fromJson(responseContent); } @@ -55,7 +43,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeUserCumulate.fromJson(responseContent); } @@ -66,7 +53,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleResult.fromJson(responseContent); } @@ -77,7 +63,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleTotal.fromJson(responseContent); } @@ -88,7 +73,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleResult.fromJson(responseContent); } @@ -99,7 +83,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleResult.fromJson(responseContent); } @@ -110,7 +93,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleResult.fromJson(responseContent); } @@ -121,7 +103,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeArticleResult.fromJson(responseContent); } @@ -133,7 +114,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -145,7 +125,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -157,7 +136,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -169,7 +147,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -181,7 +158,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -193,7 +169,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -205,7 +180,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeMsgResult.fromJson(responseContent); } @@ -217,7 +191,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeInterfaceResult.fromJson(responseContent); } @@ -229,7 +202,6 @@ public class WxMpDataCubeServiceImpl implements WxMpDataCubeService { param.addProperty("begin_date", this.dateFormat.format(beginDate)); param.addProperty("end_date", this.dateFormat.format(endDate)); String responseContent = this.wxMpService.post(url, param.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}",url, param, responseContent); return WxDataCubeInterfaceResult.fromJson(responseContent); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 3f6a4dbae..4d3639c82 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -1,16 +1,9 @@ package me.chanjar.weixin.mp.api.impl; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; - import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; @@ -18,6 +11,9 @@ import me.chanjar.weixin.mp.api.WxMpUserTagService; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; /** * @@ -25,8 +21,6 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; * Created by Binary Wang on 2016/9/2. */ public class WxMpUserTagServiceImpl implements WxMpUserTagService { - protected final Logger log = LoggerFactory - .getLogger(WxMpDataCubeServiceImpl.class); private static final String API_URL_PREFIX = "https://api.weixin.qq.com/cgi-bin/tags"; private WxMpService wxMpService; @@ -44,8 +38,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.add("tag", tagJson); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); return WxUserTag.fromJson(responseContent); } @@ -54,8 +46,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { String url = API_URL_PREFIX + "/get"; String responseContent = this.wxMpService.get(url, null); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, "[empty]", - responseContent); return WxUserTag.listFromJson(responseContent); } @@ -70,7 +60,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.add("tag", tagJson); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), responseContent); WxError wxError = WxError.fromJson(responseContent); if (wxError.getErrorCode() == 0) { return true; @@ -89,8 +78,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.add("tag", tagJson); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); WxError wxError = WxError.fromJson(responseContent); if (wxError.getErrorCode() == 0) { return true; @@ -109,8 +96,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.addProperty("next_openid", StringUtils.trimToEmpty(nextOpenid)); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); return WxTagListUser.fromJson(responseContent); } @@ -128,8 +113,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.add("openid_list", openidArrayJson); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); WxError wxError = WxError.fromJson(responseContent); if (wxError.getErrorCode() == 0) { return true; @@ -152,8 +135,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.add("openid_list", openidArrayJson); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); WxError wxError = WxError.fromJson(responseContent); if (wxError.getErrorCode() == 0) { return true; @@ -170,8 +151,6 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { json.addProperty("openid", openid); String responseContent = this.wxMpService.post(url, json.toString()); - this.log.debug("\nurl:{}\nparams:{}\nresponse:{}", url, json.toString(), - responseContent); return WxMpGsonBuilder.create().fromJson( new JsonParser().parse(responseContent).getAsJsonObject().get("tagid_list"), From 6889e3d95e9eeb96d1a891096159faa6ce0bed71 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 19:45:43 +0800 Subject: [PATCH 10/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9F=A5=E7=9C=8B=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=20for=20issue=20#17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/WxMpStoreService.java | 19 +++++++++++-- .../mp/api/impl/WxMpStoreServiceImpl.java | 27 ++++++++++++++----- .../mp/bean/store/WxMpStoreBaseInfo.java | 16 ++++++----- .../weixin/mp/bean/store/WxMpStoreInfo.java | 3 ++- .../mp/api/impl/WxMpStoreServiceImplTest.java | 27 ++++++++++--------- 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java index f4f3ccb6f..e9adbf4cb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java @@ -1,12 +1,12 @@ package me.chanjar.weixin.mp.api; -import java.util.List; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult; +import java.util.List; + /** * 门店管理的相关接口代码 * @author binarywang(https://github.com/binarywang) @@ -27,6 +27,21 @@ public interface WxMpStoreService { */ void add(WxMpStoreBaseInfo request) throws WxErrorException; + + /** + *
+   * 查询门店信息
+   * 创建门店后获取poi_id 后,商户可以利用poi_id,查询具体某条门店的信息。
+   * 若在查询时,update_status 字段为1,表明在5 个工作日内曾用update 接口修改过门店扩展字段,该扩展字段为最新的修改字段,尚未经过审核采纳,因此不是最终结果。
+   * 最终结果会在5 个工作日内,最终确认是否采纳,并前端生效(但该扩展字段的采纳过程不影响门店的可用性,即available_state仍为审核通过状态)
+   * 注:扩展字段为公共编辑信息(大家都可修改),修改将会审核,并决定是否对修改建议进行采纳,但不会影响该门店的生效可用状态。
+   * 详情请见: 微信门店接口
+   * 
+ * @param poiId 门店poiId + * @throws WxErrorException + */ + WxMpStoreBaseInfo get(String poiId) throws WxErrorException; + /** *
    * 查询门店列表(指定查询起始位置和个数)
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 99740d45f..d5f50b14b 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -1,14 +1,8 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import java.lang.reflect.Field;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.joor.Reflect;
-
 import com.google.common.collect.Lists;
 import com.google.gson.JsonObject;
-
+import com.google.gson.JsonParser;
 import me.chanjar.weixin.common.annotation.Required;
 import me.chanjar.weixin.common.bean.result.WxError;
 import me.chanjar.weixin.common.exception.WxErrorException;
@@ -17,6 +11,11 @@ import me.chanjar.weixin.mp.api.WxMpStoreService;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult;
+import org.joor.Reflect;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map.Entry;
 
 /**
  *  Created by Binary Wang on 2016/9/26.
@@ -44,6 +43,20 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
     }
   }
 
+  @Override
+  public WxMpStoreBaseInfo get(String poiId) throws WxErrorException {
+    String url = API_BASE_URL + "/getpoi";
+    JsonObject paramObject = new JsonObject();
+    paramObject.addProperty("poi_id",poiId);
+    String response = this.wxMpService.post(url, paramObject.toString());
+    WxError wxError = WxError.fromJson(response);
+    if (wxError.getErrorCode() != 0) {
+      throw new WxErrorException(wxError);
+    }
+    return WxMpStoreBaseInfo.fromJson(new JsonParser().parse(response).getAsJsonObject()
+        .get("business").getAsJsonObject().get("base_info").toString());
+  }
+
   private void checkParameters(WxMpStoreBaseInfo request) {
     List nullFields = Lists.newArrayList();
     for (Entry entry : Reflect.on(request).fields()
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
index 06a5b1789..dcfd31539 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java
@@ -1,17 +1,15 @@
 package me.chanjar.weixin.mp.bean.store;
 
-import java.math.BigDecimal;
-import java.util.List;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.SerializedName;
-
 import me.chanjar.weixin.common.annotation.Required;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 门店基础信息
@@ -24,6 +22,10 @@ public class WxMpStoreBaseInfo {
     return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
   }
 
+  public static WxMpStoreBaseInfo fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpStoreBaseInfo.class);
+  }
+
   public String toJson() {
     JsonElement base_info = WxMpGsonBuilder.create().toJsonTree(this);
     JsonObject jsonObject = new JsonObject();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
index 48b018226..5b44b8604 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java
@@ -1,5 +1,6 @@
 package me.chanjar.weixin.mp.bean.store;
 
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -22,4 +23,4 @@ public class WxMpStoreInfo {
     this.baseInfo = baseInfo;
   }
 
-}
\ No newline at end of file
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
index 9c28dfa71..3efaf8de0 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
@@ -1,20 +1,18 @@
 package me.chanjar.weixin.mp.api.impl;
 
-import static org.junit.Assert.assertNotNull;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
 import com.google.inject.Inject;
-
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.mp.api.ApiTestModule;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo;
 import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import static org.junit.Assert.assertNotNull;
 
 /**
  * @author 王彬 (Binary Wang)
@@ -28,18 +26,23 @@ public class WxMpStoreServiceImplTest {
 
   /**
    * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpStoreServiceImpl#add(me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo)}.
-   * @throws WxErrorException 
+   * @throws WxErrorException
    */
   public void testAdd() throws WxErrorException {
     this.wxMpService.getStoreService()
         .add(WxMpStoreBaseInfo.builder().businessName("haha").branchName("abc")
-            .province("aaa").district("aaa").telephone("122").address("abc")
-.categories(new String[] { "美食,江浙菜" })
+            .province("aaa").district("aaa").telephone("122").address("abc").categories(new String[] { "美食,江浙菜" })
             .longitude(new BigDecimal("115.32375"))
             .latitude(new BigDecimal("25.097486")).city("aaa").offsetType(1)
             .build());
   }
 
+  public void testGet() throws WxErrorException {
+    WxMpStoreBaseInfo result = this.wxMpService.getStoreService().get("291503654");
+    assertNotNull(result);
+    System.err.println(result);
+  }
+
   public void testList() throws WxErrorException {
     WxMpStoreListResult result = this.wxMpService.getStoreService().list(0, 10);
     assertNotNull(result);

From 091aefe4e150e4788004861bf61fc0cef45e96a8 Mon Sep 17 00:00:00 2001
From: BinaryWang 
Date: Wed, 28 Sep 2016 19:53:35 +0800
Subject: [PATCH 11/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=97=A8=E5=BA=97?=
 =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E7=9A=84?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20for=20issue=20#17?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../me/chanjar/weixin/mp/api/WxMpStoreService.java   | 12 +++++++++++-
 .../weixin/mp/api/impl/WxMpStoreServiceImpl.java     | 10 ++++++++++
 .../weixin/mp/api/impl/WxMpStoreServiceImplTest.java | 11 ++++++++++-
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
index e9adbf4cb..127954aa7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
@@ -27,7 +27,6 @@ public interface WxMpStoreService {
    */
   void add(WxMpStoreBaseInfo request) throws WxErrorException;
 
-
   /**
    * 
    * 查询门店信息
@@ -63,4 +62,15 @@ public interface WxMpStoreService {
    * @throws WxErrorException
    */
   List listAll() throws WxErrorException;
+
+  /**
+   * 
+   * 修改门店服务信息
+   * 商户可以通过该接口,修改门店的服务信息,包括:sid、图片列表、营业时间、推荐、特色服务、简介、人均价格、电话8个字段(名称、坐标、地址等不可修改)修改后需要人工审核。
+   * 详情请见: 微信门店接口
+   * 
+ * @throws WxErrorException + */ + void update(WxMpStoreBaseInfo info) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java index d5f50b14b..4a808f276 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java @@ -117,4 +117,14 @@ public class WxMpStoreServiceImpl implements WxMpStoreService { return stores; } + @Override + public void update(WxMpStoreBaseInfo request) throws WxErrorException { + String url = API_BASE_URL + "/updatepoi"; + String response = this.wxMpService.post(url, request.toJson()); + WxError wxError = WxError.fromJson(response); + if (wxError.getErrorCode() != 0) { + throw new WxErrorException(wxError); + } + } + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java index 3efaf8de0..f994f68f5 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java @@ -15,7 +15,8 @@ import java.util.List; import static org.junit.Assert.assertNotNull; /** - * @author 王彬 (Binary Wang) + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016-09-23. * */ @Test @@ -37,6 +38,14 @@ public class WxMpStoreServiceImplTest { .build()); } + public void testUpdate() throws WxErrorException { + this.wxMpService.getStoreService() + .update(WxMpStoreBaseInfo.builder().poiId("291503654").telephone("020-12345678") + .sid("aaa").avgPrice(35).openTime("8:00-20:00").special("免费wifi,外卖服务") + .introduction("麦当劳是全球大型跨国连锁餐厅,1940 年创立于美国,在世界上大约拥有3 万间分店。主要售卖汉堡包,以及薯条、炸鸡、汽水、冰品、沙拉、水果等快餐食品").offsetType(1) + .build()); + } + public void testGet() throws WxErrorException { WxMpStoreBaseInfo result = this.wxMpService.getStoreService().get("291503654"); assertNotNull(result); From 460a52be108f9459b06a49c26e2b6a8a4da19f68 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 20:00:55 +0800 Subject: [PATCH 12/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E9=97=A8=E5=BA=97=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=20for=20?= =?UTF-8?q?issue=20#17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/WxMpStoreService.java | 13 ++++++++++++- .../weixin/mp/api/impl/WxMpStoreServiceImpl.java | 12 ++++++++++++ .../mp/api/impl/WxMpStoreServiceImplTest.java | 4 ++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java index 127954aa7..a8394db3c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java @@ -36,11 +36,22 @@ public interface WxMpStoreService { * 注:扩展字段为公共编辑信息(大家都可修改),修改将会审核,并决定是否对修改建议进行采纳,但不会影响该门店的生效可用状态。 * 详情请见: 微信门店接口 *
- * @param poiId 门店poiId + * @param poiId 门店Id * @throws WxErrorException */ WxMpStoreBaseInfo get(String poiId) throws WxErrorException; + /** + *
+   * 删除门店
+   * 商户可以通过该接口,删除已经成功创建的门店。请商户慎重调用该接口。
+   * 详情请见: 微信门店接口
+   * 
+ * @param poiId 门店Id + * @throws WxErrorException + */ + void delete(String poiId) throws WxErrorException; + /** *
    * 查询门店列表(指定查询起始位置和个数)
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
index 4a808f276..7cfce11de 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java
@@ -57,6 +57,18 @@ public class WxMpStoreServiceImpl implements WxMpStoreService {
         .get("business").getAsJsonObject().get("base_info").toString());
   }
 
+  @Override
+  public void delete(String poiId) throws WxErrorException {
+    String url = API_BASE_URL + "/delpoi";
+    JsonObject paramObject = new JsonObject();
+    paramObject.addProperty("poi_id",poiId);
+    String response = this.wxMpService.post(url, paramObject.toString());
+    WxError wxError = WxError.fromJson(response);
+    if (wxError.getErrorCode() != 0) {
+      throw new WxErrorException(wxError);
+    }
+  }
+
   private void checkParameters(WxMpStoreBaseInfo request) {
     List nullFields = Lists.newArrayList();
     for (Entry entry : Reflect.on(request).fields()
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
index f994f68f5..b6ca8d088 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java
@@ -52,6 +52,10 @@ public class WxMpStoreServiceImplTest {
     System.err.println(result);
   }
 
+  public void testDelete() throws WxErrorException {
+    this.wxMpService.getStoreService().delete("463558057");
+  }
+
   public void testList() throws WxErrorException {
     WxMpStoreListResult result = this.wxMpService.getStoreService().list(0, 10);
     assertNotNull(result);

From 8a5fdb171730b0ca9b8425741a45d28b556ff270 Mon Sep 17 00:00:00 2001
From: BinaryWang 
Date: Wed, 28 Sep 2016 20:20:17 +0800
Subject: [PATCH 13/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9F=A5=E8=AF=A2?=
 =?UTF-8?q?=E9=97=A8=E5=BA=97=E7=B1=BB=E7=9B=AE=E5=88=97=E8=A1=A8=E7=9A=84?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=20for=20issue=20#17?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../chanjar/weixin/mp/api/WxMpStoreService.java  | 16 ++++++++++++++++
 .../weixin/mp/api/impl/WxMpStoreServiceImpl.java | 16 ++++++++++++++++
 .../mp/api/impl/WxMpStoreServiceImplTest.java    |  6 ++++++
 3 files changed, 38 insertions(+)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
index a8394db3c..0ce7cc038 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
@@ -35,6 +35,7 @@ public interface WxMpStoreService {
    * 最终结果会在5 个工作日内,最终确认是否采纳,并前端生效(但该扩展字段的采纳过程不影响门店的可用性,即available_state仍为审核通过状态)
    * 注:扩展字段为公共编辑信息(大家都可修改),修改将会审核,并决定是否对修改建议进行采纳,但不会影响该门店的生效可用状态。
    * 详情请见: 微信门店接口
+   * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/getpoi?access_token=TOKEN
    * 
* @param poiId 门店Id * @throws WxErrorException @@ -46,6 +47,7 @@ public interface WxMpStoreService { * 删除门店 * 商户可以通过该接口,删除已经成功创建的门店。请商户慎重调用该接口。 * 详情请见: 微信门店接口 + * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/delpoi?access_token=TOKEN *
* @param poiId 门店Id * @throws WxErrorException @@ -57,6 +59,7 @@ public interface WxMpStoreService { * 查询门店列表(指定查询起始位置和个数) * 商户可以通过该接口,批量查询自己名下的门店list,并获取已审核通过的poi_id(所有状态均会返回poi_id,但该poi_id不一定为最终id)、商户自身sid 用于对应、商户名、分店名、地址字段。 * 详情请见: 微信门店接口 + * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/getpoilist?access_token=TOKEN * * @param begin 开始位置,0 即为从第一条开始查询 * @param limit 返回数据条数,最大允许50,默认为20 @@ -69,6 +72,7 @@ public interface WxMpStoreService { * 查询门店列表(所有) * 商户可以通过该接口,批量查询自己名下的门店list,并获取已审核通过的poi_id(所有状态均会返回poi_id,但该poi_id不一定为最终id)、商户自身sid 用于对应、商户名、分店名、地址字段。 * 详情请见: 微信门店接口 + * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/getpoilist?access_token=TOKEN * * @throws WxErrorException */ @@ -79,9 +83,21 @@ public interface WxMpStoreService { * 修改门店服务信息 * 商户可以通过该接口,修改门店的服务信息,包括:sid、图片列表、营业时间、推荐、特色服务、简介、人均价格、电话8个字段(名称、坐标、地址等不可修改)修改后需要人工审核。 * 详情请见: 微信门店接口 + * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/updatepoi?access_token=TOKEN * * @throws WxErrorException */ void update(WxMpStoreBaseInfo info) throws WxErrorException; + /** + *
+   * 门店类目表
+   * 类目名称接口是为商户提供自己门店类型信息的接口。门店类目定位的越规范,能够精准的吸引更多用户,提高曝光率。
+   * 详情请见: 微信门店接口
+   * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/getwxcategory?access_token=TOKEN
+   * 
+ * @throws WxErrorException + */ + List listCategories() throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java index 7cfce11de..39c7f7292 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImpl.java @@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl; import com.google.common.collect.Lists; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; import me.chanjar.weixin.common.annotation.Required; import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.exception.WxErrorException; @@ -11,6 +12,7 @@ import me.chanjar.weixin.mp.api.WxMpStoreService; import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo; import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.joor.Reflect; import java.lang.reflect.Field; @@ -139,4 +141,18 @@ public class WxMpStoreServiceImpl implements WxMpStoreService { } } + @Override + public List listCategories() throws WxErrorException { + String url = API_BASE_URL + "/getwxcategory"; + String response = this.wxMpService.get(url, null); + WxError wxError = WxError.fromJson(response); + if (wxError.getErrorCode() != 0) { + throw new WxErrorException(wxError); + } + + return WxMpGsonBuilder.create().fromJson( + new JsonParser().parse(response).getAsJsonObject().get("category_list"), + new TypeToken>(){}.getType()); + } + } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java index b6ca8d088..766854703 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java @@ -56,6 +56,12 @@ public class WxMpStoreServiceImplTest { this.wxMpService.getStoreService().delete("463558057"); } + public void testListCategories() throws WxErrorException { + List result = this.wxMpService.getStoreService().listCategories(); + assertNotNull(result); + System.err.println(result); + } + public void testList() throws WxErrorException { WxMpStoreListResult result = this.wxMpService.getStoreService().list(0, 10); assertNotNull(result); From d9e8fe6d1467d238b3b5469bafede335c2ef83fd Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Wed, 28 Sep 2016 20:30:25 +0800 Subject: [PATCH 14/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=97=A8=E5=BA=97?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E4=BA=8B=E4=BB=B6=E6=8E=A8=E9=80=81=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=B6=88=E6=81=AF=E5=8F=98=E9=87=8F=E5=92=8C?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=B8=B8=E9=87=8F=EF=BC=8C=20for=20issue=20#?= =?UTF-8?q?17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/common/api/WxConsts.java | 2 + .../weixin/mp/bean/WxMpXmlMessage.java | 85 ++++++++++++++++--- 2 files changed, 75 insertions(+), 12 deletions(-) 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 eae90d979..6a1e43805 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 @@ -93,6 +93,8 @@ public class WxConsts { public static final String EVT_KF_CREATE_SESSION = "kf_create_session"; // 客服接入会话 public static final String EVT_KF_CLOSE_SESSION = "kf_close_session"; // 客服关闭会话 public static final String EVT_KF_SWITCH_SESSION = "kf_switch_session"; // 客服转接会话 + public static final String EVT_POI_CHECK_NOTIFY = "poi_check_notify"; //门店审核事件推送 + /////////////////////// // 上传多媒体文件的类型 /////////////////////// diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java index 047961ea8..c02406488 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java @@ -1,23 +1,21 @@ package me.chanjar.weixin.mp.bean; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamConverter; +import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; +import me.chanjar.weixin.mp.api.WxMpConfigStorage; +import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil; +import me.chanjar.weixin.mp.util.xml.XStreamTransformer; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamConverter; - -import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; -import me.chanjar.weixin.mp.api.WxMpConfigStorage; -import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil; -import me.chanjar.weixin.mp.util.xml.XStreamTransformer; - /** *
  * 微信推送过来的消息,也是同步回复给用户的消息,xml格式
@@ -209,6 +207,69 @@ public class WxMpXmlMessage implements Serializable {
   @XStreamAlias("SendLocationInfo")
   private SendLocationInfo sendLocationInfo = new SendLocationInfo();
 
+  ///////////////////////////////////////
+  // 门店审核事件推送
+  ///////////////////////////////////////
+  /**
+   * UniqId
+   * 商户自己内部ID,即字段中的sid
+   */
+  @XStreamAlias("UniqId")
+  private String storeUniqId;
+
+  /**
+   * PoiId
+   * 微信的门店ID,微信内门店唯一标示ID
+   */
+  @XStreamAlias("PoiId")
+  private String poiId;
+
+  /**
+   * Result
+   * 审核结果,成功succ 或失败fail
+   */
+  @XStreamAlias("Result")
+  private String result;
+
+  /**
+   * msg
+   * 成功的通知信息,或审核失败的驳回理由
+   */
+  @XStreamAlias("msg")
+  private String msg;
+
+  public String getStoreUniqId() {
+    return storeUniqId;
+  }
+
+  public void setStoreUniqId(String storeUniqId) {
+    this.storeUniqId = storeUniqId;
+  }
+
+  public String getPoiId() {
+    return poiId;
+  }
+
+  public void setPoiId(String poiId) {
+    this.poiId = poiId;
+  }
+
+  public String getResult() {
+    return result;
+  }
+
+  public void setResult(String result) {
+    this.result = result;
+  }
+
+  public String getMsg() {
+    return msg;
+  }
+
+  public void setMsg(String msg) {
+    this.msg = msg;
+  }
+
   public String getToUserName() {
     return this.toUserName;
   }

From 87ab934a1ccfef6da6710b01f94073f5b34a0bc9 Mon Sep 17 00:00:00 2001
From: BinaryWang 
Date: Thu, 29 Sep 2016 13:54:40 +0800
Subject: [PATCH 15/43] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E9=83=A8?=
 =?UTF-8?q?=E5=88=86=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../mp/api/impl/WxMpPayServiceImpl.java       |  3 +-
 .../weixin/mp/bean/WxMpXmlMessage.java        | 30 ++++++++++---------
 .../weixin/mp/bean/tag/WxTagListUser.java     | 16 +++++-----
 3 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
index 475f54065..dcb1e89f4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
@@ -28,7 +28,6 @@ import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
 import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
 import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
-import me.chanjar.weixin.mp.bean.pay.WxMpPrepayIdResult;
 import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
 import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
 import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
@@ -287,7 +286,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
 
     if (!TRADE_TYPES.contains(request.getTradeType())) {
       throw new IllegalArgumentException(
-"trade_type目前必须为" + TRADE_TYPES + "其中之一");
+          "trade_type目前必须为" + TRADE_TYPES + "其中之一");
 
     }
 
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index c02406488..460e7ce6f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -1,21 +1,23 @@
 package me.chanjar.weixin.mp.bean;
 
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
-import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
-import me.chanjar.weixin.mp.api.WxMpConfigStorage;
-import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
-import me.chanjar.weixin.mp.util.xml.XStreamTransformer;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.mp.api.WxMpConfigStorage;
+import me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil;
+import me.chanjar.weixin.mp.util.xml.XStreamTransformer;
+
 /**
  * 
  * 微信推送过来的消息,也是同步回复给用户的消息,xml格式
@@ -239,7 +241,7 @@ public class WxMpXmlMessage implements Serializable {
   private String msg;
 
   public String getStoreUniqId() {
-    return storeUniqId;
+    return this.storeUniqId;
   }
 
   public void setStoreUniqId(String storeUniqId) {
@@ -247,7 +249,7 @@ public class WxMpXmlMessage implements Serializable {
   }
 
   public String getPoiId() {
-    return poiId;
+    return this.poiId;
   }
 
   public void setPoiId(String poiId) {
@@ -255,7 +257,7 @@ public class WxMpXmlMessage implements Serializable {
   }
 
   public String getResult() {
-    return result;
+    return this.result;
   }
 
   public void setResult(String result) {
@@ -263,7 +265,7 @@ public class WxMpXmlMessage implements Serializable {
   }
 
   public String getMsg() {
-    return msg;
+    return this.msg;
   }
 
   public void setMsg(String msg) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
index 0ba48edce..b07314bac 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java
@@ -1,11 +1,13 @@
 package me.chanjar.weixin.mp.bean.tag;
 
-import com.google.gson.annotations.SerializedName;
-import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import java.util.List;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
-import java.util.List;
+import com.google.gson.annotations.SerializedName;
+
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
 
 /**
  * 获取标签下粉丝列表的结果对象
@@ -46,7 +48,7 @@ public class WxTagListUser {
   private String nextOpenid;
 
   public Integer getCount() {
-    return count;
+    return this.count;
   }
 
   public void setCount(Integer count) {
@@ -54,7 +56,7 @@ public class WxTagListUser {
   }
 
   public WxTagListUserData getData() {
-    return data;
+    return this.data;
   }
 
   public void setData(WxTagListUserData data) {
@@ -62,7 +64,7 @@ public class WxTagListUser {
   }
 
   public String getNextOpenid() {
-    return nextOpenid;
+    return this.nextOpenid;
   }
 
   public void setNextOpenid(String nextOpenid) {
@@ -82,7 +84,7 @@ public class WxTagListUser {
     private List openidList;
 
     public List getOpenidList() {
-      return openidList;
+      return this.openidList;
     }
 
     public void setOpenidList(List openidList) {

From 5345a6d1f15df7182bce6c1b4bacc8b750cf41d3 Mon Sep 17 00:00:00 2001
From: BinaryWang 
Date: Fri, 30 Sep 2016 16:41:50 +0800
Subject: [PATCH 16/43] =?UTF-8?q?=E9=87=8D=E6=9E=84WxMpXmlMessage=EF=BC=8C?=
 =?UTF-8?q?=E4=BF=AE=E6=94=B9fromUserName=E4=B8=BAfromUser=EF=BC=8CtoUserN?=
 =?UTF-8?q?ame=E4=B8=BAtoUser=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B8=8D=E5=BF=85?=
 =?UTF-8?q?=E8=A6=81=E7=9A=84=E6=AD=A7=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/api/WxMpMessageRouter.java      |  8 ++++----
 .../weixin/mp/api/WxMpMessageRouterRule.java  |  2 +-
 .../weixin/mp/bean/WxMpXmlMessage.java        | 20 +++++++++----------
 .../weixin/mp/api/WxMpMessageRouterTest.java  | 14 ++++++-------
 .../mp/api/impl/WxMpPayServiceImplTest.java   | 19 ++----------------
 .../weixin/mp/bean/WxMpXmlMessageTest.java    |  8 ++++----
 .../mp/demo/DemoGuessNumberHandler.java       | 14 ++++++-------
 .../weixin/mp/demo/DemoImageHandler.java      |  4 ++--
 .../weixin/mp/demo/DemoOAuth2Handler.java     |  2 +-
 .../weixin/mp/demo/DemoTextHandler.java       |  4 ++--
 10 files changed, 40 insertions(+), 55 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
index 0c7a71051..7db50e794 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
@@ -171,7 +171,7 @@ public class WxMpMessageRouter {
       } else {
         res = rule.service(wxMessage, this.wxMpService, this.sessionManager, this.exceptionHandler);
         // 在同步操作结束,session访问结束
-        this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName());
+        this.log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUser());
         sessionEndAccess(wxMessage);
       }
     }
@@ -183,7 +183,7 @@ public class WxMpMessageRouter {
           for (Future future : futures) {
             try {
               future.get();
-              WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUserName());
+              WxMpMessageRouter.this.log.debug("End session access: async=true, sessionId={}", wxMessage.getFromUser());
               // 异步操作结束,session访问结束
               sessionEndAccess(wxMessage);
             } catch (InterruptedException e) {
@@ -203,7 +203,7 @@ public class WxMpMessageRouter {
     StringBuffer messageId = new StringBuffer();
     if (wxMessage.getMsgId() == null) {
       messageId.append(wxMessage.getCreateTime())
-        .append("-").append(wxMessage.getFromUserName())
+        .append("-").append(wxMessage.getFromUser())
         .append("-").append(wxMessage.getEventKey() == null ? "" : wxMessage.getEventKey())
         .append("-").append(wxMessage.getEvent() == null ? "" : wxMessage.getEvent())
       ;
@@ -221,7 +221,7 @@ public class WxMpMessageRouter {
    */
   protected void sessionEndAccess(WxMpXmlMessage wxMessage) {
 
-    InternalSession session = ((InternalSessionManager)this.sessionManager).findSession(wxMessage.getFromUserName());
+    InternalSession session = ((InternalSessionManager)this.sessionManager).findSession(wxMessage.getFromUser());
     if (session != null) {
       session.endAccess();
     }
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java
index eb02c6414..317303b84 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouterRule.java
@@ -168,7 +168,7 @@ public class WxMpMessageRouterRule {
    */
   protected boolean test(WxMpXmlMessage wxMessage) {
     return
-        (this.fromUser == null || this.fromUser.equals(wxMessage.getFromUserName()))
+        (this.fromUser == null || this.fromUser.equals(wxMessage.getFromUser()))
             &&
             (this.msgType == null || this.msgType.toLowerCase().equals((wxMessage.getMsgType()==null?null:wxMessage.getMsgType().toLowerCase())))
             &&
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index 460e7ce6f..b1997f92e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -40,11 +40,11 @@ public class WxMpXmlMessage implements Serializable {
 
   @XStreamAlias("ToUserName")
   @XStreamConverter(value = XStreamCDataConverter.class)
-  private String toUserName;
+  private String toUser;
 
   @XStreamAlias("FromUserName")
   @XStreamConverter(value = XStreamCDataConverter.class)
-  private String fromUserName;
+  private String fromUser;
 
   @XStreamAlias("CreateTime")
   private Long createTime;
@@ -272,12 +272,12 @@ public class WxMpXmlMessage implements Serializable {
     this.msg = msg;
   }
 
-  public String getToUserName() {
-    return this.toUserName;
+  public String getToUser() {
+    return this.toUser;
   }
 
-  public void setToUserName(String toUserName) {
-    this.toUserName = toUserName;
+  public void setToUser(String toUser) {
+    this.toUser = toUser;
   }
 
   public Long getCreateTime() {
@@ -482,12 +482,12 @@ public class WxMpXmlMessage implements Serializable {
     this.recognition = recognition;
   }
 
-  public String getFromUserName() {
-    return this.fromUserName;
+  public String getFromUser() {
+    return this.fromUser;
   }
 
-  public void setFromUserName(String fromUserName) {
-    this.fromUserName = fromUserName;
+  public void setFromUser(String fromUser) {
+    this.fromUser = fromUser;
   }
 
   public static WxMpXmlMessage fromXml(String xml) {
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
index 07a1b75aa..fdc907445 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java
@@ -195,7 +195,7 @@ public class WxMpMessageRouterTest {
         .rule().async(false).handler(new WxSessionMessageHandler()).end();
 
     WxMpXmlMessage msg = new WxMpXmlMessage();
-    msg.setFromUserName("abc");
+    msg.setFromUser("abc");
     router.route(msg);
 
     Thread.sleep(2000l);
@@ -215,7 +215,7 @@ public class WxMpMessageRouterTest {
           .rule().async(true).handler(new WxSessionMessageHandler()).end();
 
       WxMpXmlMessage msg = new WxMpXmlMessage();
-      msg.setFromUserName("abc");
+      msg.setFromUser("abc");
       router.route(msg);
 
       Thread.sleep(2000l);
@@ -229,7 +229,7 @@ public class WxMpMessageRouterTest {
           .rule().async(false).handler(new WxSessionMessageHandler()).end();
 
       WxMpXmlMessage msg = new WxMpXmlMessage();
-      msg.setFromUserName("abc");
+      msg.setFromUser("abc");
       router.route(msg);
 
       Thread.sleep(2000l);
@@ -249,7 +249,7 @@ public class WxMpMessageRouterTest {
         .rule().async(true).handler(new WxSessionMessageHandler()).end();
 
     WxMpXmlMessage msg = new WxMpXmlMessage();
-    msg.setFromUserName("abc");
+    msg.setFromUser("abc");
     router.route(msg);
 
     Thread.sleep(2000l);
@@ -268,7 +268,7 @@ public class WxMpMessageRouterTest {
           .rule().async(false).handler(new WxSessionMessageHandler()).end();
 
       WxMpXmlMessage msg = new WxMpXmlMessage();
-      msg.setFromUserName("abc");
+      msg.setFromUser("abc");
       router.route(msg);
 
       Thread.sleep(2000l);
@@ -282,7 +282,7 @@ public class WxMpMessageRouterTest {
           .rule().async(true).handler(new WxSessionMessageHandler()).end();
 
       WxMpXmlMessage msg = new WxMpXmlMessage();
-      msg.setFromUserName("abc");
+      msg.setFromUser("abc");
       router.route(msg);
 
       Thread.sleep(2000l);
@@ -295,7 +295,7 @@ public class WxMpMessageRouterTest {
     @Override
     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService,
         WxSessionManager sessionManager) {
-      sessionManager.getSession(wxMessage.getFromUserName());
+      sessionManager.getSession(wxMessage.getFromUser());
       return null;
     }
 
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
index 1982f9487..092be38ab 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
@@ -25,21 +25,6 @@ public class WxMpPayServiceImplTest {
   @Inject
   protected WxMpServiceImpl wxService;
 
-  @Test
-  public void testGetPrepayId() throws Exception {
-
-  }
-
-  @Test
-  public void testGetJsapiPayInfo() throws Exception {
-
-  }
-
-  @Test
-  public void testGetNativePayInfo() throws Exception {
-
-  }
-
   @Test
   public void testGetPayInfo() throws Exception {
 
@@ -79,7 +64,7 @@ public class WxMpPayServiceImplTest {
 
   /**
    * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#unifiedOrder(me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest)}.
-   * @throws WxErrorException 
+   * @throws WxErrorException
    */
   @Test
   public void testUnifiedOrder() throws WxErrorException {
@@ -89,4 +74,4 @@ public class WxMpPayServiceImplTest {
             .tradeType("JSAPI").openid("122").outTradeNo("111111").build());
     System.err.println(result);
   }
-}
\ No newline at end of file
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
index 3885ec32f..87d8428b6 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/WxMpXmlMessageTest.java
@@ -54,8 +54,8 @@ public class WxMpXmlMessageTest {
                 + ""
                 + "";
     WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml);
-    Assert.assertEquals(wxMessage.getToUserName(), "toUser");
-    Assert.assertEquals(wxMessage.getFromUserName(), "fromUser");
+    Assert.assertEquals(wxMessage.getToUser(), "toUser");
+    Assert.assertEquals(wxMessage.getFromUser(), "fromUser");
     Assert.assertEquals(wxMessage.getCreateTime(), new Long(1348831860l));
     Assert.assertEquals(wxMessage.getMsgType(), WxConsts.XML_MSG_TEXT);
     Assert.assertEquals(wxMessage.getContent(), "this is a test");
@@ -135,8 +135,8 @@ public class WxMpXmlMessageTest {
         + ""
         + "";
     WxMpXmlMessage wxMessage = WxMpXmlMessage.fromXml(xml);
-    Assert.assertEquals(wxMessage.getToUserName(), "toUser");
-    Assert.assertEquals(wxMessage.getFromUserName(), "fromUser");
+    Assert.assertEquals(wxMessage.getToUser(), "toUser");
+    Assert.assertEquals(wxMessage.getFromUser(), "fromUser");
     Assert.assertEquals(wxMessage.getCreateTime(), new Long(1348831860l));
     Assert.assertEquals(wxMessage.getMsgType(), WxConsts.XML_MSG_TEXT);
     Assert.assertEquals(wxMessage.getContent(), "this is a test");
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
index a6fb1e53b..f35b3b87a 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java
@@ -50,18 +50,18 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
   }
 
   protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
-    WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
+    WxSession session = sessionManager.getSession(wxMessage.getFromUser());
     if (session.getAttribute("guessing") == null) {
       WxMpCustomMessage m = WxMpCustomMessage
           .TEXT()
-          .toUser(wxMessage.getFromUserName())
+          .toUser(wxMessage.getFromUser())
           .content("请猜一个100以内的数字")
           .build();
       wxMpService.getKefuService().customMessageSend(m);
     } else {
       WxMpCustomMessage m = WxMpCustomMessage
           .TEXT()
-          .toUser(wxMessage.getFromUserName())
+          .toUser(wxMessage.getFromUser())
           .content("放弃了吗?那请重新猜一个100以内的数字")
           .build();
       wxMpService.getKefuService().customMessageSend(m);
@@ -74,7 +74,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
 
   protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
 
-    WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
+    WxSession session = sessionManager.getSession(wxMessage.getFromUser());
 
     if (session.getAttribute("guessing") == null) {
       return;
@@ -89,7 +89,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
     if (guessNumber < answer) {
       WxMpCustomMessage m = WxMpCustomMessage
           .TEXT()
-          .toUser(wxMessage.getFromUserName())
+          .toUser(wxMessage.getFromUser())
           .content("小了")
           .build();
       wxMpService.getKefuService().customMessageSend(m);
@@ -97,14 +97,14 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa
     } else if (guessNumber > answer) {
       WxMpCustomMessage m = WxMpCustomMessage
           .TEXT()
-          .toUser(wxMessage.getFromUserName())
+          .toUser(wxMessage.getFromUser())
           .content("大了")
           .build();
       wxMpService.getKefuService().customMessageSend(m);
     } else {
       WxMpCustomMessage m = WxMpCustomMessage
           .TEXT()
-          .toUser(wxMessage.getFromUserName())
+          .toUser(wxMessage.getFromUser())
           .content("Bingo!")
           .build();
       session.removeAttribute("guessing");
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
index a22f28d79..cd7332104 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoImageHandler.java
@@ -24,8 +24,8 @@ public class DemoImageHandler implements WxMpMessageHandler {
           = WxMpXmlOutMessage
           .IMAGE()
           .mediaId(wxMediaUploadResult.getMediaId())
-          .fromUser(wxMessage.getToUserName())
-          .toUser(wxMessage.getFromUserName())
+          .fromUser(wxMessage.getToUser())
+          .toUser(wxMessage.getFromUser())
           .build();
       return m;
     } catch (WxErrorException e) {
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
index de1c9546e..5dc5437d2 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoOAuth2Handler.java
@@ -21,7 +21,7 @@ public class DemoOAuth2Handler implements WxMpMessageHandler {
         wxMpService.getWxMpConfigStorage().getOauth2redirectUri(),
         WxConsts.OAUTH2_SCOPE_USER_INFO, null) + "\">测试oauth2";
     return WxMpXmlOutMessage.TEXT().content(href)
-        .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
+        .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser())
         .build();
   }
 }
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
index 43f017be7..9ee15a283 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoTextHandler.java
@@ -17,8 +17,8 @@ public class DemoTextHandler implements WxMpMessageHandler {
   public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context,
       WxMpService wxMpService, WxSessionManager sessionManager) {
     WxMpXmlOutTextMessage m
-        = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUserName())
-        .toUser(wxMessage.getFromUserName()).build();
+        = WxMpXmlOutMessage.TEXT().content("测试加密消息").fromUser(wxMessage.getToUser())
+        .toUser(wxMessage.getFromUser()).build();
     return m;
   }
 

From ae3577f48e652459c2fad9ce87cb7812ec227835 Mon Sep 17 00:00:00 2001
From: BinaryWang 
Date: Fri, 30 Sep 2016 16:49:08 +0800
Subject: [PATCH 17/43] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=83=A8=E5=88=86?=
 =?UTF-8?q?=E6=96=87=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/me/chanjar/weixin/mp/api/WxMpUserService.java | 10 +++++-----
 .../java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java |  9 ++++-----
 2 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
index deaf85ab9..f46ca6343 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java
@@ -1,14 +1,14 @@
 package me.chanjar.weixin.mp.api;
 
+import java.util.List;
+
 import me.chanjar.weixin.common.exception.WxErrorException;
 import me.chanjar.weixin.mp.bean.WxMpUserQuery;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
 import me.chanjar.weixin.mp.bean.result.WxMpUserList;
 
-import java.util.List;
-
 /**
- * 用户管理和统计相关操作接口
+ * 用户管理相关操作接口
  *
  * @author Binary Wang
  */
@@ -42,9 +42,9 @@ public interface WxMpUserService {
    * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=批量获取用户基本信息
    * 
* - * @param openidList 用户openid列表 + * @param openids 用户openid列表 */ - List userInfoList(List openidList) throws WxErrorException; + List userInfoList(List openids) throws WxErrorException; /** *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
index b1997f92e..9adcb54d7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java
@@ -20,11 +20,10 @@ import me.chanjar.weixin.mp.util.xml.XStreamTransformer;
 
 /**
  * 
- * 微信推送过来的消息,也是同步回复给用户的消息,xml格式
- * 相关字段的解释看微信开发者文档:
- * http://mp.weixin.qq.com/wiki/index.php?title=接收普通消息
- * http://mp.weixin.qq.com/wiki/index.php?title=接收事件推送
- * http://mp.weixin.qq.com/wiki/index.php?title=接收语音识别结果
+ * 微信推送过来的消息,xml格式
+ * 部分未注释的字段的解释请查阅相关微信开发文档:
+ * 接收普通消息
+ * 接收事件推送
  * 
* * @author chanjarster From 5c53319464b439d42ec26cb35f5b6805634a1fc5 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Fri, 30 Sep 2016 16:56:40 +0800 Subject: [PATCH 18/43] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA=E6=96=B0=E7=89=88=E6=9C=AC2.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ build.gradle | 2 +- pom.xml | 2 +- weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 93da5c677..aba634dd3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** 1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** -1. 最新更新:2016-08-31 发布2.1.0正式版! +1. 最新更新:2016-09-30 发布2.2.0正式版! =========== @@ -33,12 +33,12 @@ maven: com.github.binarywang weixin-java-mp - 2.1.0 + 2.2.0 ``` gradle: ```groovy -compile 'com.github.binarywang:weixin-java-mp:2.1.0' +compile 'com.github.binarywang:weixin-java-mp:2.2.0' ``` * 企业号: @@ -48,12 +48,12 @@ maven: com.github.binarywang weixin-java-cp - 2.1.0 + 2.2.0 ``` gradle: ```groovy -compile 'com.github.binarywang:weixin-java-cp:2.1.0' +compile 'com.github.binarywang:weixin-java-cp:2.2.0' ``` #### 本项目主要存放在github上,地址为 : @@ -74,4 +74,4 @@ compile 'com.github.binarywang:weixin-java-cp:2.1.0' * 本项目可以采用两种方式接受代码贡献: 1. 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 -1. 另外一种贡献代码的方式就是加入SDK Developers开发组,如果对自己的代码足够自信,可以随时提交代码,注意要随时进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 +1. 另外一种贡献代码的方式就是加入SDK Developers开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 diff --git a/build.gradle b/build.gradle index ba705da99..108e69c02 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ allprojects { apply plugin: 'maven' group = 'com.github.binarywang' - version = '2.1.0-SNAPSHOT' + version = '2.2.0' } subprojects { diff --git a/pom.xml b/pom.xml index d79f2f721..e94e5fc16 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.1.2 + 2.2.0 pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 54922f7f4..667aaf76f 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.2 + 2.2.0 weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 9de144fe9..e87e2ea1e 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.2 + 2.2.0 weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 33a4f5ab3..6fc42ee63 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.1.2 + 2.2.0 weixin-java-mp WeiXin Java Tools - MP From 25d9d5dba9334390ad7a4f848a451f9dc5712b3d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 30 Sep 2016 17:35:04 +0800 Subject: [PATCH 19/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aba634dd3..b4165f696 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** -1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== From 8281b636882b08a40a2e33c0a2e3f8f660bc407d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 30 Sep 2016 17:35:24 +0800 Subject: [PATCH 20/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aba634dd3..b4165f696 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** -1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== From 55940005e1cb2b9303eac5bbae68bb1969ebc34d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 1 Oct 2016 14:51:17 +0800 Subject: [PATCH 21/43] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b4165f696..0d02922aa 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,9 @@ =========== ## 版本说明 -* 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; -* BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); -* 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) +1. 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; +1. BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); +1. 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) 分别查看所有最新的版本。 ## Maven & Gradle @@ -69,9 +69,9 @@ compile 'com.github.binarywang:weixin-java-cp:2.2.0' 1. https://github.com/wechat-group/weixin-java-tools-springmvc ## 关于代码贡献 -* 非常欢迎和感谢对本项目发起Pull Request的同学,本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 -* 为了便于设置,本项目引入editorconfig插件,请使用eclipse的同学在贡献代码前安装相关插件,IntelliJ IDEA则自带支持,无需额外安装插件。 -* 本项目可以采用两种方式接受代码贡献: +1. 非常欢迎和感谢对本项目发起Pull Request的同学,本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 +1. 为了便于设置,本项目引入editorconfig插件,请使用eclipse的同学在贡献代码前安装相关插件,IntelliJ IDEA则自带支持,无需额外安装插件。 +1. 本项目可以采用两种方式接受代码贡献: -1. 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 -1. 另外一种贡献代码的方式就是加入SDK Developers开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 + 1. 第一种就是基于[Git Flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 + 1. 另外一种贡献代码的方式就是加入SDK Developers开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 From 2ae95e48efe99f98690e3e0fcd3d7a10f05b2092 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 1 Oct 2016 14:55:47 +0800 Subject: [PATCH 22/43] clean code --- .../chanjar/weixin/mp/api/WxMpPayService.java | 1 - .../mp/api/impl/WxMpKefuServiceImpl.java | 35 +++++++++++-------- .../mp/api/impl/WxMpPayServiceImpl.java | 5 +-- .../weixin/mp/bean/store/WxMpStoreInfo.java | 1 - 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 72eabd08d..c6480e6cc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -6,7 +6,6 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPrepayIdResult; import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java index 99428348f..e83c17ac3 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java @@ -1,6 +1,13 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; +import java.util.Date; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.gson.JsonObject; + import me.chanjar.weixin.common.bean.result.WxError; import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; import me.chanjar.weixin.common.exception.WxErrorException; @@ -10,12 +17,12 @@ import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.WxMpCustomMessage; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfAccountRequest; import me.chanjar.weixin.mp.bean.kefu.request.WxMpKfSessionRequest; -import me.chanjar.weixin.mp.bean.kefu.result.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.Date; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfMsgList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfOnlineList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionGetResult; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionList; +import me.chanjar.weixin.mp.bean.kefu.result.WxMpKfSessionWaitCaseList; /** * @@ -38,7 +45,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send"; String responseContent = this.wxMpService.post(url, message.toJson()); - return true; + return responseContent != null; } @Override @@ -60,7 +67,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/add"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -68,14 +75,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/update"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override public boolean kfAccountInviteWorker(WxMpKfAccountRequest request) throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/inviteworker"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -84,14 +91,14 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { String url = API_URL_PREFIX + "/kfaccount/uploadheadimg?kf_account=" + kfAccount; WxMediaUploadResult responseContent = this.wxMpService .execute(new MediaUploadRequestExecutor(), url, imgFile); - return true; + return responseContent != null; } @Override public boolean kfAccountDel(String kfAccount) throws WxErrorException { String url = API_URL_PREFIX + "/kfaccount/del?kf_account=" + kfAccount; String responseContent = this.wxMpService.get(url, null); - return true; + return responseContent != null; } @Override @@ -100,7 +107,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); String url = API_URL_PREFIX + "/kfsession/create"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override @@ -109,7 +116,7 @@ public class WxMpKefuServiceImpl implements WxMpKefuService { WxMpKfSessionRequest request = new WxMpKfSessionRequest(kfAccount, openid); String url = API_URL_PREFIX + "/kfsession/close"; String responseContent = this.wxMpService.post(url, request.toJson()); - return true; + return responseContent != null; } @Override diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index dcb1e89f4..bc48e0db4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -11,8 +11,6 @@ import java.util.TreeMap; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.joor.Reflect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -42,7 +40,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { private static final List TRADE_TYPES = Lists.newArrayList("JSAPI", "NATIVE", "APP"); - private final Logger log = LoggerFactory.getLogger(WxMpPayServiceImpl.class); private WxMpService wxMpService; public WxMpPayServiceImpl(WxMpService wxMpService) { @@ -286,7 +283,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { if (!TRADE_TYPES.contains(request.getTradeType())) { throw new IllegalArgumentException( - "trade_type目前必须为" + TRADE_TYPES + "其中之一"); +"trade_type目前必须为" + TRADE_TYPES + "其中之一"); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java index 5b44b8604..864d9d2cb 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreInfo.java @@ -1,6 +1,5 @@ package me.chanjar.weixin.mp.bean.store; -import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; From e26322dd2dbc4a83aad26c314a7406e46b8e01ee Mon Sep 17 00:00:00 2001 From: rtsbtx Date: Sat, 1 Oct 2016 15:01:16 +0800 Subject: [PATCH 23/43] Update WxMpUser.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增注释 --- .../main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java index 19d03abff..f56ccf5c2 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpUser.java @@ -121,6 +121,9 @@ public class WxMpUser implements Serializable { this.subscribeTime = subscribeTime; } + /** + *只有在将公众号绑定到微信开放平台帐号后,才会出现该字段。 + */ public String getUnionId() { return this.unionId; } From 118e4c7a28be47c2488c77af43dab77edb7a27be Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Mon, 3 Oct 2016 23:13:59 +0800 Subject: [PATCH 24/43] =?UTF-8?q?=E6=8F=90=E5=8F=96=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=85=AC=E7=94=A8=E6=8E=A5=E5=8F=A3=E5=9C=B0=E5=9D=80=E5=B8=B8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/api/impl/WxMpPayServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index bc48e0db4..965e5df12 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -38,6 +38,7 @@ import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; */ public class WxMpPayServiceImpl implements WxMpPayService { + private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; private static final List TRADE_TYPES = Lists.newArrayList("JSAPI", "NATIVE", "APP"); private WxMpService wxMpService; @@ -77,7 +78,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } request.append(""); - String url = "https://api.mch.weixin.qq.com/pay/orderquery"; + String url = PAY_BASE_URL + "/pay/orderquery"; String responseContent = this.wxMpService.post(url, request.toString()); XStream xstream = XStreamInitializer.getInstance(); xstream.alias("xml", WxMpPayResult.class); @@ -119,7 +120,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } request.append(""); - String url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; + String url = PAY_BASE_URL + "/secapi/pay/refund"; String responseContent = this.wxMpService.post(url, request.toString()); XStream xstream = XStreamInitializer.getInstance(); xstream.processAnnotations(WxMpPayRefundResult.class); @@ -163,10 +164,10 @@ public class WxMpPayServiceImpl implements WxMpPayService { this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); - String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; + String url = PAY_BASE_URL + "/mmpaymkttransfers/sendredpack"; if (request.getAmtType() != null) { //裂变红包 - url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack"; + url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack"; } String responseContent = this.wxMpService.post(url, xstream.toXML(request)); @@ -245,7 +246,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { this.wxMpService.getWxMpConfigStorage().getPartnerKey()); request.setSign(sign); - String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; + String url = PAY_BASE_URL + "/pay/unifiedorder"; String responseContent = this.wxMpService.post(url, xstream.toXML(request)); WxUnifiedOrderResult result = (WxUnifiedOrderResult) xstream @@ -282,8 +283,7 @@ public class WxMpPayServiceImpl implements WxMpPayService { } if (!TRADE_TYPES.contains(request.getTradeType())) { - throw new IllegalArgumentException( -"trade_type目前必须为" + TRADE_TYPES + "其中之一"); + throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); } From f2655e5eed9085d83a3ce77538f42d23fbc721b1 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 4 Oct 2016 23:38:17 +0800 Subject: [PATCH 25/43] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/bean/pay/WxMpPrepayIdResult.java | 124 ------------------ 1 file changed, 124 deletions(-) delete mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java deleted file mode 100644 index cff9d7879..000000000 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPrepayIdResult.java +++ /dev/null @@ -1,124 +0,0 @@ -package me.chanjar.weixin.mp.bean.pay; - -import java.io.Serializable; - -/** - *
- * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果
- * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
- * 
- * - * @author chanjarster - */ -@Deprecated -public class WxMpPrepayIdResult implements Serializable { - private static final long serialVersionUID = -8970574397788396143L; - private String return_code; - private String return_msg; - private String appid; - private String mch_id; - private String nonce_str; - private String sign; - private String result_code; - private String prepay_id; - private String trade_type; - private String err_code; - private String err_code_des; - private String code_url; - - public String getReturn_code() { - return this.return_code; - } - - public void setReturn_code(String return_code) { - this.return_code = return_code; - } - - public String getReturn_msg() { - return this.return_msg; - } - - public void setReturn_msg(String return_msg) { - this.return_msg = return_msg; - } - - public String getAppid() { - return this.appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getMch_id() { - return this.mch_id; - } - - public void setMch_id(String mch_id) { - this.mch_id = mch_id; - } - - public String getNonce_str() { - return this.nonce_str; - } - - public void setNonce_str(String nonce_str) { - this.nonce_str = nonce_str; - } - - public String getSign() { - return this.sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - - public String getResult_code() { - return this.result_code; - } - - public void setResult_code(String result_code) { - this.result_code = result_code; - } - - public String getPrepay_id() { - return this.prepay_id; - } - - public void setPrepay_id(String prepay_id) { - this.prepay_id = prepay_id; - } - - public String getTrade_type() { - return this.trade_type; - } - - public void setTrade_type(String trade_type) { - this.trade_type = trade_type; - } - - public String getErr_code() { - return this.err_code; - } - - public void setErr_code(String err_code) { - this.err_code = err_code; - } - - public String getErr_code_des() { - return this.err_code_des; - } - - public void setErr_code_des(String err_code_des) { - this.err_code_des = err_code_des; - } - - public String getCode_url() { - return this.code_url; - } - - public void setCode_url(String code_url) { - this.code_url = code_url; - } -} From 392429a476cfe1b96f5d06abe03a54a4e5a2fca7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Tue, 4 Oct 2016 23:43:54 +0800 Subject: [PATCH 26/43] =?UTF-8?q?=E4=B8=BAWxErrorException=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=BF=85=E8=A6=81=E6=97=B6=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E5=87=BA=E9=94=99=E8=AF=AF=E6=A0=B9=E6=BA=90=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/common/exception/WxErrorException.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java index 51219a419..4038e6018 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/exception/WxErrorException.java @@ -13,6 +13,11 @@ public class WxErrorException extends Exception { this.error = error; } + public WxErrorException(WxError error, Throwable cause) { + super(error.toString(), cause); + this.error = error; + } + public WxError getError() { return this.error; } From a4b0fdce937759fb309d610432eeb329fe75decc Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 5 Oct 2016 21:35:31 +0800 Subject: [PATCH 27/43] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E6=88=B7?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=9A=84=E6=B5=8B=E8=AF=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- weixin-java-mp/src/test/resources/test-config.sample.xml | 2 ++ 1 file changed, 2 insertions(+) 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 ad46a19e8..2bbc8d8e3 100644 --- a/weixin-java-mp/src/test/resources/test-config.sample.xml +++ b/weixin-java-mp/src/test/resources/test-config.sample.xml @@ -6,6 +6,8 @@ 可以不填写 可以不填写 某个加你公众号的用户的openId + 微信商户平台ID + 商户平台设置的API密钥 模版消息的模版ID 网页授权获取用户信息回调地址 网页应用授权登陆回调地址 From dabafc2a9e52db51f62662c024ded60a472fd300 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 6 Oct 2016 20:53:39 +0800 Subject: [PATCH 28/43] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E4=BB=98=E6=AC=BE=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E6=9C=AA=E8=B0=83=E9=80=9A=EF=BC=8C=E5=9B=A0=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E8=AF=81=E4=B9=A6=20for=20issue=20#50?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 16 ++ .../mp/api/impl/WxMpPayServiceImpl.java | 93 ++++++- .../weixin/mp/bean/pay/WxEntPayRequest.java | 253 ++++++++++++++++++ .../weixin/mp/bean/pay/WxEntPayResult.java | 190 +++++++++++++ .../mp/api/impl/WxMpPayServiceImplTest.java | 15 ++ 5 files changed, 553 insertions(+), 14 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index c6480e6cc..cf5bb8c3a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,8 +1,11 @@ package me.chanjar.weixin.mp.api; +import java.io.File; import java.util.Map; import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; +import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; @@ -85,4 +88,17 @@ public interface WxMpPayService { */ WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; + /** + *
 
+   * 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
+   * 比如目前的保险行业向客户退保、给付、理赔。
+   * 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”https://pay.weixin.qq.com/进行操作。
+   * 注意:与商户微信支付收款资金并非同一账户,需要单独充值。
+   * 文档详见:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
+   * 接口链接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
+   * @param keyFile  证书文件对象
+   * 
+ */ + WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException; + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java index 965e5df12..79e2c3122 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java @@ -1,6 +1,9 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; +import java.io.FileInputStream; import java.lang.reflect.Field; +import java.security.KeyStore; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -8,8 +11,19 @@ import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; +import javax.net.ssl.SSLContext; + import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; import org.joor.Reflect; import com.google.common.collect.Lists; @@ -23,6 +37,8 @@ import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.util.xml.XStreamInitializer; import me.chanjar.weixin.mp.api.WxMpPayService; import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; +import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; @@ -263,6 +279,23 @@ public class WxMpPayServiceImpl implements WxMpPayService { private void checkParameters(WxUnifiedOrderRequest request) { + checkNotNullParams(request); + + if (!TRADE_TYPES.contains(request.getTradeType())) { + throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); + + } + + if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) { + throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid"); + } + + if ("NATIVE".equals(request.getTradeType()) && request.getProductId() == null) { + throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id"); + } + } + + private void checkNotNullParams(Object request) { List nullFields = Lists.newArrayList(); for (Entry entry : Reflect.on(request).fields() .entrySet()) { @@ -281,20 +314,6 @@ public class WxMpPayServiceImpl implements WxMpPayService { if (!nullFields.isEmpty()) { throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值"); } - - if (!TRADE_TYPES.contains(request.getTradeType())) { - throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一"); - - } - - if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) { - throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid"); - } - - if ("NATIVE".equals(request.getTradeType()) - && request.getProductId() == null) { - throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id"); - } } @Override @@ -332,4 +351,50 @@ public class WxMpPayServiceImpl implements WxMpPayService { return payInfo; } + @Override + public WxEntPayResult entPay(WxEntPayRequest request, File keyFile) throws WxErrorException { + checkNotNullParams(request); + + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxEntPayRequest.class); + xstream.processAnnotations(WxEntPayResult.class); + + request.setMchAppid(this.wxMpService.getWxMpConfigStorage().getAppId()); + request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId()); + request.setNonceStr(System.currentTimeMillis() + ""); + + String sign = this.createSign(xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey()); + request.setSign(sign); + + String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers"; + + try (FileInputStream instream = new FileInputStream(keyFile)) { + String mchId = request.getMchId(); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + keyStore.load(instream, mchId.toCharArray()); + + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build(); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, + new DefaultHostnameVerifier()); + + try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) { + HttpPost httpPost = new HttpPost(url); + httpPost.setEntity(new StringEntity(new String(xstream.toXML(request).getBytes("UTF-8"), "ISO-8859-1"))); + + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + String responseContent = EntityUtils.toString(response.getEntity()); + WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent); + if ("FAIL".equals(result.getResultCode())) { + throw new WxErrorException( + WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build()); + } + + return result; + } + } + } catch (Exception e) { + throw new WxErrorException(WxError.newBuilder().setErrorMsg(e.getMessage()).build(), e); + } + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java new file mode 100644 index 000000000..9c7253d2a --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -0,0 +1,253 @@ +package me.chanjar.weixin.mp.bean.pay; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 企业付款请求对象 + * 注释中各行含义如下: + * 字段名、 变量名、 是否必填、 示例值、 类型、 描述 + * Created by Binary Wang on 2016/10/02. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayRequest { + /** + * 公众账号appid + * mch_appid + * 是 + * wx8888888888888888 + * String + * 微信分配的公众账号ID(企业号corpid即为此appId) + */ + @XStreamAlias("mch_appid") + private String mchAppid; + + /** + * 商户号 + * mchid + * 是 + * 1900000109 + * String(32) + * 微信支付分配的商户号 + */ + @XStreamAlias("mchid") + private String mchId; + + /** + * 设备号 + * device_info + * 否 + * 13467007045764 + * String(32) + *微信支付分配的终端设备号 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 随机字符串 + * nonce_str + *是 + *5K8264ILTKCH16CQ2502SI8ZNMTM67VS + *String(32) + *随机字符串,不长于32位 + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + * 签名 + * sign + * 是 + * C380BEC2BFD727A4B6845133519F3AD6 + * String(32) + *签名,详见签名算法 + */ + @XStreamAlias("sign") + private String sign; + + /** + * 商户订单号 + * partner_trade_no + * 是 + * 10000098201411111234567890 + * String + * 商户订单号, + */ + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + * 需保持唯一性 用户openid + * openid + * 是 + * oxTWIuGaIt6gTKsQRLau2M0yL16E + * String + * 商户appid下,某用户的openid + */ + @XStreamAlias("openid") + private String openid; + + /** + * 校验用户姓名选项 + * check_name + * 是 + * OPTION_CHECK + * String + * NO_CHECK:不校验真实姓名  + * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)  + * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) + */ + @XStreamAlias("check_name") + private String checkName; + + /** + * 收款用户姓名 + * re_user_name + * 可选 + * 马花花 + * String + * 收款用户真实姓名。 + * 如果check_name设置为FORCE_CHECK或OPTION_CHECK, 则必填用户真实姓名 + */ + @XStreamAlias("re_user_name") + private String reUserName; + + /** + * 金额 + * amount + * 是 + * 10099 + * int + * 企业付款金额, 单位为分 + */ + @XStreamAlias("amount") + private Integer amount; + + /** + * 企业付款描述信息 + * desc + * 是 + * 理赔 + * String + * 企业付款操作说明信息。必填。 + */ + @XStreamAlias("desc") + private String description; + + /** + * Ip地址 + * spbill_create_ip + * 是 + * 192.168.0.1 + * String(32) + * 调用接口的机器Ip地址 + */ + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + public String getMchAppid() { + return mchAppid; + } + + public void setMchAppid(String mchAppid) { + this.mchAppid = mchAppid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getCheckName() { + return checkName; + } + + public void setCheckName(String checkName) { + this.checkName = checkName; + } + + public String getReUserName() { + return reUserName; + } + + public void setReUserName(String reUserName) { + this.reUserName = reUserName; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSpbillCreateIp() { + return spbillCreateIp; + } + + public void setSpbillCreateIp(String spbillCreateIp) { + this.spbillCreateIp = spbillCreateIp; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java new file mode 100644 index 000000000..b2dbb8f11 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayResult.java @@ -0,0 +1,190 @@ +package me.chanjar.weixin.mp.bean.pay; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 企业付款返回结果 + * Created by Binary Wang on 2016/10/02. + * @author binarywang (https://github.com/binarywang) + */ +@XStreamAlias("xml") +public class WxEntPayResult { + + /** + * 返回状态码 + */ + @XStreamAlias("return_code") + private String returnCode; + + /** + * 返回信息 + */ + @XStreamAlias("return_msg") + private String returnMsg; + + //############以下字段在return_code为SUCCESS的时候有返回 + + /** + * 商户appid + */ + @XStreamAlias("mch_appid") + private String mchAppid; + + /** + * 商户号 + */ + @XStreamAlias("mchid") + private String mchId; + + /** + * 设备号 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 随机字符串 + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + * 业务结果 + */ + @XStreamAlias("result_code") + private String resultCode; + /** + * 错误代码 + */ + @XStreamAlias("err_code") + private String errCode; + + /** + * 错误代码描述 + */ + @XStreamAlias("err_code_des") + private String errCodeDes; + + //############以下字段在return_code 和result_code都为SUCCESS的时候有返回############## + /** + * 商户订单号 + */ + @XStreamAlias("partner_trade_no") + private String partnerTradeNo; + + /** + * 微信订单号 + */ + @XStreamAlias("payment_no") + private String paymentNo; + + /** + * 微信支付成功时间 + */ + @XStreamAlias("payment_time") + private String paymentTime; + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); + } + + public String getReturnCode() { + return returnCode; + } + + public void setReturnCode(String returnCode) { + this.returnCode = returnCode; + } + + public String getReturnMsg() { + return returnMsg; + } + + public void setReturnMsg(String returnMsg) { + this.returnMsg = returnMsg; + } + + public String getMchAppid() { + return mchAppid; + } + + public void setMchAppid(String mchAppid) { + this.mchAppid = mchAppid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } + + public String getErrCode() { + return errCode; + } + + public void setErrCode(String errCode) { + this.errCode = errCode; + } + + public String getErrCodeDes() { + return errCodeDes; + } + + public void setErrCodeDes(String errCodeDes) { + this.errCodeDes = errCodeDes; + } + + public String getPartnerTradeNo() { + return partnerTradeNo; + } + + public void setPartnerTradeNo(String partnerTradeNo) { + this.partnerTradeNo = partnerTradeNo; + } + + public String getPaymentNo() { + return paymentNo; + } + + public void setPaymentNo(String paymentNo) { + this.paymentNo = paymentNo; + } + + public String getPaymentTime() { + return paymentTime; + } + + public void setPaymentTime(String paymentTime) { + this.paymentTime = paymentTime; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 092be38ab..6199efeb6 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -1,5 +1,7 @@ package me.chanjar.weixin.mp.api.impl; +import java.io.File; + import org.testng.annotations.Guice; import org.testng.annotations.Test; @@ -8,6 +10,7 @@ import com.google.inject.Inject; import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; @@ -74,4 +77,16 @@ public class WxMpPayServiceImplTest { .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); System.err.println(result); } + + /** + * Test method for {@link me.chanjar.weixin.mp.api.impl.WxMpPayServiceImpl#entPay(WxEntPayRequest, File)}. + * @throws WxErrorException + */ + @Test + public final void testEntPay() throws WxErrorException { + File keyFile = new File("E:\\dlt.p12"); + WxEntPayRequest request = new WxEntPayRequest(); + System.err.println(this.wxService.getPayService().entPay(request, keyFile)); + } + } From 782bc6a772bdd27e4160383ef9efd3ef3f808aff Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:07:22 +0800 Subject: [PATCH 29/43] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0d02922aa..d44403320 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** 1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk ,其他更早的JDK版本则需要自己改造实现; 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== @@ -19,9 +20,9 @@ =========== ## 版本说明 -1. 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.0.0,2.1.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; +1. 本项目定为每月发布一次正式版,版本号格式为X.X.0(如2.1.0,2.2.0等),月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request; 1. BUG修复和新特性一般会先发布成小版本作为临时版本(如2.0.1,2.0.2等,即尾号不为0,以区别于正式版); -1. 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接[【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) +1. 目前最新版本号为 ![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) ,也可以通过访问链接 [【公众号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-mp%22) 、[【企业号】](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.github.binarywang%22%20AND%20a%3A%22weixin-java-cp%22) 分别查看所有最新的版本。 ## Maven & Gradle @@ -56,6 +57,8 @@ gradle: compile 'com.github.binarywang:weixin-java-cp:2.2.0' ``` +=========== + #### 本项目主要存放在github上,地址为 : * https://github.com/wechat-group/weixin-java-tools * ===========但同时会在其他几个网站同步更新,地址分别是: @@ -63,11 +66,12 @@ compile 'com.github.binarywang:weixin-java-cp:2.2.0' * http://git.oschina.net/binary/weixin-java-tools * https://git.coding.net/binarywang/weixin-java-tools.git - +=========== ## 目前可参考的Demo项目有两个: 1. https://github.com/wechat-group/weixin-mp-demo 1. https://github.com/wechat-group/weixin-java-tools-springmvc +=========== ## 关于代码贡献 1. 非常欢迎和感谢对本项目发起Pull Request的同学,本项目代码风格为使用2个空格代表一个Tab,因此在提交代码时请注意一下,否则很容易在IDE格式化代码后与原代码产生大量diff,这样会给其他人阅读代码带来极大的困扰。 1. 为了便于设置,本项目引入editorconfig插件,请使用eclipse的同学在贡献代码前安装相关插件,IntelliJ IDEA则自带支持,无需额外安装插件。 From 03f029c68c428a216c46e745c0e60b87b0f408b6 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:12:27 +0800 Subject: [PATCH 30/43] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=8E=9F=E4=BD=9C?= =?UTF-8?q?=E8=80=85=E4=BF=A1=E6=81=AF=20https://github.com/chanjarster/we?= =?UTF-8?q?ixin-java-tools/pull/277?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/util/http/ApacheHttpClientBuilder.java | 1 + .../common/util/http/DefaultApacheHttpClientBuilder.java | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java index 8bd900ca3..c932445d3 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/ApacheHttpClientBuilder.java @@ -5,6 +5,7 @@ import org.apache.http.impl.client.CloseableHttpClient; /** * httpclient build interface + * @author kakotor */ public interface ApacheHttpClientBuilder { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java index f69dcc6c4..0e6f90000 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/DefaultApacheHttpClientBuilder.java @@ -1,6 +1,8 @@ package me.chanjar.weixin.common.util.http; -import me.chanjar.weixin.common.util.StringUtils; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + import org.apache.http.annotation.NotThreadSafe; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; @@ -21,11 +23,11 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.protocol.HttpContext; -import java.io.IOException; -import java.util.concurrent.TimeUnit; +import me.chanjar.weixin.common.util.StringUtils; /** * httpclient 连接管理器 + * @author kakotor */ @NotThreadSafe public class DefaultApacheHttpClientBuilder implements ApacheHttpClientBuilder { From d9a32d87b90d18052c1755f9e866a6b8d6ec463c Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Fri, 7 Oct 2016 14:17:20 +0800 Subject: [PATCH 31/43] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d44403320..c473c9cdb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** 1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** -1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk ,其他更早的JDK版本则需要自己改造实现; +1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现; 1. 最新更新:2016-09-30 发布2.2.0正式版! =========== From 5aba474ffe9331e2ddd79c02244968b4ed9f852f Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 12:07:47 +0800 Subject: [PATCH 32/43] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0pre=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/mp/bean/pay/WxEntPayRequest.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java index 9c7253d2a..ea900b502 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -15,83 +15,98 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("xml") public class WxEntPayRequest { /** + *
   * 公众账号appid
   * mch_appid
   * 是
   * wx8888888888888888
   * String
   * 微信分配的公众账号ID(企业号corpid即为此appId)
+   * 
*/ @XStreamAlias("mch_appid") private String mchAppid; /** + *
   *  商户号
   *  mchid
   *  是
   *  1900000109
   *  String(32)
   *  微信支付分配的商户号
+   * 
*/ @XStreamAlias("mchid") private String mchId; /** + *
   * 设备号
   * device_info
   * 否
   * 13467007045764
   * String(32)
   *微信支付分配的终端设备号
+   * 
*/ @XStreamAlias("device_info") private String deviceInfo; /** + *
   * 随机字符串
   * nonce_str
   *是
   *5K8264ILTKCH16CQ2502SI8ZNMTM67VS
   *String(32)
   *随机字符串,不长于32位
+   * 
*/ @XStreamAlias("nonce_str") private String nonceStr; /** + *
   * 签名
   * sign
   * 是
   * C380BEC2BFD727A4B6845133519F3AD6
   * String(32)
   *签名,详见签名算法
+   * 
*/ @XStreamAlias("sign") private String sign; /** + *
   * 商户订单号
   * partner_trade_no
   * 是
   * 10000098201411111234567890
   * String
-  * 商户订单号,
+  * 商户订单号
+   * 
*/ @XStreamAlias("partner_trade_no") private String partnerTradeNo; /** + *
   * 需保持唯一性 用户openid
   * openid
   * 是
   * oxTWIuGaIt6gTKsQRLau2M0yL16E
   * String
   * 商户appid下,某用户的openid
+   * 
*/ @XStreamAlias("openid") private String openid; /** + *
   * 校验用户姓名选项
   * check_name
   * 是
@@ -100,11 +115,13 @@ public class WxEntPayRequest {
   * NO_CHECK:不校验真实姓名 
   * FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) 
   * OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
+   * 
*/ @XStreamAlias("check_name") private String checkName; /** + *
   * 收款用户姓名
   * re_user_name
   * 可选
@@ -112,39 +129,46 @@ public class WxEntPayRequest {
   * String
   * 收款用户真实姓名。
   * 如果check_name设置为FORCE_CHECK或OPTION_CHECK,  则必填用户真实姓名
+   * 
*/ @XStreamAlias("re_user_name") private String reUserName; /** + *
   * 金额
   * amount
   * 是
   * 10099
   * int
   * 企业付款金额, 单位为分
+   * 
*/ @XStreamAlias("amount") private Integer amount; /** + *
   * 企业付款描述信息
   * desc
   * 是
   * 理赔
   * String
   * 企业付款操作说明信息。必填。
+   * 
*/ @XStreamAlias("desc") private String description; /** + *
   * Ip地址
   * spbill_create_ip
   * 是
   * 192.168.0.1
   * String(32)
   * 调用接口的机器Ip地址
+   * 
*/ @XStreamAlias("spbill_create_ip") private String spbillCreateIp; From ff20ecb56c52663e4b979241cc9ba36e3274ef1a Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 14:38:26 +0800 Subject: [PATCH 33/43] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=BD=91=E5=9D=80?= =?UTF-8?q?=E5=85=B1=E5=90=8C=E9=83=A8=E5=88=86=E4=B8=BA=E5=B7=B2=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 4d3639c82..94749c126 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -102,7 +102,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public boolean batchTagging(Long tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging"; + String url = API_URL_PREFIX + "/members/batchtagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -124,7 +124,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public boolean batchUntagging(Long tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging"; + String url = API_URL_PREFIX + "/members/batchuntagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -145,7 +145,7 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { @Override public List userTagList(String openid) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/getidlist"; + String url = API_URL_PREFIX + "/getidlist"; JsonObject json = new JsonObject(); json.addProperty("openid", openid); From d9d0f5403ec7ce97179fdfffc7a45f426f24562c Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 14:38:44 +0800 Subject: [PATCH 34/43] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/bean/pay/WxEntPayRequest.java | 11 +++++++++-- .../weixin/mp/bean/pay/WxUnifiedOrderRequest.java | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java index ea900b502..38ed704a6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -6,9 +6,16 @@ import org.apache.commons.lang3.builder.ToStringStyle; import com.thoughtworks.xstream.annotations.XStreamAlias; /** + *
  * 企业付款请求对象
- * 注释中各行含义如下:
- * 字段名、 变量名、 是否必填、 示例值、 类型、 描述
+ * 注释中各行每个字段描述对应如下:
+ * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • * Created by Binary Wang on 2016/10/02. * @author binarywang (https://github.com/binarywang) */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java index ccdfff903..4173c3734 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxUnifiedOrderRequest.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.common.annotation.Required; *
      * 统一下单请求参数对象
      * 参考文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
    - * 每个字段描述对应如下:
    + * 注释中各行每个字段描述对应如下:
      * 
  • 字段名 *
  • 变量名 *
  • 是否必填 From 10ce6a8920cf66680db771391a7534cf8250e07d Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 15:02:45 +0800 Subject: [PATCH 35/43] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/WxMpUserTagServiceImplTest.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 9fc579c99..569b696da 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -1,17 +1,15 @@ package me.chanjar.weixin.mp.api.impl; -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; import me.chanjar.weixin.mp.bean.tag.WxTagListUser; import me.chanjar.weixin.mp.bean.tag.WxUserTag; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.util.List; /** * @@ -64,6 +62,14 @@ public class WxMpUserTagServiceImplTest { Assert.assertNotNull(res); } + @Test + public void testBatchTagging() throws Exception { + String[] openids = new String[]{((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()}; + boolean res = this.wxService.getUserTagService().batchTagging(this.tagId, openids); + System.out.println(res); + Assert.assertTrue(res); + } + @Test public void testBatchUntagging() throws Exception { String[] openids = new String[]{((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid()}; From 5fe1c061f27f1abde29078a2a1454097a578eb45 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:07:36 +0800 Subject: [PATCH 36/43] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chanjar/weixin/mp/api/WxMpPayService.java | 35 +- .../mp/api/impl/WxMpPayServiceImpl.java | 147 ++++----- .../weixin/mp/api/impl/WxMpServiceImpl.java | 65 ++-- .../mp/bean/pay/WxMpPayRefundRequest.java | 301 ++++++++++++++++++ .../mp/api/impl/WxMpPayServiceImplTest.java | 26 +- 5 files changed, 414 insertions(+), 160 deletions(-) create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index cf5bb8c3a..45973443a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -1,19 +1,11 @@ package me.chanjar.weixin.mp.api; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.mp.bean.pay.*; + import java.io.File; import java.util.Map; -import me.chanjar.weixin.common.exception.WxErrorException; -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; -import me.chanjar.weixin.mp.bean.pay.WxEntPayResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback; -import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult; -import me.chanjar.weixin.mp.bean.pay.WxMpPayResult; -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; - /** * 微信支付相关接口 * Created by Binary Wang on 2016/7/28. @@ -25,7 +17,7 @@ public interface WxMpPayService { * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" * 接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder - * @throws WxErrorException + * @throws WxErrorException * */ WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request) @@ -42,7 +34,7 @@ public interface WxMpPayService { /** * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。 * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 - * @throws WxErrorException + * @throws WxErrorException * */ WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) @@ -56,18 +48,15 @@ public interface WxMpPayService { WxMpPayCallback getJSSDKCallbackData(String xmlData); /** + *
        * 微信支付-申请退款
        * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
    -   *
    -   * @param parameters 需要传入的退款参数的Map。以下几项为参数的必须项:
    - *
  • transaction_id - *
  • out_trade_no (仅在上述transaction_id为空时是必须项) - *
  • out_refund_no - *
  • total_fee - *
  • refund_fee + * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund + *
  • + * @param keyFile 证书文件对象 * @return 退款操作结果 */ - WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException; + WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile) throws WxErrorException; /** *
    @@ -80,7 +69,7 @@ public interface WxMpPayService {
     
       /**
        * 发送微信红包给个人用户
    -   * 
     
    +   * 
        * 文档详见:
        * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
        * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4
    @@ -89,7 +78,7 @@ public interface WxMpPayService {
       WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException;
     
       /**
    -   * 
     
    +   * 
        * 企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。
        * 比如目前的保险行业向客户退保、给付、理赔。
        * 企业付款将使用商户的可用余额,需确保可用余额充足。查看可用余额、充值、提现请登录商户平台“资金管理”https://pay.weixin.qq.com/进行操作。
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 79e2c3122..a8d5dc3f3 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -1,19 +1,18 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.io.File;
    -import java.io.FileInputStream;
    -import java.lang.reflect.Field;
    -import java.security.KeyStore;
    -import java.util.HashMap;
    -import java.util.List;
    -import java.util.Map;
    -import java.util.Map.Entry;
    -import java.util.SortedMap;
    -import java.util.TreeMap;
    -
    -import javax.net.ssl.SSLContext;
    -
    +import com.google.common.collect.Lists;
    +import com.google.common.collect.Maps;
    +import com.thoughtworks.xstream.XStream;
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.annotation.Required;
    +import me.chanjar.weixin.common.bean.result.WxError;
    +import me.chanjar.weixin.common.exception.WxErrorException;
    +import me.chanjar.weixin.common.util.xml.XStreamInitializer;
    +import me.chanjar.weixin.mp.api.WxMpPayService;
    +import me.chanjar.weixin.mp.api.WxMpService;
    +import me.chanjar.weixin.mp.bean.pay.*;
     import org.apache.commons.codec.digest.DigestUtils;
    +import org.apache.commons.lang3.ArrayUtils;
     import org.apache.commons.lang3.StringUtils;
     import org.apache.http.client.methods.CloseableHttpResponse;
     import org.apache.http.client.methods.HttpPost;
    @@ -26,26 +25,13 @@ import org.apache.http.ssl.SSLContexts;
     import org.apache.http.util.EntityUtils;
     import org.joor.Reflect;
     
    -import com.google.common.collect.Lists;
    -import com.google.common.collect.Maps;
    -import com.thoughtworks.xstream.XStream;
    -import com.thoughtworks.xstream.annotations.XStreamAlias;
    -
    -import me.chanjar.weixin.common.annotation.Required;
    -import me.chanjar.weixin.common.bean.result.WxError;
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.common.util.xml.XStreamInitializer;
    -import me.chanjar.weixin.mp.api.WxMpPayService;
    -import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxEntPayResult;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
    -import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
    -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
    -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
    -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
    +import javax.net.ssl.SSLContext;
    +import java.io.File;
    +import java.io.FileInputStream;
    +import java.lang.reflect.Field;
    +import java.security.KeyStore;
    +import java.util.*;
    +import java.util.Map.Entry;
     
     /**
      * Created by Binary Wang on 2016/7/28.
    @@ -55,8 +41,10 @@ import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
     public class WxMpPayServiceImpl implements WxMpPayService {
     
       private static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com";
    -  private static final List TRADE_TYPES = Lists.newArrayList("JSAPI",
    -      "NATIVE", "APP");
    +  private static final String[] TRADE_TYPES = new String[]{"JSAPI","NATIVE", "APP"};
    +  private static final String[] REFUND_ACCOUNT =  new String[]{"REFUND_SOURCE_RECHARGE_FUNDS",
    +    "REFUND_SOURCE_UNSETTLED_FUNDS"};
    +
       private WxMpService wxMpService;
     
       public WxMpPayServiceImpl(WxMpService wxMpService) {
    @@ -115,33 +103,25 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxMpPayRefundResult refundPay(Map parameters)
    +  public WxMpPayRefundResult refund(WxMpPayRefundRequest request, File keyFile)
           throws WxErrorException {
    -    SortedMap refundParams = new TreeMap<>(parameters);
    -    refundParams.put("appid",
    -        this.wxMpService.getWxMpConfigStorage().getAppId());
    -    refundParams.put("mch_id",
    -        this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    refundParams.put("nonce_str", System.currentTimeMillis() + "");
    -    refundParams.put("op_user_id",
    -        this.wxMpService.getWxMpConfigStorage().getPartnerId());
    -    String sign = this.createSign(refundParams,
    -        this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    -    refundParams.put("sign", sign);
    +    checkParameters(request);
     
    -    StringBuilder request = new StringBuilder("");
    -    for (Map.Entry para : refundParams.entrySet()) {
    -      request.append(String.format("<%s>%s", para.getKey(),
    -          para.getValue(), para.getKey()));
    -    }
    -    request.append("");
    -
    -    String url = PAY_BASE_URL + "/secapi/pay/refund";
    -    String responseContent = this.wxMpService.post(url, request.toString());
         XStream xstream = XStreamInitializer.getInstance();
         xstream.processAnnotations(WxMpPayRefundResult.class);
    -    WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream
    -        .fromXML(responseContent);
    +    xstream.processAnnotations(WxMpPayRefundRequest.class);
    +
    +    request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
    +    String partnerId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    +    request.setMchId(partnerId);
    +    request.setNonceStr( System.currentTimeMillis() + "");
    +    request.setOpUserId(partnerId);
    +    String sign = this.createSign(this.xmlBean2Map(request), this.wxMpService.getWxMpConfigStorage().getPartnerKey());
    +    request.setSign(sign);
    +
    +    String url = PAY_BASE_URL + "/secapi/pay/refund";
    +    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, partnerId);
    +    WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
             || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
    @@ -158,6 +138,20 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return wxMpPayRefundResult;
       }
     
    +  private void checkParameters(WxMpPayRefundRequest request) {
    +    checkNotNullParams(request);
    +
    +    if (StringUtils.isNotBlank(request.getRefundAccount())) {
    +      if(!ArrayUtils.contains(REFUND_ACCOUNT, request.getRefundAccount())){
    +        throw new IllegalArgumentException("refund_account目前必须为" + Arrays.toString(REFUND_ACCOUNT) + "其中之一");
    +      }
    +    }
    +
    +    if (StringUtils.isBlank(request.getOutTradeNo()) && StringUtils.isBlank(request.getTransactionId())) {
    +      throw new IllegalArgumentException("transaction_id 和 out_trade_no 不能同时为空,必须提供一个");
    +    }
    +  }
    +
       @Override
       public boolean checkJSSDKCallbackDataSignature(Map kvm,
           String signature) {
    @@ -176,7 +170,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
         request.setNonceStr(System.currentTimeMillis() + "");
     
    -    String sign = this.createSign(xmlBean2Map(request),
    +    String sign = this.createSign(this.xmlBean2Map(request),
             this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         request.setSign(sign);
     
    @@ -258,7 +252,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
         request.setNonceStr(System.currentTimeMillis() + "");
     
    -    String sign = this.createSign(xmlBean2Map(request),
    +    String sign = this.createSign(this.xmlBean2Map(request),
             this.wxMpService.getWxMpConfigStorage().getPartnerKey());
         request.setSign(sign);
     
    @@ -274,16 +268,13 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         }
     
         return result;
    -
       }
     
       private void checkParameters(WxUnifiedOrderRequest request) {
    -
         checkNotNullParams(request);
     
    -    if (!TRADE_TYPES.contains(request.getTradeType())) {
    -      throw new IllegalArgumentException("trade_type目前必须为" + TRADE_TYPES + "其中之一");
    -
    +    if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) {
    +      throw new IllegalArgumentException("trade_type目前必须为" + Arrays.toString(TRADE_TYPES) + "其中之一");
         }
     
         if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) {
    @@ -368,10 +359,19 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
     
    -    try (FileInputStream instream = new FileInputStream(keyFile)) {
    -      String mchId = request.getMchId();
    +    String responseContent = this.executeRequestWithKeyFile(xstream.toXML(request), url, keyFile, request.getMchId());
    +    WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
    +    if ("FAIL".equals(result.getResultCode())) {
    +      throw new WxErrorException(
    +        WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    +    }
    +    return result;
    +  }
    +
    +  private String executeRequestWithKeyFile( String requestStr, String url, File keyFile, String mchId) throws WxErrorException {
    +    try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
    -      keyStore.load(instream, mchId.toCharArray());
    +      keyStore.load(inputStream, mchId.toCharArray());
     
           SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
           SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
    @@ -379,17 +379,10 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
           try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build()) {
             HttpPost httpPost = new HttpPost(url);
    -        httpPost.setEntity(new StringEntity(new String(xstream.toXML(request).getBytes("UTF-8"), "ISO-8859-1")));
    +        httpPost.setEntity(new StringEntity(new String(requestStr.getBytes("UTF-8"), "ISO-8859-1")));
     
             try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
    -          String responseContent = EntityUtils.toString(response.getEntity());
    -          WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
    -          if ("FAIL".equals(result.getResultCode())) {
    -            throw new WxErrorException(
    -                WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build());
    -          }
    -
    -          return result;
    +          return EntityUtils.toString(response.getEntity());
             }
           }
         } catch (Exception e) {
    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 1a7ffe841..4cd268947 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
    @@ -1,7 +1,21 @@
     package me.chanjar.weixin.mp.api.impl;
     
    -import java.io.IOException;
    -
    +import com.google.gson.JsonArray;
    +import com.google.gson.JsonElement;
    +import com.google.gson.JsonObject;
    +import com.google.gson.JsonParser;
    +import me.chanjar.weixin.common.bean.WxAccessToken;
    +import me.chanjar.weixin.common.bean.WxJsapiSignature;
    +import me.chanjar.weixin.common.bean.result.WxError;
    +import me.chanjar.weixin.common.exception.WxErrorException;
    +import me.chanjar.weixin.common.session.StandardSessionManager;
    +import me.chanjar.weixin.common.session.WxSessionManager;
    +import me.chanjar.weixin.common.util.RandomUtils;
    +import me.chanjar.weixin.common.util.crypto.SHA1;
    +import me.chanjar.weixin.common.util.http.*;
    +import me.chanjar.weixin.mp.api.*;
    +import me.chanjar.weixin.mp.bean.*;
    +import me.chanjar.weixin.mp.bean.result.*;
     import org.apache.http.HttpHost;
     import org.apache.http.client.config.RequestConfig;
     import org.apache.http.client.methods.CloseableHttpResponse;
    @@ -13,51 +27,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
     import org.slf4j.Logger;
     import org.slf4j.LoggerFactory;
     
    -import com.google.gson.JsonArray;
    -import com.google.gson.JsonElement;
    -import com.google.gson.JsonObject;
    -import com.google.gson.JsonParser;
    -
    -import me.chanjar.weixin.common.bean.WxAccessToken;
    -import me.chanjar.weixin.common.bean.WxJsapiSignature;
    -import me.chanjar.weixin.common.bean.result.WxError;
    -import me.chanjar.weixin.common.exception.WxErrorException;
    -import me.chanjar.weixin.common.session.StandardSessionManager;
    -import me.chanjar.weixin.common.session.WxSessionManager;
    -import me.chanjar.weixin.common.util.RandomUtils;
    -import me.chanjar.weixin.common.util.crypto.SHA1;
    -import me.chanjar.weixin.common.util.http.ApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.DefaultApacheHttpClientBuilder;
    -import me.chanjar.weixin.common.util.http.RequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
    -import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
    -import me.chanjar.weixin.common.util.http.URIUtil;
    -import me.chanjar.weixin.mp.api.WxMpCardService;
    -import me.chanjar.weixin.mp.api.WxMpConfigStorage;
    -import me.chanjar.weixin.mp.api.WxMpDataCubeService;
    -import me.chanjar.weixin.mp.api.WxMpKefuService;
    -import me.chanjar.weixin.mp.api.WxMpMaterialService;
    -import me.chanjar.weixin.mp.api.WxMpMenuService;
    -import me.chanjar.weixin.mp.api.WxMpPayService;
    -import me.chanjar.weixin.mp.api.WxMpQrcodeService;
    -import me.chanjar.weixin.mp.api.WxMpService;
    -import me.chanjar.weixin.mp.api.WxMpStoreService;
    -import me.chanjar.weixin.mp.api.WxMpUserBlacklistService;
    -import me.chanjar.weixin.mp.api.WxMpUserService;
    -import me.chanjar.weixin.mp.api.WxMpUserTagService;
    -import me.chanjar.weixin.mp.bean.WxMpIndustry;
    -import me.chanjar.weixin.mp.bean.WxMpMassNews;
    -import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassTagMessage;
    -import me.chanjar.weixin.mp.bean.WxMpMassVideo;
    -import me.chanjar.weixin.mp.bean.WxMpSemanticQuery;
    -import me.chanjar.weixin.mp.bean.WxMpTemplateMessage;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
    -import me.chanjar.weixin.mp.bean.result.WxMpSemanticQueryResult;
    -import me.chanjar.weixin.mp.bean.result.WxMpUser;
    +import java.io.IOException;
     
     public class WxMpServiceImpl implements WxMpService {
     
    @@ -477,6 +447,7 @@ public class WxMpServiceImpl implements WxMpService {
           }
           return null;
         } catch (IOException e) {
    +      this.log.error("\n[URL]:  {}\n[PARAMS]: {}\n[EXECEPTION]: {}", uri, data, e.getMessage());
           throw new RuntimeException(e);
         }
       }
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java
    new file mode 100644
    index 000000000..e375d64ef
    --- /dev/null
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java
    @@ -0,0 +1,301 @@
    +package me.chanjar.weixin.mp.bean.pay;
    +
    +import com.thoughtworks.xstream.annotations.XStreamAlias;
    +import me.chanjar.weixin.common.annotation.Required;
    +
    +/**
    + * 
    + * 微信支付-申请退款请求参数
    + * 注释中各行每个字段描述对应如下:
    + * 
  • 字段名 + *
  • 变量名 + *
  • 是否必填 + *
  • 类型 + *
  • 示例值 + *
  • 描述 + *
  • + * + * @author binarywang(https://github.com/binarywang) + * Created by Binary Wang on 2016-10-08. + */ +@XStreamAlias("xml") +public class WxMpPayRefundRequest { + /** + *
    +   * 公众账号ID
    +   * appid
    +   * 是
    +   * String(32)
    +   * wx8888888888888888
    +   * 微信分配的公众账号ID(企业号corpid即为此appId)
    +   * 
    + */ + @XStreamAlias("appid") + private String appid; + + /** + *
    +   * 商户号
    +   * mch_id
    +   * 是
    +   * String(32)
    +   * 1900000109
    +   * 微信支付分配的商户号
    +   * 
    + */ + @XStreamAlias("mch_id") + private String mchId; + + /** + *
    +   * 设备号
    +   * device_info
    +   * 否
    +   * String(32)
    +   * 13467007045764
    +   * 终端设备号
    +   * 
    + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
    +   * 随机字符串
    +   * nonce_str
    +   * 是
    +   * String(32)
    +   * 5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    +   * 随机字符串,不长于32位。推荐随机数生成算法
    +   * 
    + */ + @XStreamAlias("nonce_str") + private String nonceStr; + + /** + *
    +   * 签名
    +   * sign
    +   * 是
    +   * String(32)
    +   * C380BEC2BFD727A4B6845133519F3AD6
    +   * 签名,详见签名生成算法
    +   * 
    + */ + @XStreamAlias("sign") + private String sign; + + /** + *
    +   * 微信订单号
    +   * transaction_id
    +   * 跟out_trade_no二选一
    +   * String(28)
    +   * 1217752501201400000000000000
    +   * 微信生成的订单号,在支付通知中有返回
    +   * 
    + */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
    +   * 商户订单号
    +   * out_trade_no
    +   * 跟transaction_id二选一
    +   * String(32)
    +   * 1217752501201400000000000000
    +   * 商户侧传给微信的订单号
    +   * 
    + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
    +   * 商户退款单号
    +   * out_refund_no
    +   * 是
    +   * String(32)
    +   * 1217752501201400000000000000
    +   * 商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
    +   * 
    + */ + @Required + @XStreamAlias("out_refund_no") + private String outRefundNo; + + /** + *
    +   * 订单金额
    +   * total_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 订单总金额,单位为分,只能为整数,详见支付金额
    +   * 
    + */ + @Required + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
    +   * 退款金额
    +   * refund_fee
    +   * 是
    +   * Int
    +   * 100
    +   * 退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
    +   * 
    + */ + @Required + @XStreamAlias("refund_fee") + private Integer refundFee; + + /** + *
    +   * 货币种类
    +   * refund_fee_type
    +   * 否
    +   * String(8)
    +   * CNY
    +   * 货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
    +   * 
    + */ + @XStreamAlias("refund_fee_type") + private String refundFeeType; + + /** + *
    +   * 操作员
    +   * op_user_id
    +   * 是
    +   * String(32)
    +   * 1900000109
    +   * 操作员帐号, 默认为商户号
    +   * 
    + */ + //@Required + @XStreamAlias("op_user_id") + private String opUserId; + + /** + *
    +   * 退款资金来源
    +   * refund_account
    +   * 否
    +   * String(30)
    +   * REFUND_SOURCE_RECHARGE_FUNDS
    +   * 仅针对老资金流商户使用,
    +   * 
  • REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款), + *
  • REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款 + *
  • + */ + @XStreamAlias("refund_account") + private String refundAccount; + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getDeviceInfo() { + return deviceInfo; + } + + public void setDeviceInfo(String deviceInfo) { + this.deviceInfo = deviceInfo; + } + + public String getNonceStr() { + return nonceStr; + } + + public void setNonceStr(String nonceStr) { + this.nonceStr = nonceStr; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getOutRefundNo() { + return outRefundNo; + } + + public void setOutRefundNo(String outRefundNo) { + this.outRefundNo = outRefundNo; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public Integer getRefundFee() { + return refundFee; + } + + public void setRefundFee(Integer refundFee) { + this.refundFee = refundFee; + } + + public String getRefundFeeType() { + return refundFeeType; + } + + public void setRefundFeeType(String refundFeeType) { + this.refundFeeType = refundFeeType; + } + + public String getOpUserId() { + return opUserId; + } + + public void setOpUserId(String opUserId) { + this.opUserId = opUserId; + } + + public String getRefundAccount() { + return refundAccount; + } + + public void setRefundAccount(String refundAccount) { + this.refundAccount = refundAccount; + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 6199efeb6..3f5dfe1a0 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -1,20 +1,14 @@ package me.chanjar.weixin.mp.api.impl; -import java.io.File; - -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -import me.chanjar.weixin.mp.bean.pay.WxEntPayRequest; -import me.chanjar.weixin.mp.bean.pay.WxRedpackResult; -import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; +import me.chanjar.weixin.mp.bean.pay.*; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.io.File; /** * 测试支付相关接口 @@ -44,8 +38,14 @@ public class WxMpPayServiceImplTest { } @Test - public void testRefundPay() throws Exception { - + public void testRefund() throws Exception { + WxMpPayRefundRequest request = new WxMpPayRefundRequest(); + request.setOutRefundNo("aaa"); + request.setOutTradeNo("1111"); + request.setTotalFee(1222); + request.setRefundFee(111); + WxMpPayRefundResult result = this.wxService.getPayService().refund(request); + System.err.println(result); } @Test From a0dc8ca1ea7d9afd723067b910a33a22f7967867 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:11:40 +0800 Subject: [PATCH 37/43] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java index 3f5dfe1a0..7f524fd13 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java @@ -44,7 +44,8 @@ public class WxMpPayServiceImplTest { request.setOutTradeNo("1111"); request.setTotalFee(1222); request.setRefundFee(111); - WxMpPayRefundResult result = this.wxService.getPayService().refund(request); + File keyFile = new File("E:\\dlt.p12"); + WxMpPayRefundResult result = this.wxService.getPayService().refund(request, keyFile); System.err.println(result); } From 049eb957d8988569dc8f7c828e86a73f7e0caddc Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 17:46:31 +0800 Subject: [PATCH 38/43] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java | 2 +- .../java/me/chanjar/weixin/mp/api/WxMpUserTagService.java | 2 +- .../me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleResult.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleTotal.java | 2 +- .../weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java | 2 +- .../chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java | 4 ++-- .../weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java | 4 ++-- .../chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java | 2 +- .../me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java | 2 +- .../me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java | 2 +- .../me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java | 2 +- .../java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java | 2 +- .../main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java | 2 +- .../chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java | 2 +- .../weixin/mp/api/impl/WxMpUserTagServiceImplTest.java | 2 +- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java index 0ce7cc038..c214c46d9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java @@ -9,7 +9,7 @@ import java.util.List; /** * 门店管理的相关接口代码 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. */ public interface WxMpStoreService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java index 0fcfb40f8..90af7155c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java @@ -9,7 +9,7 @@ import me.chanjar.weixin.mp.bean.tag.WxUserTag; /** * 用户标签管理相关接口 * Created by Binary Wang on 2016/9/2. - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * */ public interface WxMpUserTagService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java index 94749c126..2cfb28842 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImpl.java @@ -17,7 +17,7 @@ import java.util.List; /** * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ public class WxMpUserTagServiceImpl implements WxMpUserTagService { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java index 3dd284593..d763543e6 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 图文分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleResult extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java index 37401cf8a..d3236be3b 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotal.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 图文分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleTotal extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java index cbbf148f3..e228a3ccf 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeArticleTotalDetail.java @@ -4,7 +4,7 @@ import com.google.gson.annotations.SerializedName; /** * 获取图文群发总数据接口(getarticletotal)中的详细字段 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/24. */ public class WxDataCubeArticleTotalDetail { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java index f819ab429..58fc0179f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeBaseResult.java @@ -6,7 +6,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; /** * 统计接口的共用属性类 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/25. */ public class WxDataCubeBaseResult { @@ -29,5 +29,5 @@ public class WxDataCubeBaseResult { public void setRefDate(String refDate) { this.refDate = refDate; } - + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java index 82a45dcf9..2088453ce 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeInterfaceResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 接口分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/30. */ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult { @@ -98,5 +98,5 @@ public class WxDataCubeInterfaceResult extends WxDataCubeBaseResult { new TypeToken>() { }.getType()); } - + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java index 908dfca83..01e40e806 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/datacube/WxDataCubeMsgResult.java @@ -10,7 +10,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 消息分析数据接口返回结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/8/29. */ public class WxDataCubeMsgResult extends WxDataCubeBaseResult { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java index e375d64ef..26f837b42 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundRequest.java @@ -15,7 +15,7 @@ import me.chanjar.weixin.common.annotation.Required; *
  • 描述 *
  • * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-10-08. */ @XStreamAlias("xml") diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java index dcfd31539..5dbd9e4e0 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreBaseInfo.java @@ -13,7 +13,7 @@ import java.util.List; /** * 门店基础信息 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. */ public class WxMpStoreBaseInfo { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java index 2bc514ed2..e02ae056f 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/store/WxMpStoreListResult.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 门店列表结果类 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-27. * */ diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java index b07314bac..3d7f57f37 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxTagListUser.java @@ -11,7 +11,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 获取标签下粉丝列表的结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-19. */ public class WxTagListUser { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java index 53e247a77..281b9b302 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/tag/WxUserTag.java @@ -12,7 +12,7 @@ import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; /** * 用户标签对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ public class WxUserTag { diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java index 766854703..6e31b769e 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpStoreServiceImplTest.java @@ -15,7 +15,7 @@ import java.util.List; import static org.junit.Assert.assertNotNull; /** - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. * */ diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java index 569b696da..4fca56be7 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpUserTagServiceImplTest.java @@ -13,7 +13,7 @@ import java.util.List; /** * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016/9/2. */ @Test From d933ab43e04c65f4a221b63f08fc6c89cbc30ce1 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sat, 8 Oct 2016 18:26:03 +0800 Subject: [PATCH 39/43] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=94=B3=E8=AF=B7=E9=80=80=E6=AC=BE=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20for=20issue=20#25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/bean/pay/WxMpPayRefundResult.java | 159 +++++++++--------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java index 3f917fe02..7e5d322d4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxMpPayRefundResult.java @@ -1,278 +1,279 @@ package me.chanjar.weixin.mp.bean.pay; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import java.io.Serializable; -import com.thoughtworks.xstream.annotations.XStreamAlias; - /** + *
      * 微信支付-申请退款返回结果
      * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
    + * 
    * @author liukaitj * */ @XStreamAlias("xml") public class WxMpPayRefundResult implements Serializable { - private static final long serialVersionUID = 1L; @XStreamAlias("return_code") private String returnCode; - + @XStreamAlias("return_msg") private String returnMsg; - + @XStreamAlias("result_code") private String resultCode; - + @XStreamAlias("err_code") private String errCode; - + @XStreamAlias("err_code_des") private String errCodeDes; - + @XStreamAlias("appid") private String appid; - + @XStreamAlias("mch_id") private String mchId; - + @XStreamAlias("device_info") private String deviceInfo; - + @XStreamAlias("nonce_str") private String nonceStr; - + @XStreamAlias("sign") private String sign; - + @XStreamAlias("transaction_id") private String transactionId; - + @XStreamAlias("out_trade_no") private String outTradeNo; - + @XStreamAlias("out_refund_no") private String outRefundNo; - + @XStreamAlias("refund_id") private String refundId; - + @XStreamAlias("refund_channel") private String refundChannel; - + @XStreamAlias("refund_fee") private String refundFee; - + @XStreamAlias("total_fee") private String totalFee; - + @XStreamAlias("fee_type") private String feeType; - + @XStreamAlias("cash_fee") private String cashFee; - + @XStreamAlias("cash_refund_fee") - private String cashRefundfee; - + private String cashRefundFee; + @XStreamAlias("coupon_refund_fee") private String couponRefundFee; - + @XStreamAlias("coupon_refund_count") private String couponRefundCount; - + @XStreamAlias("coupon_refund_id") private String couponRefundId; public String getReturnCode() { return this.returnCode; } - + public void setReturnCode(String returnCode) { this.returnCode = returnCode; } - + public String getReturnMsg() { return this.returnMsg; } - + public void setReturnMsg(String returnMsg) { this.returnMsg = returnMsg; } - + public String getResultCode() { return this.resultCode; } - + public void setResultCode(String resultCode) { this.resultCode = resultCode; } - + public String getErrCode() { return this.errCode; } - + public void setErrCode(String errCode) { this.errCode = errCode; } - + public String getErrCodeDes() { return this.errCodeDes; } - + public void setErrCodeDes(String errCodeDes) { this.errCodeDes = errCodeDes; } - + public String getAppid() { return this.appid; } - + public void setAppid(String appid) { this.appid = appid; } - + public String getMchId() { return this.mchId; } - + public void setMchId(String mchId) { this.mchId = mchId; } - + public String getDeviceInfo() { return this.deviceInfo; } - + public void setDeviceInfo(String deviceInfo) { this.deviceInfo = deviceInfo; } - + public String getNonceStr() { return this.nonceStr; } - + public void setNonceStr(String nonceStr) { this.nonceStr = nonceStr; } - + public String getSign() { return this.sign; } - + public void setSign(String sign) { this.sign = sign; } - + public String getTransactionId() { return this.transactionId; } - + public void setTransactionId(String transactionId) { this.transactionId = transactionId; } - + public String getOutTradeNo() { return this.outTradeNo; } - + public void setOutTradeNo(String outTradeNo) { this.outTradeNo = outTradeNo; } - + public String getOutRefundNo() { return this.outRefundNo; } - + public void setOutRefundNo(String outRefundNo) { this.outRefundNo = outRefundNo; } - + public String getRefundId() { return this.refundId; } - + public void setRefundId(String refundId) { this.refundId = refundId; } - + public String getRefundChannel() { return this.refundChannel; } - + public void setRefundChannel(String refundChannel) { this.refundChannel = refundChannel; } - + public String getRefundFee() { return this.refundFee; } - + public void setRefundFee(String refundFee) { this.refundFee = refundFee; } - + public String getTotalFee() { return this.totalFee; } - + public void setTotalFee(String totalFee) { this.totalFee = totalFee; } - + public String getFeeType() { return this.feeType; } - + public void setFeeType(String feeType) { this.feeType = feeType; } - + public String getCashFee() { return this.cashFee; } - + public void setCashFee(String cashFee) { this.cashFee = cashFee; } - - public String getCashRefundfee() { - return this.cashRefundfee; + + public String getCashRefundFee() { + return this.cashRefundFee; } - - public void setCashRefundfee(String cashRefundfee) { - this.cashRefundfee = cashRefundfee; + + public void setCashRefundFee(String cashRefundFee) { + this.cashRefundFee = cashRefundFee; } - + public String getCouponRefundFee() { return this.couponRefundFee; } - + public void setCouponRefundFee(String couponRefundFee) { this.couponRefundFee = couponRefundFee; } - + public String getCouponRefundCount() { return this.couponRefundCount; } - + public void setCouponRefundCount(String couponRefundCount) { this.couponRefundCount = couponRefundCount; } - + public String getCouponRefundId() { return this.couponRefundId; } - + public void setCouponRefundId(String couponRefundId) { this.couponRefundId = couponRefundId; } - + @Override public String toString() { - return "[" + - "return_code:" + this.returnCode + ";" + - "return_msg" + this.returnMsg + ";"; + return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); } } From 076ae4fdfcea858d1653aa711450806ac9fd63c7 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 18:52:42 +0800 Subject: [PATCH 40/43] fix a typo --- .../java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4cd268947..db8cfffa6 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 @@ -447,7 +447,7 @@ public class WxMpServiceImpl implements WxMpService { } return null; } catch (IOException e) { - this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXECEPTION]: {}", uri, data, e.getMessage()); + this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXCEPTION]: {}", uri, data, e.getMessage()); throw new RuntimeException(e); } } From a4642896a36bb712266a775daa2a7076ba636892 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 19:00:07 +0800 Subject: [PATCH 41/43] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E4=B8=80=E4=BA=9B=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84jar=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 +------ weixin-java-common/pom.xml | 2 +- weixin-java-cp/pom.xml | 2 +- weixin-java-mp/pom.xml | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index e94e5fc16..804f3540f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM @@ -72,11 +72,6 @@ ${logback.version} test - - org.apache.httpcomponents - fluent-hc - ${httpclient.version} - org.apache.httpcomponents httpmime diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 667aaf76f..fec020e7b 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-common diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index e87e2ea1e..f62f4d290 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 6fc42ee63..a06184a82 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -6,7 +6,7 @@ com.github.binarywang weixin-java-parent - 2.2.0 + 2.3.0-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP From f7f7d12347c0a753148d316a7001959905832883 Mon Sep 17 00:00:00 2001 From: BinaryWang Date: Sun, 9 Oct 2016 19:00:26 +0800 Subject: [PATCH 42/43] =?UTF-8?q?=E5=8F=91=E9=80=81=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/chanjar/weixin/mp/api/WxMpPayService.java | 3 ++- .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java | 7 ++++--- .../chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 45973443a..bdba22ad7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java @@ -74,8 +74,9 @@ public interface WxMpPayService { * 发送普通红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3 * 发送裂变红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5&index=4 *
    + * @param keyFile 证书文件对象 */ - WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; + WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile) throws WxErrorException; /** *
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index a8d5dc3f3..8e3e015e9 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -160,14 +160,15 @@ public class WxMpPayServiceImpl implements WxMpPayService {
       }
     
       @Override
    -  public WxRedpackResult sendRedpack(WxSendRedpackRequest request)
    +  public WxRedpackResult sendRedpack(WxSendRedpackRequest request, File keyFile)
           throws WxErrorException {
         XStream xstream = XStreamInitializer.getInstance();
         xstream.processAnnotations(WxSendRedpackRequest.class);
         xstream.processAnnotations(WxRedpackResult.class);
     
         request.setWxAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
    -    request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
    +    String mchId = this.wxMpService.getWxMpConfigStorage().getPartnerId();
    +    request.setMchId(mchId);
         request.setNonceStr(System.currentTimeMillis() + "");
     
         String sign = this.createSign(this.xmlBean2Map(request),
    @@ -180,7 +181,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack";
         }
     
    -    String responseContent = this.wxMpService.post(url, xstream.toXML(request));
    +    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, mchId);
         WxRedpackResult redpackResult = (WxRedpackResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(redpackResult.getResultCode())) {
    diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    index 7f524fd13..6d0b8a5ce 100644
    --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImplTest.java
    @@ -62,7 +62,8 @@ public class WxMpPayServiceImplTest {
         request.setMchBillno("aaaa");
         request
             .setReOpenid(((WxXmlMpInMemoryConfigStorage) this.wxService.getWxMpConfigStorage()).getOpenid());
    -    WxRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request);
    +    File keyFile = new File("E:\\dlt.p12");
    +    WxRedpackResult redpackResult = this.wxService.getPayService().sendRedpack(request, keyFile);
         System.err.println(redpackResult);
       }
     
    
    From 3d9bc6be0fe54233d1f5139214de147c9f4e1e2d Mon Sep 17 00:00:00 2001
    From: BinaryWang 
    Date: Sun, 9 Oct 2016 19:43:09 +0800
    Subject: [PATCH 43/43] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8F=82=E6=95=B0?=
     =?UTF-8?q?=E4=BD=8D=E7=BD=AE?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    ---
     .../me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    index 8e3e015e9..fa1a44c57 100644
    --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpPayServiceImpl.java
    @@ -120,7 +120,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         request.setSign(sign);
     
         String url = PAY_BASE_URL + "/secapi/pay/refund";
    -    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, partnerId);
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), partnerId);
         WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent);
     
         if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
    @@ -181,7 +181,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
           url = PAY_BASE_URL + "/mmpaymkttransfers/sendgroupredpack";
         }
     
    -    String responseContent = this.executeRequestWithKeyFile(url, xstream.toXML(request), keyFile, mchId);
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId);
         WxRedpackResult redpackResult = (WxRedpackResult) xstream
             .fromXML(responseContent);
         if ("FAIL".equals(redpackResult.getResultCode())) {
    @@ -360,7 +360,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
     
         String url = PAY_BASE_URL + "/mmpaymkttransfers/promotion/transfers";
     
    -    String responseContent = this.executeRequestWithKeyFile(xstream.toXML(request), url, keyFile, request.getMchId());
    +    String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), request.getMchId());
         WxEntPayResult result = (WxEntPayResult) xstream.fromXML(responseContent);
         if ("FAIL".equals(result.getResultCode())) {
           throw new WxErrorException(
    @@ -369,7 +369,7 @@ public class WxMpPayServiceImpl implements WxMpPayService {
         return result;
       }
     
    -  private String executeRequestWithKeyFile( String requestStr, String url, File keyFile, String mchId) throws WxErrorException {
    +  private String executeRequestWithKeyFile( String url, File keyFile, String requestStr, String mchId) throws WxErrorException {
         try (FileInputStream inputStream = new FileInputStream(keyFile)) {
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
           keyStore.load(inputStream, mchId.toCharArray());