diff --git a/README.md b/README.md index 93da5c67..c473c9cd 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ ### 注意: 1. ***本项目Fork自chanjarster/weixin-java-tools,但由于原项目已停止维护,故单独维护和发布,且发布到maven上的groupId也会不同,详细信息见下文。*** -1. ***自2.0.0版本以来,主要是公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** -1. 最新更新:2016-08-31 发布2.1.0正式版! +1. ***自2.0.0版本以来,公众号的接口调整比较大,主要是为了解决主接口类过于庞大不方便管理的问题,将接口实现代码按模块进行拆分。*** +1. 本SDK要求的最低JDK版本是7,为解决少量还在使用JDK6的用户,特意抽出独立的代码分支项目,请参考 https://github.com/binarywang/weixin-java-tools-for-jdk6 ,其他更早的JDK版本则需要自己改造实现; +1. 最新更新:2016-09-30 发布2.2.0正式版! =========== @@ -19,9 +20,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.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) 分别查看所有最新的版本。 ## Maven & Gradle @@ -33,12 +34,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,14 +49,16 @@ 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上,地址为 : * https://github.com/wechat-group/weixin-java-tools * ===========但同时会在其他几个网站同步更新,地址分别是: @@ -63,15 +66,16 @@ compile 'com.github.binarywang:weixin-java-cp:2.1.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 +=========== ## 关于代码贡献 -* 非常欢迎和感谢对本项目发起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开发组,前提是对自己的代码足够自信就可以申请加入,加入之后可以随时直接提交代码,但要注意对所做的修改或新增的代码进行单元测试,保证提交代码没有明显问题,具体加入方式,请咨询管理员。 diff --git a/build.gradle b/build.gradle index ba705da9..108e69c0 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 d79f2f72..804f3540 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.github.binarywang weixin-java-parent - 2.1.2 + 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 54922f7f..fec020e7 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.3.0-SNAPSHOT weixin-java-common 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 eae90d97..6a1e4380 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-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 51219a41..4038e601 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; } 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 8bd900ca..c932445d 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 fda72a76..cb4e571f 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 { diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 9de144fe..f62f4d29 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.3.0-SNAPSHOT weixin-java-cp diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index 33a4f5ab..a06184a8 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.3.0-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP 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 80bf38a6..d4a36c65 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 { 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 22255d36..00000000 --- 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/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index 0c7a7105..7db50e79 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 eb02c641..317303b8 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/api/WxMpPayService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpPayService.java index 72eabd08..bdba22ad 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,16 +1,10 @@ package me.chanjar.weixin.mp.api; -import java.util.Map; - 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; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; +import me.chanjar.weixin.mp.bean.pay.*; + +import java.io.File; +import java.util.Map; /** * 微信支付相关接口 @@ -23,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) @@ -40,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) @@ -54,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; /** *
    @@ -78,12 +69,26 @@ 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, File keyFile) 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  证书文件对象
    +   * 
    */ - WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException; + WxEntPayResult entPay(WxEntPayRequest request, File keyFile) 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 3b7f2125..292c5645 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; /** *
    @@ -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/WxMpStoreService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpStoreService.java
    index f4f3ccb6..c214c46d 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,15 +1,15 @@
     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)
    + * @author  binarywang(Binary Wang)
      *         Created by Binary Wang on 2016-09-23.
      */
     public interface WxMpStoreService {
    @@ -27,11 +27,39 @@ public interface WxMpStoreService {
        */
       void add(WxMpStoreBaseInfo request) throws WxErrorException;
     
    +  /**
    +   * 
    +   * 查询门店信息
    +   * 创建门店后获取poi_id 后,商户可以利用poi_id,查询具体某条门店的信息。
    +   * 若在查询时,update_status 字段为1,表明在5 个工作日内曾用update 接口修改过门店扩展字段,该扩展字段为最新的修改字段,尚未经过审核采纳,因此不是最终结果。
    +   * 最终结果会在5 个工作日内,最终确认是否采纳,并前端生效(但该扩展字段的采纳过程不影响门店的可用性,即available_state仍为审核通过状态)
    +   * 注:扩展字段为公共编辑信息(大家都可修改),修改将会审核,并决定是否对修改建议进行采纳,但不会影响该门店的生效可用状态。
    +   * 详情请见: 微信门店接口
    +   * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/getpoi?access_token=TOKEN
    +   * 
    + * @param poiId 门店Id + * @throws WxErrorException + */ + WxMpStoreBaseInfo get(String poiId) throws WxErrorException; + + /** + *
    +   * 删除门店
    +   * 商户可以通过该接口,删除已经成功创建的门店。请商户慎重调用该接口。
    +   * 详情请见: 微信门店接口
    +   * 接口格式:http://api.weixin.qq.com/cgi-bin/poi/delpoi?access_token=TOKEN
    +   * 
    + * @param poiId 门店Id + * @throws WxErrorException + */ + void delete(String poiId) throws WxErrorException; + /** *
        * 查询门店列表(指定查询起始位置和个数)
        * 商户可以通过该接口,批量查询自己名下的门店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 @@ -44,8 +72,32 @@ 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 */ List listAll() throws WxErrorException; + + /** + *
    +   * 修改门店服务信息
    +   * 商户可以通过该接口,修改门店的服务信息,包括: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/WxMpUserService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserService.java index deaf85ab..f46ca634 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/api/WxMpUserTagService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpUserTagService.java
    index 406842db..90af7155 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,15 +1,15 @@
     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.
    - * @author binarywang(https://github.com/binarywang)
    + * @author binarywang(Binary Wang)
      *
      */
     public interface WxMpUserTagService {
    @@ -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/WxMpDataCubeServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDataCubeServiceImpl.java index b82b7eaa..2dbee076 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 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; +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; /** * 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/WxMpGroupServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImpl.java deleted file mode 100644 index bfceff61..00000000 --- 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/WxMpKefuServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpKefuServiceImpl.java index 99428348..e83c17ac 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 475f5406..fa1a44c5 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,38 +1,37 @@ package me.chanjar.weixin.mp.api.impl; -import java.lang.reflect.Field; -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 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; 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.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; -import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; +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; +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 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. @@ -41,9 +40,11 @@ import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult; */ 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 static final String PAY_BASE_URL = "https://api.mch.weixin.qq.com"; + 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) { @@ -81,7 +82,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); @@ -102,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); - - StringBuilder request = new StringBuilder(""); - for (Map.Entry para : refundParams.entrySet()) { - request.append(String.format("<%s>%s", para.getKey(), - para.getValue(), para.getKey())); - } - request.append(""); + checkParameters(request); - String url = "https://api.mch.weixin.qq.com/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, keyFile, xstream.toXML(request), partnerId); + WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream.fromXML(responseContent); if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode()) || !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) { @@ -145,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) { @@ -153,27 +160,28 @@ 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(xmlBean2Map(request), + String sign = this.createSign(this.xmlBean2Map(request), 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)); + String responseContent = this.executeRequestWithKeyFile(url, keyFile, xstream.toXML(request), mchId); WxRedpackResult redpackResult = (WxRedpackResult) xstream .fromXML(responseContent); if ("FAIL".equals(redpackResult.getResultCode())) { @@ -245,11 +253,11 @@ 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); - 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 @@ -261,11 +269,25 @@ public class WxMpPayServiceImpl implements WxMpPayService { } return result; - } private void checkParameters(WxUnifiedOrderRequest request) { + checkNotNullParams(request); + + if (! ArrayUtils.contains(TRADE_TYPES, request.getTradeType())) { + throw new IllegalArgumentException("trade_type目前必须为" + Arrays.toString(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()) { @@ -284,21 +306,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 @@ -336,4 +343,52 @@ 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"; + + 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( + WxError.newBuilder().setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes()).build()); + } + return result; + } + + 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()); + + 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(requestStr.getBytes("UTF-8"), "ISO-8859-1"))); + + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + return EntityUtils.toString(response.getEntity()); + } + } + } 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/api/impl/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceImpl.java index ba3fcdfc..db8cfffa 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,23 +1,9 @@ package me.chanjar.weixin.mp.api.impl; -import java.io.IOException; - -import org.apache.http.HttpHost; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.conn.ssl.DefaultHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.BasicResponseHandler; -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; @@ -26,39 +12,22 @@ 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 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; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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); @@ -211,35 +178,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(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()); + 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); } @@ -249,7 +216,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(); } @@ -273,20 +240,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); } @@ -480,6 +447,7 @@ public class WxMpServiceImpl implements WxMpService { } return null; } catch (IOException e) { + this.log.error("\n[URL]: {}\n[PARAMS]: {}\n[EXCEPTION]: {}", uri, data, e.getMessage()); throw new RuntimeException(e); } } @@ -559,11 +527,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/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 99740d45..39c7f729 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,9 @@ 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 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; @@ -17,6 +12,12 @@ 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; +import java.util.List; +import java.util.Map.Entry; /** * Created by Binary Wang on 2016/9/26. @@ -44,6 +45,32 @@ 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()); + } + + @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() @@ -104,4 +131,28 @@ 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); + } + } + + @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/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 d2bb3213..2cfb2884 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 @@ -12,19 +12,15 @@ 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; /** * - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * 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; @@ -42,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); } @@ -52,13 +46,11 @@ 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); } @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(); @@ -68,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; @@ -78,7 +69,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(); @@ -87,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; @@ -98,7 +87,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(); @@ -106,14 +96,13 @@ 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); } @Override - public boolean batchTagging(Integer tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging"; + public boolean batchTagging(Long tagId, String[] openids) + throws WxErrorException { + String url = API_URL_PREFIX + "/members/batchtagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -124,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; @@ -135,8 +122,9 @@ public class WxMpUserTagServiceImpl implements WxMpUserTagService { } @Override - public boolean batchUntagging(Integer tagId, String[] openids) throws WxErrorException { - String url = "https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging"; + public boolean batchUntagging(Long tagId, String[] openids) + throws WxErrorException { + String url = API_URL_PREFIX + "/members/batchuntagging"; JsonObject json = new JsonObject(); json.addProperty("tagid", tagId); @@ -147,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; @@ -159,14 +145,12 @@ 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); 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"), 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 7dfd4ccc..00000000 --- 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 d77605a6..300b4f90 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/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpXmlMessage.java index 047961ea..9adcb54d 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 @@ -40,11 +39,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; @@ -209,12 +208,75 @@ public class WxMpXmlMessage implements Serializable { @XStreamAlias("SendLocationInfo") private SendLocationInfo sendLocationInfo = new SendLocationInfo(); - public String getToUserName() { - return this.toUserName; + /////////////////////////////////////// + // 门店审核事件推送 + /////////////////////////////////////// + /** + * 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 this.storeUniqId; + } + + public void setStoreUniqId(String storeUniqId) { + this.storeUniqId = storeUniqId; + } + + public String getPoiId() { + return this.poiId; + } + + public void setPoiId(String poiId) { + this.poiId = poiId; + } + + public String getResult() { + return this.result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getMsg() { + return this.msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + 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() { @@ -419,12 +481,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/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 3dd28459..d763543e 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 37401cf8..d3236be3 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 cbbf148f..e228a3cc 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 f819ab42..58fc0179 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 82a45dcf..2088453c 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 908dfca8..01e40e80 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/WxEntPayRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java new file mode 100644 index 00000000..38ed704a --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/pay/WxEntPayRequest.java @@ -0,0 +1,284 @@ +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 00000000..b2dbb8f1 --- /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/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 00000000..26f837b4 --- /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(Binary Wang) + * 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/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 3f917fe0..7e5d322d 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 java.io.Serializable; - import com.thoughtworks.xstream.annotations.XStreamAlias; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.io.Serializable; /** + *
      * 微信支付-申请退款返回结果
      * 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); } } 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 cff9d787..00000000 --- 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; - } -} 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 ccdfff90..4173c373 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
    - * 每个字段描述对应如下:
    + * 注释中各行每个字段描述对应如下:
      * 
  • 字段名 *
  • 变量名 *
  • 是否必填 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 19d03abf..f56ccf5c 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; } 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 06a5b178..5dbd9e4e 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,21 +1,19 @@ 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; /** * 门店基础信息 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-23. */ public class WxMpStoreBaseInfo { @@ -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 48b01822..864d9d2c 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 @@ -22,4 +22,4 @@ public class WxMpStoreInfo { this.baseInfo = baseInfo; } -} \ No newline at end of file +} 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 2bc514ed..e02ae056 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 0ba48edc..3d7f57f3 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,15 +1,17 @@ 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; /** * 获取标签下粉丝列表的结果对象 - * @author binarywang(https://github.com/binarywang) + * @author binarywang(Binary Wang) * Created by Binary Wang on 2016-09-19. */ public class WxTagListUser { @@ -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) { 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 d9e07d04..281b9b30 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,14 +12,14 @@ 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 { /** * 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 a6a48ed7..00000000 --- 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 ab3d5769..df63ac64 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 4ad45848..6514ed59 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 @@ -8,27 +8,28 @@ */ 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.WxMpMassGroupMessage; -import java.lang.reflect.Type; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.mp.bean.WxMpMassTagMessage; -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("tag_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 3f2c28b8..e093d575 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/WxMpMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java index 07a1b75a..fdc90744 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/WxMpGroupServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpGroupServiceImplTest.java deleted file mode 100644 index 2216e553..00000000 --- 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/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 1982f948..6d0b8a5c 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,17 +1,14 @@ package me.chanjar.weixin.mp.api.impl; -import org.testng.annotations.Guice; -import org.testng.annotations.Test; - import com.google.inject.Inject; - import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.mp.api.ApiTestModule; import me.chanjar.weixin.mp.api.WxXmlMpInMemoryConfigStorage; -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; /** * 测试支付相关接口 @@ -25,21 +22,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 { @@ -56,8 +38,15 @@ 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); + File keyFile = new File("E:\\dlt.p12"); + WxMpPayRefundResult result = this.wxService.getPayService().refund(request, keyFile); + System.err.println(result); } @Test @@ -73,13 +62,14 @@ 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); } /** * 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 +79,16 @@ public class WxMpPayServiceImplTest { .tradeType("JSAPI").openid("122").outTradeNo("111111").build()); System.err.println(result); } -} \ No newline at end of file + + /** + * 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)); + } + +} 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 9c28dfa7..6e31b769 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,23 +1,22 @@ 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) + * @author binarywang(Binary Wang) + * Created by Binary Wang on 2016-09-23. * */ @Test @@ -28,18 +27,41 @@ 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 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); + System.err.println(result); + } + + public void testDelete() throws WxErrorException { + 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); 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 74a6cfc4..4fca56be 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 @@ -22,7 +22,7 @@ public class WxMpUserTagServiceImplTest { @Inject protected WxMpServiceImpl wxService; - private Integer tagId = 2; + private Long tagId = 2L; @Test public void testTagCreate() throws Exception { @@ -62,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()}; 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 3885ec32..87d8428b 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 a6fb1e53..f35b3b87 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 a22f28d7..cd733210 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 de1c9546..5dc5437d 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 43f017be..9ee15a28 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; } 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 ad46a19e..2bbc8d8e 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 网页授权获取用户信息回调地址 网页应用授权登陆回调地址 diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml index d821e398..6d5310ce 100644 --- a/weixin-java-mp/src/test/resources/testng.xml +++ b/weixin-java-mp/src/test/resources/testng.xml @@ -5,9 +5,6 @@ - - -