From 45ce10141a5e737274b93c7e083fb9e97d94772f Mon Sep 17 00:00:00 2001 From: "jy.hu" Date: Mon, 3 Nov 2014 15:44:12 +0800 Subject: [PATCH] weixin-mp & pay --- README.md | 48 +- pom.xml | 26 +- weixin4j-base/README.md | 15 +- weixin4j-base/pom.xml | 5 +- .../com/foxinmy/weixin4j/http/BaseResult.java | 81 --- .../foxinmy/weixin4j/http/HttpRequest.java | 37 +- .../com/foxinmy/weixin4j/http/JsonResult.java | 67 +++ .../com/foxinmy/weixin4j/http/Response.java | 51 +- .../com/foxinmy/weixin4j/http/XmlResult.java | 93 ++++ .../java/com/foxinmy/weixin4j/http/error.xml | 516 ++++++++++++++---- .../foxinmy/weixin4j/model/WeixinAccount.java | 104 ++-- .../weixin4j/model/WeixinAccountV2.java | 56 -- .../weixin4j/model/WeixinAccountV3.java | 46 -- .../foxinmy/weixin4j/model/WeixinConfig.java | 16 +- .../weixin4j/token/AbstractTokenHolder.java | 22 +- .../weixin4j/token/FileTokenHolder.java | 37 +- .../weixin4j/token/RedisTokenHolder.java | 15 +- .../com/foxinmy/weixin4j/util/ClassUtil.java | 8 + .../com/foxinmy/weixin4j/util/ConfigUtil.java | 47 +- .../com/foxinmy/weixin4j/util/DateUtil.java | 21 + .../com/foxinmy/weixin4j/util/MapUtil.java | 79 +++ .../foxinmy/weixin4j/util/MessageUtil.java | 13 +- .../foxinmy/weixin4j/util/ReflectionUtil.java | 210 +++++++ .../weixin4j/xml/Map2ObjectConverter.java | 26 +- .../com/foxinmy/weixin4j/xml/XStream.java | 31 ++ weixin4j-mp/README.md | 82 ++- weixin4j-mp/pom.xml | 47 +- weixin4j-mp/weixin4j-mp-api/.gitignore | 28 + weixin4j-mp/weixin4j-mp-api/README.md | 87 +++ weixin4j-mp/weixin4j-mp-api/pom.xml | 59 ++ .../com/foxinmy/weixin4j/mp/WeixinProxy.java | 166 ++++-- .../com/foxinmy/weixin4j/mp/api/BaseApi.java | 18 +- .../com/foxinmy/weixin4j/mp/api/GroupApi.java | 26 +- .../foxinmy/weixin4j/mp/api/HelperApi.java | 8 +- .../com/foxinmy/weixin4j/mp/api/MassApi.java | 22 +- .../com/foxinmy/weixin4j/mp/api/MediaApi.java | 20 +- .../com/foxinmy/weixin4j/mp/api/MenuApi.java | 22 +- .../foxinmy/weixin4j/mp/api/NotifyApi.java | 22 +- .../com/foxinmy/weixin4j/mp/api/PayApi.java | 368 +++++++++++++ .../com/foxinmy/weixin4j/mp/api/QrApi.java | 18 +- .../com/foxinmy/weixin4j/mp/api/README.md | 0 .../com/foxinmy/weixin4j/mp/api/TmplApi.java | 14 +- .../com/foxinmy/weixin4j/mp/api/UserApi.java | 32 +- .../foxinmy/weixin4j/mp/api/weixin.properties | 12 +- .../foxinmy/weixin4j/mp/model/AuthResult.java | 0 .../com/foxinmy/weixin4j/mp/model/Button.java | 0 .../weixin4j/mp/model/CustomRecord.java | 0 .../foxinmy/weixin4j/mp/model/Following.java | 0 .../com/foxinmy/weixin4j/mp/model/Group.java | 0 .../foxinmy/weixin4j/mp/model/MpArticle.java | 0 .../weixin4j/mp/model/QRParameter.java | 0 .../com/foxinmy/weixin4j/mp/model/User.java | 0 .../foxinmy/weixin4j/mp/model/UserToken.java | 0 .../weixin4j/mp/msg/model/Article.java | 0 .../weixin4j/mp/msg/model/BaseMsg.java | 0 .../foxinmy/weixin4j/mp/msg/model/Image.java | 0 .../foxinmy/weixin4j/mp/msg/model/Music.java | 0 .../foxinmy/weixin4j/mp/msg/model/README.md | 0 .../foxinmy/weixin4j/mp/msg/model/Text.java | 0 .../foxinmy/weixin4j/mp/msg/model/Video.java | 0 .../foxinmy/weixin4j/mp/msg/model/Voice.java | 0 .../weixin4j/mp/msg/notify/ArticleNotify.java | 0 .../weixin4j/mp/msg/notify/BaseNotify.java | 0 .../weixin4j/mp/msg/notify/ImageNotify.java | 0 .../weixin4j/mp/msg/notify/MusicNotify.java | 0 .../foxinmy/weixin4j/mp/msg/notify/README.md | 0 .../weixin4j/mp/msg/notify/TextNotify.java | 0 .../weixin4j/mp/msg/notify/VideoNotify.java | 0 .../weixin4j/mp/msg/notify/VoiceNotify.java | 0 .../weixin4j/mp/payment/ApiResult.java | 83 +++ .../foxinmy/weixin4j/mp/payment/BillType.java | 13 + .../weixin4j/mp/payment/CurrencyType.java | 23 + .../foxinmy/weixin4j/mp/payment/IdQuery.java | 40 ++ .../foxinmy/weixin4j/mp/payment/IdType.java | 26 + .../weixin4j/mp/payment/JsPayNotify.java | 109 ++++ .../weixin4j/mp/payment/PayAction.java | 314 +++++++++++ .../weixin4j/mp/payment/PayPackage.java | 121 ++++ .../weixin4j/mp/payment/PayRequest.java | 95 ++++ .../foxinmy/weixin4j/mp/payment/PayUtil.java | 369 +++++++++++++ .../foxinmy/weixin4j/mp/payment/PayWarn.java | 96 ++++ .../com/foxinmy/weixin4j/mp/payment/README.md | 1 + .../weixin4j/mp/payment/RefundConverter.java | 117 ++++ .../weixin4j/mp/payment/RefundStatus.java | 20 + .../foxinmy/weixin4j/mp/payment/SignType.java | 5 + .../weixin4j/mp/payment/TradeState.java | 21 + .../weixin4j/mp/payment/TradeType.java | 14 + .../mp/payment/v2/JsPayRequestV2.java | 64 +++ .../mp/payment/v2/NativePayNotifyV2.java | 38 ++ .../mp/payment/v2/NativePayResponseV2.java | 55 ++ .../foxinmy/weixin4j/mp/payment/v2/Order.java | 245 +++++++++ .../weixin4j/mp/payment/v2/PayFeedback.java | 140 +++++ .../weixin4j/mp/payment/v2/PayPackageV2.java | 139 +++++ .../mp/payment/v3/NativePayNotifyV3.java | 52 ++ .../mp/payment/v3/NativePayResponseV3.java | 58 ++ .../foxinmy/weixin4j/mp/payment/v3/Order.java | 172 ++++++ .../weixin4j/mp/payment/v3/PayPackageV3.java | 161 ++++++ .../weixin4j/mp/payment/v3/PayRequestV3.java | 62 +++ .../weixin4j/mp/payment/v3/PrePay.java | 73 +++ .../weixin4j/mp/payment/v3/Refund.java | 87 +++ .../weixin4j/mp/payment/v3/RefundDetail.java | 89 +++ .../weixin4j/mp/response/ArticleResponse.java | 0 .../weixin4j/mp/response/BaseResponse.java | 0 .../weixin4j/mp/response/ImageResponse.java | 0 .../weixin4j/mp/response/MusicResponse.java | 0 .../foxinmy/weixin4j/mp/response/README.md | 0 .../weixin4j/mp/response/TemplateMessage.java | 0 .../weixin4j/mp/response/TextResponse.java | 0 .../mp/response/TransferResponse.java | 0 .../weixin4j/mp/response/VideoResponse.java | 0 .../weixin4j/mp/response/VoiceResponse.java | 0 .../com/foxinmy/weixin4j/mp/spider/README.md | 0 .../weixin4j/mp/spider/WeixinExecutor.java | 0 .../weixin4j/mp/type/ResponseType.java | 0 .../foxinmy/weixin4j/mp/util/ExcelUtil.java | 434 +++++++++++++++ .../src/main/resources/weixin.properties | 16 + .../foxinmy/weixin4j/mp/test/GroupTest.java | 12 +- .../foxinmy/weixin4j/mp/test/MediaTest.java | 2 +- .../foxinmy/weixin4j/mp/test/MenuTest.java | 12 +- .../com/foxinmy/weixin4j/mp/test/QRTest.java | 2 +- .../foxinmy/weixin4j/mp/test/TokenTest.java | 6 +- .../foxinmy/weixin4j/mp/test/UserTest.java | 9 +- .../weixin4j/mp/test/msg/EventMsgTest.java | 0 .../weixin4j/mp/test/msg/InMsgTest.java | 0 .../weixin4j/mp/test/msg/MassMsgTest.java | 10 +- .../weixin4j/mp/test/msg/MessagePush.java | 0 .../weixin4j/mp/test/msg/NotifyMsgTest.java | 14 +- .../weixin4j/mp/test/msg/OutMsgTest.java | 0 .../weixin4j/mp/test/msg/TemplateMsgTest.java | 8 +- weixin4j-mp/weixin4j-mp-server/.gitignore | 28 + weixin4j-mp/weixin4j-mp-server/README.md | 30 + weixin4j-mp/weixin4j-mp-server/pom.xml | 51 ++ .../src/main/assembly.xml | 0 .../weixin4j/mp/action/AbstractAction.java | 0 .../weixin4j/mp/action/BlankAction.java | 0 .../weixin4j/mp/action/DebugAction.java | 0 .../weixin4j/mp/action/ImageAction.java | 0 .../weixin4j/mp/action/LinkAction.java | 0 .../weixin4j/mp/action/LocationAction.java | 0 .../com/foxinmy/weixin4j/mp/action/README.md | 0 .../weixin4j/mp/action/SignatureAction.java | 0 .../weixin4j/mp/action/TextAction.java | 0 .../weixin4j/mp/action/VideoAction.java | 0 .../weixin4j/mp/action/VoiceAction.java | 0 .../weixin4j/mp/action/WeixinAction.java | 0 .../mp/action/event/LocationAction.java | 0 .../mp/action/event/MassSendAction.java | 0 .../mp/action/event/MenuClickAction.java | 0 .../mp/action/event/MenuLocationAction.java | 0 .../mp/action/event/MenuPhotoAction.java | 0 .../mp/action/event/MenuScanAction.java | 0 .../mp/action/event/MenuViewAction.java | 0 .../weixin4j/mp/action/event/README.md | 0 .../weixin4j/mp/action/event/ScanAction.java | 0 .../mp/action/event/SubscribeAction.java | 0 .../mp/action/event/TemplateSendAction.java | 0 .../mp/action/event/UnsubscribeAction.java | 0 .../mp/mapping/AbstractActionMapping.java | 0 .../foxinmy/weixin4j/mp/mapping/Action.java | 0 .../weixin4j/mp/mapping/ActionMapping.java | 0 .../mp/mapping/AnnotationActionMapping.java | 0 .../com/foxinmy/weixin4j/mp/server/README.md | 0 .../mp/server/WeixinServerHandler.java | 0 .../mp/server/WeixinServerInitializer.java | 0 .../mp/statrup/WeixinServiceBootstrap.java | 6 +- .../src/main/resources/logback.xml | 2 +- .../src/main/resources/netty.properties | 0 .../src/main/resources/weixin.properties | 7 +- .../src/main/startup.sh | 0 weixin4j-qy/README.md | 8 +- weixin4j-qy/pom.xml | 2 + .../src/main/java/com/weixin4j/qy/App.java | 13 - .../test/java/com/weixin4j/qy/AppTest.java | 38 -- 172 files changed, 5591 insertions(+), 742 deletions(-) delete mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/BaseResult.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java delete mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV2.java delete mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV3.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java create mode 100644 weixin4j-mp/weixin4j-mp-api/.gitignore create mode 100644 weixin4j-mp/weixin4j-mp-api/README.md create mode 100644 weixin4j-mp/weixin4j-mp-api/pom.xml rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java (80%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/BaseApi.java (61%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/GroupApi.java (85%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/HelperApi.java (84%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/MassApi.java (92%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java (88%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/MenuApi.java (79%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/NotifyApi.java (88%) create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/PayApi.java rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/QrApi.java (87%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/TmplApi.java (77%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/UserApi.java (86%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties (89%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/AuthResult.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/Button.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/CustomRecord.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/Following.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/Group.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/MpArticle.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/QRParameter.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/User.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/model/UserToken.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Article.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/BaseMsg.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Image.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Music.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Text.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Video.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/model/Voice.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/ArticleNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/BaseNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/ImageNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/MusicNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/TextNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/VideoNotify.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/msg/notify/VoiceNotify.java (100%) create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/ApiResult.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/BillType.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/CurrencyType.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/IdQuery.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/IdType.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/JsPayNotify.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayAction.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayPackage.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayRequest.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayUtil.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/PayWarn.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/README.md create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundConverter.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/RefundStatus.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/SignType.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/TradeState.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/TradeType.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayNotifyV2.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/Order.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/PayFeedback.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/PayPackageV2.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/NativePayNotifyV3.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/NativePayResponseV3.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Order.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/PayPackageV3.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/PayRequestV3.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/PrePay.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/Refund.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/payment/v3/RefundDetail.java rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/ArticleResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/BaseResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/ImageResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/MusicResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/TemplateMessage.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/TextResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/TransferResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/VideoResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/response/VoiceResponse.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/spider/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/spider/WeixinExecutor.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/main/java/com/foxinmy/weixin4j/mp/type/ResponseType.java (100%) create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/util/ExcelUtil.java create mode 100644 weixin4j-mp/weixin4j-mp-api/src/main/resources/weixin.properties rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/GroupTest.java (76%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/MediaTest.java (92%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/MenuTest.java (77%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/QRTest.java (92%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/TokenTest.java (76%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/UserTest.java (79%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/EventMsgTest.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/InMsgTest.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MassMsgTest.java (91%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/MessagePush.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/NotifyMsgTest.java (85%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/OutMsgTest.java (100%) rename weixin4j-mp/{ => weixin4j-mp-api}/src/test/java/com/foxinmy/weixin4j/mp/test/msg/TemplateMsgTest.java (76%) create mode 100644 weixin4j-mp/weixin4j-mp-server/.gitignore create mode 100644 weixin4j-mp/weixin4j-mp-server/README.md create mode 100644 weixin4j-mp/weixin4j-mp-server/pom.xml rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/assembly.xml (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/AbstractAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/BlankAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/DebugAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/ImageAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/LinkAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/LocationAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/SignatureAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/TextAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/VideoAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/VoiceAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/WeixinAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/LocationAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MassSendAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuClickAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuLocationAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuPhotoAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuScanAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/MenuViewAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/ScanAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/SubscribeAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/TemplateSendAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/action/event/UnsubscribeAction.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/mapping/AbstractActionMapping.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/mapping/Action.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/mapping/ActionMapping.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/mapping/AnnotationActionMapping.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/server/README.md (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinServerHandler.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/server/WeixinServerInitializer.java (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/java/com/foxinmy/weixin4j/mp/statrup/WeixinServiceBootstrap.java (88%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/resources/logback.xml (93%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/resources/netty.properties (100%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/resources/weixin.properties (69%) rename weixin4j-mp/{ => weixin4j-mp-server}/src/main/startup.sh (100%) delete mode 100644 weixin4j-qy/src/main/java/com/weixin4j/qy/App.java delete mode 100644 weixin4j-qy/src/test/java/com/weixin4j/qy/AppTest.java diff --git a/README.md b/README.md index c9308858..b43f48d0 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,64 @@ weixin4j ======== +@(weixin4j)[微信开发] + 微信开发工具包 +------------- 功能列表 ------- +* weixin4j-mp -* 公众平台API封装 - + `公众平台API封装` + + `netty构建服务器` + + `微信支付(公众号)` + +* weixin4j-qy + `企业号API封装` 更新LOG ------- * 2014-10-27 - 1).maven多模块分离 + + maven多模块分离 - 2).weixin4j-mp:用netty构建http服务器并支持消息分发 + + `weixin4j-mp`:用netty构建http服务器并支持消息分发 * 2014-10-28 - 1).weixin4j-mp:调整ActionMapping抽象化 + + `weixin4j-mp`:调整`ActionMapping`抽象化 * 2014-10-31 - 1).weixin4j-mp:weixin.properties切分为API调用地址/公众号信息两部分 + + `weixin4j-mp`:`weixin.properties`切分为API调用地址/公众号信息两部分 - 2).weixin4j-base:TokenApi重命名为TokenHolder + + `weixin4j-base:`TokenApi`重命名为`TokenHolder` - 3).weixin4j-base:新增WeixinConfig等类 + + `weixin4j-base`:新增`WeixinConfig`等类 + +* 2014-11-03 + + + `weixin-mp`:分离为`weixin-mp-api`和`weixin-mp-server`两个工程 + + + `weixin-mp`:加入支付模块 接下来 ------ -公众号支付模块引入 +`退款&对账` -企业号API封装 +`企业号API封装` + +`公众号智能接口` + +`微信消息加密` + +`被扫支付` + +`公众号多客服` + +`微信小店` + +`微信卡券` \ No newline at end of file diff --git a/pom.xml b/pom.xml index bf447c24..2c3bdbaa 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,35 @@ 0.0.1-SNAPSHOT pom weixin4j + https://github.com/foxinmy/weixin4j + 微信开发工具包 + 2014 + + + MIT + https://github.com/foxinmy/weixin4j/blob/master/LICENSE + + + + + hujinyuhao@163.com + jinyu + jinyu + https://github.com/foxinmy + 8 + + developer + + + weixin4j-base weixin4j-mp weixin4j-qy - 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT + 0.0.1-SNAPSHOT 4.8.2 1.6.1 1.0.9 @@ -26,8 +48,10 @@ 1.7.3 1.1.6 2.6.0 + 3.9 4.0.23.Final 3.3.2 + 1.9 UTF-8 diff --git a/weixin4j-base/README.md b/weixin4j-base/README.md index 534da030..cf298666 100644 --- a/weixin4j-base/README.md +++ b/weixin4j-base/README.md @@ -1,12 +1,21 @@ weixin4j-base ============= -tencent weixin base java sdk 微信开发基础工程 +@(weixin4j)[base] + +微信开发基础工程 +-------------- + +功能列表 +------- +`Token的实现` + +`通用消息实体` 更新LOG ------- * 2014-10-31 - 1).TokenApi重命名为TokenHolder + + `TokenApi`重命名为`TokenHolder` - 2).新增WeixinConfig等类 \ No newline at end of file + + 新增`WeixinConfig`等类 \ No newline at end of file diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml index 597ec926..0d438250 100644 --- a/weixin4j-base/pom.xml +++ b/weixin4j-base/pom.xml @@ -10,7 +10,10 @@ weixin4j-base weixin4j-base - https://github.com/foxinmy + https://github.com/foxinmy/weixin4j/tree/master/weixin4j-base + + weixin4j-base + com.thoughtworks.xstream diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/BaseResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/BaseResult.java deleted file mode 100644 index b3031f9d..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/BaseResult.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.foxinmy.weixin4j.http; - -import java.io.Serializable; - -import com.thoughtworks.xstream.annotations.XStreamAlias; - -/** - * 调用接口响应值 - * - * @className BaseResult - * @author jy.hu - * @date 2014年9月24日 - * @since JDK 1.7 - * @see 全局返回码 - */ -@XStreamAlias("xml") -public class BaseResult implements Serializable { - - private static final long serialVersionUID = -6185313616955051150L; - - @XStreamAlias("return_code") - private String errcode = "0"; - @XStreamAlias("return_msg") - private String errmsg = ""; - private String msgid; - private String text; - - public BaseResult() { - - } - - public BaseResult(String errcode, String errmsg, String text) { - this(errcode, errmsg, null, text); - } - - public BaseResult(String errcode, String errmsg, String msgid, String text) { - this.errcode = errcode; - this.errmsg = errmsg; - this.msgid = msgid; - this.text = text; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public String getErrcode() { - return errcode; - } - - public void setErrcode(String errcode) { - this.errcode = errcode; - } - - public String getErrmsg() { - return errmsg; - } - - public void setErrmsg(String errmsg) { - this.errmsg = errmsg; - } - - public String getMsgid() { - return msgid; - } - - public void setMsgid(String msgid) { - this.msgid = msgid; - } - - @Override - public String toString() { - return "BaseResult [errcode=" + errcode + ", errmsg=" + errmsg - + ", msgid=" + msgid + ", text=" + text + "]"; - } -} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java index 180b2540..dd861c35 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpRequest.java @@ -46,6 +46,7 @@ import com.foxinmy.weixin4j.exception.WeixinException; * @see */ public class HttpRequest { + private final String SUCCESS = "success"; private AbstractHttpClient client; public HttpRequest() { @@ -149,6 +150,7 @@ public class HttpRequest { protected Response doRequest(HttpRequestBase request) throws WeixinException { + Response response = null; try { HttpResponse httpResponse = client.execute(request); StatusLine statusLine = httpResponse.getStatusLine(); @@ -166,38 +168,47 @@ public class HttpRequest { httpResponse.getFirstHeader("location"))); } byte[] data = EntityUtils.toByteArray(httpEntity); - Response response = new Response(); + response = new Response(); response.setBody(data); response.setStatusCode(status); response.setStatusText(statusLine.getReasonPhrase()); response.setStream(new ByteArrayInputStream(data)); - response.setText(new String(data, StandardCharsets.UTF_8)); + EntityUtils.consume(httpEntity); Header contentType = httpResponse .getFirstHeader(HttpHeaders.CONTENT_TYPE); if (contentType.getValue().contains( ContentType.APPLICATION_JSON.getMimeType()) || contentType.getValue().contains( ContentType.TEXT_PLAIN.getMimeType())) { - BaseResult result = null; + response.setText(new String(data, StandardCharsets.UTF_8)); try { - result = response.getAsResult(); - } catch (JSONException e) { - result = response.getAsXml(BaseResult.class); - } - if (result.getErrcode().equals("0") - || result.getErrcode().equalsIgnoreCase("success")) { - EntityUtils.consume(httpEntity); + JsonResult jsonResult = response.getAsJsonResult(); + response.setJsonResult(true); + if (jsonResult.getCode() != 0) { + throw new WeixinException(jsonResult.getCode() + "", + jsonResult.getDesc()); + } return response; + } catch (JSONException e) { + ; + } + XmlResult xmlResult = response.getAsXmlResult(); + response.setXmlResult(true); + if (!xmlResult.getReturnCode().equalsIgnoreCase(SUCCESS)) { + throw new WeixinException(xmlResult.getReturnCode(), + xmlResult.getReturnMsg()); + } + if (!xmlResult.getResultCode().equalsIgnoreCase(SUCCESS)) { + throw new WeixinException(xmlResult.getErrCode(), + xmlResult.getErrCodeDes()); } - throw new WeixinException(result.getErrcode(), - result.getErrmsg()); } } catch (IOException e) { throw new WeixinException(e.getMessage()); } finally { request.releaseConnection(); } - throw new WeixinException("-1", "request fail"); + return response; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java new file mode 100644 index 00000000..e912c4cb --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/JsonResult.java @@ -0,0 +1,67 @@ +package com.foxinmy.weixin4j.http; + +import java.io.Serializable; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * 调用接口返回JSON格式 + * + * @className JsonResult + * @author jy.hu + * @date 2014年9月24日 + * @since JDK 1.7 + * @see 全局返回码 + */ +public class JsonResult implements Serializable { + + private static final long serialVersionUID = -6185313616955051150L; + + @JSONField(name = "errcode") + private int code; + @JSONField(name = "errmsg") + private String desc; + private String text; + + public JsonResult() { + this.desc = ""; + this.text = ""; + } + + public JsonResult(int code, String desc, String text) { + this.code = code; + this.desc = desc; + this.text = text; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public String toString() { + return "JsonResult [code=" + code + ", desc=" + desc + ", text=" + text + + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java index 228e64af..22052b8f 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/Response.java @@ -9,6 +9,7 @@ import org.dom4j.io.SAXReader; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.xml.XStream; public class Response { @@ -18,6 +19,8 @@ public class Response { private String statusText; private byte[] body; private InputStream stream; + private boolean isJsonResult; + private boolean isXmlResult; public Response() { } @@ -26,26 +29,40 @@ public class Response { this.text = text; } + public void setJsonResult(boolean isJsonResult) { + this.isJsonResult = isJsonResult; + } + + public void setXmlResult(boolean isXmlResult) { + this.isXmlResult = isXmlResult; + } + public String getAsString() { return text; } - public BaseResult getAsResult() { - return JSON.parseObject(text, BaseResult.class); + public JsonResult getAsJsonResult() { + return JSON.parseObject(text, JsonResult.class); } public JSONObject getAsJson() { return JSON.parseObject(text); } - public T getAsObject(Class clazz) { - return (T) JSON.parseObject(text, clazz); + public T getAsObject(TypeReference typeReference) { + if (isJsonResult) { + return JSON.parseObject(text, typeReference); + } + if (isXmlResult) { + @SuppressWarnings("unchecked") + Class clazz = (Class) typeReference.getType(); + return XStream.get(text, clazz); + } + return null; } - public T getAsXml(Class clazz) { - XStream xStream = XStream.get(); - xStream.processAnnotations(clazz); - return xStream.fromXML(text, clazz); + public XmlResult getAsXmlResult() { + return XStream.get(text, XmlResult.class); } /** @@ -56,24 +73,22 @@ public class Response { * @return * @throws DocumentException */ - public BaseResult getBaseError() throws DocumentException { - BaseResult result = getAsResult(); - if (!result.getErrcode().equals("0")) { + public JsonResult getTextError() throws DocumentException { + JsonResult result = getAsJsonResult(); + if (result.getCode() != 0) { SAXReader reader = new SAXReader(); - Document doc = reader.read(Response.class.getResourceAsStream("error.xml")); + Document doc = reader.read(Response.class + .getResourceAsStream("error.xml")); Node node = doc.getRootElement().selectSingleNode( - String.format("error[@code='%s']", result.getErrcode())); + String.format("error/code[text()='%d']", result.getCode())); if (node != null) { - result.setText(node.getStringValue()); + result.setText(node.getParent().selectSingleNode("text") + .getStringValue()); } } return result; } - public String getText() { - return text; - } - public void setText(String text) { this.text = text; } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java new file mode 100644 index 00000000..c60b5a3f --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/XmlResult.java @@ -0,0 +1,93 @@ +package com.foxinmy.weixin4j.http; + +import java.io.Serializable; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +/** + * 调用接口返回xml格式 + * + * @className XmlResult + * @author jy + * @date 2014年11月1日 + * @since JDK 1.7 + * @see + */ +public class XmlResult implements Serializable { + + private static final long serialVersionUID = -6185313616955051150L; + public static final String SUCCESS = "SUCCESS"; + public static final String FAIL = "FAIL"; + + @XStreamAlias("return_code") + private String returnCode;// 此字段是通信标识,非交易 标识,交易是否成功需要查 看 result_code 来判断 非空 + @XStreamAlias("return_msg") + private String returnMsg;// 返回信息,如非 空,为错误原因 可能为空 + @XStreamAlias("result_code") + private String resultCode;// 业务结果SUCCESS/FAIL 非空 + @XStreamAlias("err_code") + private String errCode;// 错误代码 可为空 + @XStreamAlias("err_code_des") + private String errCodeDes;// 结果信息描述 可为空 + + 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 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 XmlResult() { + this("success", ""); + } + + public XmlResult(String returnCode, String returnMsg) { + this.returnCode = returnCode; + this.returnMsg = returnMsg; + if (returnCode.equalsIgnoreCase(SUCCESS)) { + this.resultCode = SUCCESS.toLowerCase(); + this.errCode = SUCCESS.toLowerCase(); + this.errCodeDes = ""; + } + } + + @Override + public String toString() { + return "XmlResult [returnCode=" + returnCode + ", returnMsg=" + + returnMsg + ", resultCode=" + resultCode + ", errCode=" + + errCode + ", errCodeDes=" + errCodeDes + "]"; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml index c38e2f10..022c2621 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/error.xml @@ -1,97 +1,427 @@ - 系统繁忙 - 获取access_token时AppSecret错误,或者access_token无效 - 不合法的凭证类型 - 不合法的OpenID - 不合法的媒体文件类型 - 不合法的文件类型 - 不合法的文件大小 - 不合法的媒体文件id - 不合法的消息类型 - 不合法的图片文件大小 - 不合法的语音文件大小 - 不合法的视频文件大小 - 不合法的缩略图文件大小 - 不合法的APPID - 不合法的access_token - 不合法的菜单类型 - 不合法的按钮个数 - 不合法的按钮个数 - 不合法的按钮名字长度 - 不合法的按钮KEY长度 - 不合法的按钮URL长度 - 不合法的菜单版本号 - 不合法的子菜单级数 - 不合法的子菜单按钮个数 - 不合法的子菜单按钮类型 - 不合法的子菜单按钮名字长度 - 不合法的子菜单按钮KEY长度 - 不合法的子菜单按钮URL长度 - 不合法的自定义菜单使用用户 - 不合法的oauth_code - 不合法的refresh_token - 不合法的openid列表 - 不合法的openid列表长度 - 不合法的请求字符,不能包含\uxxxx格式的字符 - 不合法的参数 - 不合法的请求格式 - 不合法的URL长度 - 不合法的分组id - 分组名字不合法 - 缺少access_token参数 - 缺少appid参数 - 缺少refresh_token参数 - 缺少secret参数 - 缺少多媒体文件数据 - 缺少media_id参数 - 缺少子菜单数据 - 缺少oauth code - 缺少openid - access_token超时 - refresh_token超时 - oauth_code超时 - 需要GET请求 - 需要POST请求 - 需要HTTPS请求 - 需要接收者关注 - 需要好友关系 - 多媒体文件为空 - POST的数据包为空 - 图文消息内容为空 - 文本消息内容为空 - 多媒体文件大小超过限制 - 消息内容超过限制 - 标题字段超过限制 - 描述字段超过限制 - 链接字段超过限制 - 图片链接字段超过限制 - 语音播放时间超过限制 - 图文消息超过限制 - 接口调用超过限制 - 创建菜单个数超过限制 - 回复时间超过限制 - 系统分组,不允许修改 - 分组名字过长 - 分组数量超过上限 - 不存在媒体数据 - 不存在的菜单版本 - 不存在的菜单数据 - 不存在的用户 - 解析JSON/XML内容错误 - api功能未授权 - 用户未授权该api - 接口后台错误 - 无效 transaction_id - 提交参数错误 - 订单已支付 - 商户订单号重复 - 商户无权限 - 余额不足 - 不支持卡类型 - 订单已关闭 - 银行系统异常 - 退款金额大于支付金额 - 订单不存在 + + 0 + OK + 请求成功 + + + -1 + system error + 系统繁忙 + + + + 40001 + invalid credential + 不合法的调用凭证 + + + 40002 + invalid grant_type + 不合法的grant_type + + + 40003 + invalid openid + 不合法的OpenID + + + 40004 + invalid media type + 不合法的媒体文件类型 + + + 40007 + invalid media_id + 不合法的media_id + + + 40008 + invalid message type + 不合法的message_type + + + 40009 + invalid image size + 不合法的图片大小 + + + 40010 + invalid voice size + 不合法的语音大小 + + + 40011 + invalid video size + 不合法的视频大小 + + + 40012 + invalid thumb size + 不合法的缩略图大小 + + + 40013 + invalid appid + 不合法的AppID + + + 40014 + invalid access_token + 不合法的access_token + + + 40015 + invalid menu type + 不合法的菜单类型 + + + 40016 + invalid button size + 不合法的菜单按钮个数 + + + 40017 + invalid button type + 不合法的按钮类型 + + + 40018 + invalid button name size + 不合法的按钮名称长度 + + + 40019 + invalid button key size + 不合法的按钮KEY长度 + + + 40020 + invalid button url size + 不合法的url长度 + + + 40023 + invalid sub button size + 不合法的子菜单按钮个数 + + + 40024 + invalid sub button type + 不合法的子菜单类型 + + + 40025 + invalid sub button name size + 不合法的子菜单按钮名称长度 + + + 40026 + invalid sub button key size + 不合法的子菜单按钮KEY长度 + + + 40027 + invalid sub button url size + 不合法的子菜单按钮url长度 + + + 40029 + invalid code + 不合法或已过期的code + + + 40030 + invalid refresh_token + 不合法的refresh_token + + + 40036 + invalid template_id size + 不合法的template_id长度 + + + 40037 + invalid template_id + 不合法的template_id + + + 40039 + invalid url size + 不合法的url长度 + + + 40048 + invalid url domain + 不合法的url域名 + + + 40054 + invalid sub button url domain + 不合法的子菜单按钮url域名 + + + 40055 + invalid button url domain + 不合法的菜单按钮url域名 + + + 40066 + invalid url + 不合法的url + + + 41001 + access_token missing + 缺失access_token参数 + + + 41002 + appid missing + 缺失appid参数 + + + 41003 + refresh_token missing + 缺失refresh_token参数 + + + 41004 + appsecret missing + 缺失secret参数 + + + 41005 + media data missing + 缺失二进制媒体文件 + + + 41006 + media_id missing + 缺失media_id参数 + + + 41007 + sub_menu data missing + 缺失子菜单数据 + + + 41008 + missing code + 缺失code参数 + + + 41009 + missing openid + 缺失openid参数 + + + 41010 + missing url + 缺失url参数 + + + 42001 + access_token expired + access_token超时 + + + 42002 + refresh_token expired + refresh_token超时 + + + 42003 + code expired + code超时 + + + 43001 + require GET method + 需要使用GET方法请求 + + + 43002 + require POST method + 需要使用POST方法请求 + + + 43003 + require https + 需要使用HTTPS + + + 43004 + require subscribe + 需要订阅关系 + + + 44001 + empty media data + 空白的二进制数据 + + + 44002 + empty post data + 空白的POST数据 + + + 44003 + empty news data + 空白的news数据 + + + 44004 + empty content + 空白的内容 + + + 44005 + empty list size + 空白的列表 + + + 45001 + media size out of limit + 二进制文件超过限制 + + + 45002 + content size out of limit + content参数超过限制 + + + 45003 + title size out of limit + title参数超过限制 + + + 45004 + description size out of limit + description参数超过限制 + + + 45005 + url size out of limit + url参数长度超过限制 + + + 45006 + picurl size out of limit + picurl参数超过限制 + + + 45007 + playtime out of limit + 播放时间超过限制(语音为60s最大) + + + 45008 + article size out of limit + article参数超过限制 + + + 45009 + api freq out of limit + 接口调动频率超过限制 + + + 45010 + create menu limit + 建立菜单被限制 + + + 45011 + api limit + 频率限制 + + + 45012 + template size out of limit + 模板大小超过限制 + + + 45016 + can't modify sys group + 不能修改默认组 + + + 45017 + can't set group name too long sys group + 修改组名过长 + + + 45018 + too many group now, no need to add new + 组数量过多 + + + 50001 + api unauthorized + 接口未授权 + + + + SYSTEMERROR + SYSTEMERROR + 接口后台错误 + + + INVALID_TRANSACTIONID + INVALID_TRANSACTIONID + 无效 transaction_id + + + PARAM_ERROR + PARAM_ERROR + 提交参数错误 + + + ORDERPAID + ORDERPAID + 订单已支付 + + + + OUT_TRADE_NO_USED + OUT_TRADE_NO_USED + 商户订单号重复 + + + NOAUTH + NOAUTH + 商户无权限 + + + NOTENOUGH + NOTENOUGH + 余额不足 + + + NOTSUPORTCARD + NOTSUPORTCARD + 不支持卡类型 + + + ORDERCLOSED + ORDERCLOSED + 订单已关闭 + + + BANKERROR + BANKERROR + 银行系统异常 + + + REFUND_FEE_INVALID + REFUND_FEE_INVALID + 退款金额大于支付金额 + + + ORDERNOTEXIST + ORDERNOTEXIST + 订单不存在 + \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java index 6f7d2057..fbe55410 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccount.java @@ -3,22 +3,72 @@ package com.foxinmy.weixin4j.model; /** * 微信账户信息 * - * @className WeixinAccountV2 + * @className WeixinAccount * @author jy * @date 2014年8月17日 * @since JDK 1.7 * @see */ -public class WeixinAccount extends WeixinAccountV2 { +public class WeixinAccount extends WeixinConfig { private static final long serialVersionUID = 3689999353867189585L; + + // 公众号支付请求中用于加密的密钥 Key,可验证商户唯一身份,PaySignKey 对应于支付场景中的 appKey 值 + private String paySignKey; + // 财付通商户身份的标识 + private String partnerId; + // 财付通商户权限密钥Key + private String partnerKey; + // 微信支付商户号V3.x版本 + private String mchId; + // 微信支付分配的设备号 + private String deviceInfo; + // 是否已经认证 private boolean isAlive; // 是否是服务号 private boolean isService; // 是否是订阅号 - private boolean isSubscribe = true; - // 微信支付商户号 - private String mchId; + private boolean isSubscribe; + + public String getPaySignKey() { + return paySignKey; + } + + public void setPaySignKey(String paySignKey) { + this.paySignKey = paySignKey; + } + + public String getPartnerId() { + return partnerId; + } + + public void setPartnerId(String partnerId) { + this.partnerId = partnerId; + } + + public String getPartnerKey() { + return partnerKey; + } + + public void setPartnerKey(String partnerKey) { + this.partnerKey = partnerKey; + } + + 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 boolean getIsAlive() { return isAlive; @@ -39,46 +89,28 @@ public class WeixinAccount extends WeixinAccountV2 { public boolean getIsSubscribe() { return isSubscribe; } - public String getMchId() { - return mchId; - } - public void setMchId(String mchId) { - this.mchId = mchId; - } + public void setIsSubscribe(Boolean isSubscribe) { this.isSubscribe = isSubscribe; } public WeixinAccount() { + } - public WeixinAccount(boolean isAlive, boolean isService, - boolean isSubscribe, String token, String openId) { - super.setToken(token); - super.setOpenId(openId); - this.isAlive = isAlive; - this.isService = isService; - this.isSubscribe = isSubscribe; + public WeixinAccount(String appId, String appSecret, String paySignKey, + String mchId) { + super(appId, appSecret); + this.paySignKey = paySignKey; + this.mchId = mchId; } - public WeixinAccount(boolean isAlive, boolean isService, - boolean isSubscribe, String token, String openId, String appId, - String appSecret) { - super.setToken(token); - super.setOpenId(openId); - super.setAppId(appId); - super.setAppSecret(appSecret); - this.isAlive = isAlive; - this.isService = isService; - this.isSubscribe = isSubscribe; + public WeixinAccount(String appId, String appSecret, String paySignKey, + String partnerId, String partnerKey) { + super(appId, appSecret); + this.paySignKey = paySignKey; + this.partnerId = partnerId; + this.partnerKey = partnerKey; } - @Override - public String toString() { - return "WeixinAccount [isAlive=" + isAlive + ", isService=" + isService - + ", isSubscribe=" + isSubscribe + ", mchId=" + mchId - + ", getIsAlive()=" + getIsAlive() + ", getIsService()=" - + getIsService() + ", getIsSubscribe()=" + getIsSubscribe() - + ", getMchId()=" + getMchId() + "]"; - } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV2.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV2.java deleted file mode 100644 index fa434a39..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV2.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.foxinmy.weixin4j.model; - -/** - * 微信支付V2.7 - * - * @className WeixinAccountV2 - * @author jy - * @date 2014年8月17日 - * @since JDK 1.7 - * @see - */ -public class WeixinAccountV2 extends WeixinConfig { - private static final long serialVersionUID = 3689999353867189585L; - // 公众号支付请求中用于加密的密钥 Key,可验证商户唯一身份,PaySignKey 对应于支付场景中的 appKey 值 - private String paySignKey; - // 财付通商户身份的标识 - private String partnerId; - // 财付通商户权限密钥Key - private String partnerKey; - - public String getPaySignKey() { - return paySignKey; - } - public void setPaySignKey(String paySignKey) { - this.paySignKey = paySignKey; - } - public String getPartnerId() { - return partnerId; - } - public void setPartnerId(String partnerId) { - this.partnerId = partnerId; - } - public String getPartnerKey() { - return partnerKey; - } - public void setPartnerKey(String partnerKey) { - this.partnerKey = partnerKey; - } - - public WeixinAccountV2() { - } - public WeixinAccountV2(String openId, String appId, String appSecret, - String paySignKey, String partnerId, String partnerKey) { - super(null, openId, appId, appSecret); - this.paySignKey = paySignKey; - this.partnerId = partnerId; - this.partnerKey = partnerKey; - } - @Override - public String toString() { - return "WeixinAccountV2 [paySignKey=" + paySignKey + ", partnerId=" - + partnerId + ", partnerKey=" + partnerKey - + ", getPaySignKey()=" + getPaySignKey() + ", getPartnerId()=" - + getPartnerId() + ", getPartnerKey()=" + getPartnerKey() + "]"; - } -} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV3.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV3.java deleted file mode 100644 index ff08b783..00000000 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinAccountV3.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.foxinmy.weixin4j.model; - -/** - * 微信支付V3.3.6 - * - * @className WeixinConfig - * @author jy - * @date 2014年8月17日 - * @since JDK 1.7 - * @see - */ -public class WeixinAccountV3 extends WeixinConfig { - private static final long serialVersionUID = 3689999353867189585L; - // 公众号支付请求中用于加密的密钥 Key,可验证商户唯一身份,PaySignKey 对应于支付场景中的 appKey 值 - private String paySignKey; - // 微信支付商户号 - private String mchId; - - public String getPaySignKey() { - return paySignKey; - } - public void setPaySignKey(String paySignKey) { - this.paySignKey = paySignKey; - } - public String getMchId() { - return mchId; - } - public void setMchId(String mchId) { - this.mchId = mchId; - } - public WeixinAccountV3() { - } - - public WeixinAccountV3(String appId, String appSecret, String paySignKey, - String mchId, String openId) { - super(null, openId, appId, appSecret); - this.mchId = mchId; - this.paySignKey = paySignKey; - } - @Override - public String toString() { - return "WeixinAccountV3 [paySignKey=" + paySignKey + ", mchId=" + mchId - + ", getPaySignKey()=" + getPaySignKey() + ", getMchId()=" - + getMchId() + "]"; - } -} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinConfig.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinConfig.java index 9aee9c61..748ce003 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinConfig.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/WeixinConfig.java @@ -13,40 +13,48 @@ public class WeixinConfig implements Serializable { private String appId; // 除了支付请求需要用到 paySignKey,公众平台接口 API 的权限获取所需密 钥 Key private String appSecret; + public String getToken() { return token; } + public void setToken(String token) { this.token = token; } + public String getOpenId() { return openId; } + public void setOpenId(String openId) { this.openId = openId; } + public String getAppId() { return appId; } + public void setAppId(String appId) { this.appId = appId; } + public String getAppSecret() { return appSecret; } + public void setAppSecret(String appSecret) { this.appSecret = appSecret; } + public WeixinConfig() { } - public WeixinConfig(String token, String openId, String appId, - String appSecret) { - this.token = token; - this.openId = openId; + + public WeixinConfig(String appId, String appSecret) { this.appId = appId; this.appSecret = appSecret; } + @Override public String toString() { return "WeixinConfig [token=" + token + ", openId=" + openId diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java index e8124706..a1fd1c96 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenHolder.java @@ -1,14 +1,13 @@ package com.foxinmy.weixin4j.token; -import com.alibaba.fastjson.JSON; import com.foxinmy.weixin4j.http.HttpRequest; import com.foxinmy.weixin4j.model.WeixinConfig; import com.foxinmy.weixin4j.util.ConfigUtil; /** - * 获取config.properties中的appid&appsecret信息 + * 获取weixin.properties中的appid&appsecret信息 * - * @className AbstractTokenApi + * @className AbstractTokenHolder * @author jy * @date 2014年10月6日 * @since JDK 1.7 @@ -17,18 +16,25 @@ import com.foxinmy.weixin4j.util.ConfigUtil; public abstract class AbstractTokenHolder implements TokenHolder { protected final String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; protected final HttpRequest request = new HttpRequest(); - private final WeixinConfig weixinConfig; + private final String appid; + private final String appsecret; public AbstractTokenHolder() { - weixinConfig = JSON.parseObject(ConfigUtil.getValue("account"), - WeixinConfig.class); + WeixinConfig weixinConfig = ConfigUtil.getWeixinConfig(); + this.appid = weixinConfig.getAppId(); + this.appsecret = weixinConfig.getAppSecret(); + } + + public AbstractTokenHolder(String appid, String appsecret) { + this.appid = appid; + this.appsecret = appsecret; } protected String getAppid() { - return weixinConfig.getAppId(); + return this.appid; } protected String getAppsecret() { - return weixinConfig.getAppSecret(); + return this.appsecret; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java index 76fdbeb2..7f966268 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/FileTokenHolder.java @@ -1,12 +1,14 @@ package com.foxinmy.weixin4j.token; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import org.apache.commons.lang3.StringUtils; +import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.http.Response; import com.foxinmy.weixin4j.model.Token; @@ -26,17 +28,12 @@ import com.foxinmy.weixin4j.xml.XStream; */ public class FileTokenHolder extends AbstractTokenHolder { - private final String appid; - private final String appsecret; - public FileTokenHolder() { - this.appid = getAppid(); - this.appsecret = getAppsecret(); + super(); } public FileTokenHolder(String appid, String appsecret) { - this.appid = appid; - this.appsecret = appsecret; + super(appid, appsecret); } /** @@ -53,12 +50,12 @@ public class FileTokenHolder extends AbstractTokenHolder { */ @Override public Token getToken() throws WeixinException { + String appid = getAppid(); + String appsecret = getAppsecret(); if (StringUtils.isBlank(appid) || StringUtils.isBlank(appsecret)) { throw new IllegalArgumentException( "appid or appsecret not be null!"); } - XStream xstream = XStream.get(); - xstream.processAnnotations(Token.class); File token_file = new File(String.format("%s/token_%s.xml", ConfigUtil.getValue("token_path"), appid)); Token token = null; @@ -66,7 +63,8 @@ public class FileTokenHolder extends AbstractTokenHolder { long now_time = ca.getTimeInMillis(); try { if (token_file.exists()) { - token = (Token) xstream.fromXML(token_file); + token = XStream.get(new FileInputStream(token_file), + Token.class); long expise_time = token.getTime() + (token.getExpiresIn() * 1000) - 3; @@ -74,23 +72,18 @@ public class FileTokenHolder extends AbstractTokenHolder { return token; } } else { - try { - token_file.createNewFile(); - } catch (IOException e) { - token_file.getParentFile().mkdirs(); - } + token_file.createNewFile(); } - String api_token_uri = String.format( - tokenUrl, appid, appsecret); + String api_token_uri = String.format(tokenUrl, appid, appsecret); Response response = request.get(api_token_uri); - token = response.getAsObject(Token.class); + token = response.getAsObject(new TypeReference() { + }); token.setTime(now_time); token.setOpenid(appid); - xstream.toXML(token, new FileOutputStream(token_file)); - return token; + XStream.to(token, new FileOutputStream(token_file)); } catch (IOException e) { - ; + throw new WeixinException("-1", "IO ERROR"); } - throw new WeixinException("-1", "request fail"); + return token; } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java index 472e8ae7..50c4ddd2 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/RedisTokenHolder.java @@ -6,6 +6,7 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; +import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.model.Token; @@ -22,13 +23,10 @@ import com.foxinmy.weixin4j.model.Token; */ public class RedisTokenHolder extends AbstractTokenHolder { - private final String appid; - private final String appsecret; private JedisPool jedisPool; public RedisTokenHolder() { - this.appid = getAppid(); - this.appsecret = getAppsecret(); + super(); } public RedisTokenHolder(String appid, String appsecret) { @@ -37,8 +35,7 @@ public class RedisTokenHolder extends AbstractTokenHolder { public RedisTokenHolder(String appid, String appsecret, String host, int port) { - this.appid = appid; - this.appsecret = appsecret; + super(appid, appsecret); JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(50); poolConfig.setMaxIdle(5); @@ -50,6 +47,8 @@ public class RedisTokenHolder extends AbstractTokenHolder { @Override public Token getToken() throws WeixinException { + String appid = getAppid(); + String appsecret = getAppsecret(); if (StringUtils.isBlank(appid) || StringUtils.isBlank(appsecret)) { throw new IllegalArgumentException( "appid or appsecret not be null!"); @@ -63,7 +62,9 @@ public class RedisTokenHolder extends AbstractTokenHolder { if (StringUtils.isBlank(accessToken)) { String api_token_uri = String .format(tokenUrl, appid, appsecret); - token = request.get(api_token_uri).getAsObject(Token.class); + token = request.get(api_token_uri).getAsObject( + new TypeReference() { + }); jedis.setex(key, token.getExpiresIn() - 3, token.getAccessToken()); } else { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java index 12f2a0b2..aa98f92d 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ClassUtil.java @@ -6,6 +6,14 @@ import java.net.URL; import java.util.HashSet; import java.util.Set; +/** + * 对class的获取 + * @className ClassUtil + * @author jy + * @date 2014年10月31日 + * @since JDK 1.7 + * @see + */ public class ClassUtil { public static Set> getClasses(Package _package) { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java index d3c6cbf0..75cbca62 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ConfigUtil.java @@ -1,27 +1,46 @@ package com.foxinmy.weixin4j.util; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Properties; +import java.io.File; +import java.util.ResourceBundle; +import java.util.Set; +import com.alibaba.fastjson.JSON; +import com.foxinmy.weixin4j.model.WeixinAccount; +import com.foxinmy.weixin4j.model.WeixinConfig; + +/** + * 商户配置工具类 + * + * @className ConfigUtil + * @author jy + * @date 2014年10月31日 + * @since JDK 1.7 + * @see + */ public class ConfigUtil { - private static Properties props = new Properties(); + private static ResourceBundle weixin; static { - try { - props.load(Thread.currentThread().getContextClassLoader() - .getResourceAsStream("weixin.properties")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); + weixin = ResourceBundle.getBundle("weixin"); + Set keySet = weixin.keySet(); + for (String key : keySet) { + if (!key.endsWith("_path")) { + continue; + } + new File(getValue(key)).mkdirs(); } } public static String getValue(String key) { - return props.getProperty(key); + return weixin.getString(key); } - public static void main(String[] args) { - System.out.println(getValue("api_token_uri")); + public static WeixinAccount getWeixinAccount() { + String text = getValue("account"); + return JSON.parseObject(text, WeixinAccount.class); + } + + public static WeixinConfig getWeixinConfig() { + String text = getValue("account"); + return JSON.parseObject(text, WeixinConfig.class); } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java new file mode 100644 index 00000000..f2127fc6 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/DateUtil.java @@ -0,0 +1,21 @@ +package com.foxinmy.weixin4j.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 日期工具类 + * + * @className DateUtil + * @author jy + * @date 2014年10月31日 + * @since JDK 1.7 + * @see + */ +public class DateUtil { + private static final String YYYYMMDD = "yyyyMMdd"; + + public static String fortmatYYYYMMDD(Date date) { + return new SimpleDateFormat(YYYYMMDD).format(date); + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java new file mode 100644 index 00000000..dc7f3df1 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MapUtil.java @@ -0,0 +1,79 @@ +package com.foxinmy.weixin4j.util; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Comparator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; + +/** + * 签名工具类 + * @className MapUtil + * @author jy + * @date 2014年10月31日 + * @since JDK 1.7 + * @see + */ +public class MapUtil { + private final static Charset charset = StandardCharsets.UTF_8; + + public static String toJoinString(Object object, boolean encoder, + boolean lowerCase, JSONObject extra) { + String text = JSON.toJSONString(object); + Map map = new TreeMap( + new Comparator() { + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2); + } + }); + map.putAll(JSON.parseObject(text, + new TypeReference>() { + })); + if (extra != null && !extra.isEmpty()) { + for (String key : extra.keySet()) { + map.put(key, extra.getString(key)); + } + } + StringBuilder sb = new StringBuilder(); + Set> set = map.entrySet(); + try { + if (encoder && lowerCase) { + for (Map.Entry entry : set) { + sb.append(entry.getKey().toLowerCase()) + .append("=") + .append(URLEncoder.encode(entry.getValue(), + charset.name())).append("&"); + } + } else if (encoder) { + for (Map.Entry entry : set) { + sb.append(entry.getKey()) + .append("=") + .append(URLEncoder.encode(entry.getValue(), + charset.name())).append("&"); + } + } else if (lowerCase) { + for (Map.Entry entry : set) { + sb.append(entry.getKey().toLowerCase()).append("=") + .append(entry.getValue()).append("&"); + } + } else { + for (Map.Entry entry : set) { + sb.append(entry.getKey()).append("=") + .append(entry.getValue()).append("&"); + } + } + } catch (UnsupportedEncodingException e) { + ; + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java index 0cd38658..443cb755 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/MessageUtil.java @@ -17,6 +17,14 @@ import com.foxinmy.weixin4j.type.EventType; import com.foxinmy.weixin4j.type.MessageType; import com.foxinmy.weixin4j.xml.XStream; +/** + * 消息工具类 + * @className MessageUtil + * @author jy + * @date 2014年10月31日 + * @since JDK 1.7 + * @see + */ public class MessageUtil { private final static Logger log = LoggerFactory @@ -111,10 +119,7 @@ public class MessageUtil { messageClass = EventType.valueOf(type.toLowerCase()) .getEventClass(); } - XStream xstream = XStream.get(); - xstream.processAnnotations(messageClass); - xstream.alias("xml", messageClass); - return xstream.fromXML(xmlMsg, messageClass); + return XStream.get(xmlMsg, messageClass); } /** diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java new file mode 100644 index 00000000..9209a6a5 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/ReflectionUtil.java @@ -0,0 +1,210 @@ +package com.foxinmy.weixin4j.util; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +import org.apache.commons.lang3.StringUtils; + +/** + * @title 反射工具类 + * @description 提供对类,字段的反射调用 + * @author jy.hu , 2012-10-26 + */ +public class ReflectionUtil { + + // 获取包包名 + public static String getPackageName(Object obj) { + return obj.getClass().getPackage().getName(); + } + + // 获取字段的泛型参数类型 + public static Class getFieldGenericType(Object obj, String fieldName) { + Field field = getAccessibleField(obj, fieldName); + Type type = field.getGenericType(); + if (type instanceof ParameterizedType) { + return (Class) ((ParameterizedType) type) + .getActualTypeArguments()[0]; + } + return null; + } + + /** + * 调用方法 + * + * @param object + * 对象 + * + * @param propertyName + * 属性名称 + */ + public static Object invokeMethod(Object object, String propertyName) { + try { + Method getterMethod = object.getClass().getMethod(propertyName); + return getterMethod.invoke(object); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Object invokeMethod(Object object, String propertyName, + Object... args) { + try { + Method getterMethod = object.getClass().getMethod(propertyName); + return getterMethod.invoke(object, args); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 调用Getter方法 + * + * @param object + * 对象 + * + * @param propertyName + * 属性名称 + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + */ + public static Object invokeGetterMethod(Object object, String propertyName) + throws Exception { + String getterMethodName = null; + Method getterMethod = null; + String propertyNa = null; + if (propertyName.contains(".")) { + propertyNa = StringUtils.substringBefore(propertyName, "."); + getterMethodName = "get" + StringUtils.capitalize(propertyNa); + getterMethod = object.getClass().getMethod(getterMethodName); + return invokeGetterMethod(getterMethod.invoke(object), + StringUtils.substringAfter(propertyName, ".")); + } else { + getterMethodName = "get" + StringUtils.capitalize(propertyName); + getterMethod = object.getClass().getMethod(getterMethodName); + return getterMethod.invoke(object); + } + } + + /** + * 调用Setter方法 + * + * @param object + * 对象 + * + * @param propertyName + * 属性名称 + * + * @param propertyValue + * 属性值 + */ + public static void invokeSetterMethod(Object object, String propertyName, + Object propertyValue) { + Class setterMethodClass = propertyValue.getClass(); + invokeSetterMethod(object, propertyName, propertyValue, + setterMethodClass); + } + + /** + * 调用Setter方法 + * + * @param object + * 对象 + * + * @param propertyName + * 属性名称 + * + * @param propertyValue + * 属性值 + * + * @param setterMethodClass + * 参数类型 + */ + public static void invokeSetterMethod(Object object, String propertyName, + Object propertyValue, Class setterMethodClass) { + String setterMethodName = "set" + StringUtils.capitalize(propertyName); + try { + Method setterMethod = object.getClass().getMethod(setterMethodName, + setterMethodClass); + setterMethod.invoke(object, propertyValue); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取对象属性值,无视private/protected/getter + * + * @param object + * 对象 + * + * @param fieldName + * 属性名称 + */ + public static Object getFieldValue(Object object, String fieldName) { + Field field = getAccessibleField(object, fieldName); + if (field == null) { + throw new IllegalArgumentException("Could not find field " + + fieldName); + } + Object result = null; + try { + result = field.get(object); + } catch (IllegalAccessException e) { + + } + return result; + } + + /** + * 设置对象属性值,无视private/protected/setter + * + * @param object + * 对象 + * + * @param fieldName + * 属性名称 + */ + public static void setFieldValue(Object object, String fieldName, + Object value) { + Field field = getAccessibleField(object, fieldName); + if (field == null) { + throw new IllegalArgumentException("Could not find field " + + fieldName); + } + try { + field.set(object, value); + } catch (IllegalAccessException e) { + + } + } + + // 获取字段的类型 + public static String getFieldType(Object object, String fieldName) { + Field field = getAccessibleField(object, fieldName); + return field.getType().getSimpleName(); + } + + @SuppressWarnings("unused") + private static Field getAccessibleField(final Object object, + final String fieldName) { + for (Class superClass = object.getClass(); superClass != Object.class; superClass = superClass + .getSuperclass()) { + try { + Field field = superClass.getDeclaredField(fieldName); + field.setAccessible(true); + return field; + } catch (NoSuchFieldException e) { + return null; + } + } + return null; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java index b7044e13..f85f3953 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/Map2ObjectConverter.java @@ -1,11 +1,16 @@ package com.foxinmy.weixin4j.xml; -import java.util.Iterator; +import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.lang3.StringUtils; import com.thoughtworks.xstream.converters.MarshallingContext; +import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.converters.collections.MapConverter; import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.mapper.Mapper; @@ -15,13 +20,26 @@ public class Map2ObjectConverter extends MapConverter { super(mapper); } + @Override + public Object unmarshal(HierarchicalStreamReader reader, + UnmarshallingContext context) { + Map map = new HashMap(); + while(reader.hasMoreChildren()){ + reader.moveDown(); + map.put(reader.getNodeName(), reader.getValue()); + reader.moveUp(); + } + return map; + } + @Override public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { Map map = (Map) source; - for (Iterator iterator = map.entrySet().iterator(); iterator - .hasNext();) { - Map.Entry entry = (Map.Entry) iterator.next(); + for (Entry entry : map.entrySet()) { + if (StringUtils.isBlank((String) entry.getValue())) { + continue; + } ExtendedHierarchicalStreamWriterHelper.startNode(writer, entry .getKey().toString(), entry.getClass()); writer.setValue(entry.getValue().toString()); diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java index 4700853e..9544875f 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/XStream.java @@ -1,6 +1,7 @@ package com.foxinmy.weixin4j.xml; import java.io.InputStream; +import java.io.OutputStream; import java.io.Writer; import com.thoughtworks.xstream.core.util.QuickWriter; @@ -50,4 +51,34 @@ public class XStream extends com.thoughtworks.xstream.XStream { xstream.autodetectAnnotations(true); return xstream; } + + public static T get(InputStream inputStream, Class clazz) { + XStream xStream = get(); + xStream.alias("xml", clazz); + xStream.processAnnotations(clazz); + return xStream.fromXML(inputStream, clazz); + } + + public static T get(String xml, Class clazz) { + XStream xStream = get(); + xStream.alias("xml", clazz); + xStream.processAnnotations(clazz); + return xStream.fromXML(xml, clazz); + } + + public static String to(Object obj) { + XStream xStream = get(); + Class clazz = obj.getClass(); + xStream.alias("xml", clazz); + xStream.processAnnotations(clazz); + return xStream.toXML(obj); + } + + public static void to(Object obj, OutputStream out) { + XStream xStream = get(); + Class clazz = obj.getClass(); + xStream.alias("xml", clazz); + xStream.processAnnotations(clazz); + xStream.toXML(obj, out); + } } diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md index 795ca59d..e452fda5 100644 --- a/weixin4j-mp/README.md +++ b/weixin4j-mp/README.md @@ -1,66 +1,52 @@ weixin4j-mp =========== -tencent weixin platform java sdk 微信公众平台开发工具包 http://mp.weixin.qq.com/wiki +@(weixin4j)[公众平台] + +微信[公众平台](http://mp.weixin.qq.com/wiki)开发工具包 +---------------------------------------------------- 功能列表 ------- +* weixin4j-mp-api -* TokenHolder token的实现 - -* MediaApi 上传/下载媒体文件API - -* NotifyApi 客服消息API - -* MassApi 群发消息API - -* UserApi 用户管理API - -* GroupApi 分组管理API - -* MenuApi 底部菜单API - -* QrApi 二维码API - -* TmplApi 模板消息API - -* HelperApi 辅助API - -* netty服务器 & 消息分发 - - -如何使用 --------- -1.编辑classweixin.properties并填入appid/appsecret,当然也可通过构造函数传入. - -2.实例化一个WeixinProxy对象,调用API. - - WeixinProxy weixinProxy = new WeixinProxy(); - // weixinProxy = new WeixinProxy(appid,appsecret); - weixinProxy.getUser(openId); - -3.针对token存储有两种方案,File存储/Redis存储,当然也可自己实现TokenHolder(继承AbstractTokenHolder类并重写getToken方法),默认使用文件(xml)的方式保存token,如果环境中支持redis,建议使用RedisTokenHolder. - - WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenHolder()); - // weixinProxy = new WeixinProxy(new RedisTokenHolder(appid,appsecret)); - -4.mvn package,得到一个zip的压缩包,解压到启动目录(见src/main/startup.sh/APP_HOME) - -5.启动netty服务 - - com.foxinmy.weixin4j.mp.startup.WeixinServiceBootstrap - sh startup.sh start + + MediaApi `上传/下载媒体文件API` + + NotifyApi `客服消息API` + + + MassApi `群发消息API` + + + UserApi `用户管理API` + + + GroupApi `分组管理API` + + + MenuApi `底部菜单API` + + + QrApi `二维码API` + + + TmplApi `模板消息API` + + + HelperApi `辅助API` + +* weixin4j-mp-server + `netty服务器 & 消息分发` + 更新LOG ------- * 2014-10-27 - 1).用netty构建http服务器并支持消息分发 + + 用netty构建http服务器并支持消息分发 * 2014-10-28 - 1).调整ActionMapping抽象化 + + 调整`ActionMapping`抽象化 * 2014-10-31 - 1).weixin.properties切分为API调用地址/公众号信息两部分 \ No newline at end of file + + `weixin.properties`切分为API调用地址/公众号信息两部分 + +* 2014-11-03 + + + `weixin-mp`分离为`weixin-mp-api`和`weixin-mp-server`两个工程 + + + `weixin-mp`:加入支付模块 \ No newline at end of file diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml index d04b19a4..b09fe644 100644 --- a/weixin4j-mp/pom.xml +++ b/weixin4j-mp/pom.xml @@ -8,54 +8,23 @@ weixin4j 0.0.1-SNAPSHOT - com.foxinmy.weixin weixin4j-mp weixin4j-mp - + pom + https://github.com/foxinmy/weixin4j/tree/master/weixin4j-mp + 微信公众号工具包 + + weixin4j-mp-api + weixin4j-mp-server + - - - org.apache.maven.plugins - maven-assembly-plugin - 2.2.1 - - - src/main/assembly.xml - - - - - make-assembly - package - - single - - - - - weixin4j-mp - - org.jsoup - jsoup - ${jsoup.version} - - - jaxen - jaxen - ${jaxen.version} - - - io.netty - netty-all - ${netty.version} - com.foxinmy.weixin4j weixin4j-base - ${weixin4j.version} + ${weixin4j.base.version} diff --git a/weixin4j-mp/weixin4j-mp-api/.gitignore b/weixin4j-mp/weixin4j-mp-api/.gitignore new file mode 100644 index 00000000..c880f664 --- /dev/null +++ b/weixin4j-mp/weixin4j-mp-api/.gitignore @@ -0,0 +1,28 @@ +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# eclipse ignore +*.settings/* +/.project +/.classpath +/.tomcatplugin + +# maven ignore +target/* + +# other ignore +*.log +*.tmp +Thumbs.db +/target/ +.DS_Store diff --git a/weixin4j-mp/weixin4j-mp-api/README.md b/weixin4j-mp/weixin4j-mp-api/README.md new file mode 100644 index 00000000..9f5a164e --- /dev/null +++ b/weixin4j-mp/weixin4j-mp-api/README.md @@ -0,0 +1,87 @@ +weixin4j-mp-api +=============== + +@(weixin4j)[公众平台] + +微信[公众平台](http://mp.weixin.qq.com/wiki)开发工具包 + +功能列表 +------- +* MediaApi `上传/下载媒体文件API` + +* NotifyApi `客服消息API` + +* MassApi `群发消息API` + +* UserApi `用户管理API` + +* GroupApi `分组管理API` + +* MenuApi `底部菜单API` + +* QrApi `二维码API` + +* TmplApi `模板消息API` + +* HelperApi `辅助API` + +* PayApi `支付API` + +如何使用 +-------- +1.API工程可以单独使用,需新增或拷贝`weixin.properties`文件到classpath + +weixin.properties + +| 属性名 | 说明 | +| :---------- | :-------------- | +| account | 微信公众号信息 `json格式` | +| token_path | 使用FileTokenHolder时token保存的物理路径 | +| qr_path | 调用二维码接口时保存的物理路径 | + +示例 + +>**`account={"appId":"appId","appSecret":"appSecret", +"token":"开放者的token 非必须","openId":"公众号的openid 非必须", +"mchId":"V3.x版本下的微信商户号", +"partnerId":"财付通的商户号","partnerKey":"财付通商户权限密钥Key", +"paySignKey":"微信支付中调用API的密钥"} +token_path=/tmp/weixin/token` +`qr_path=/tmp/weixin/qr` +`media_path=/tmp/weixin/media` +`bill_path=/tmp/weixin/bill`** + +2.实例化一个`WeixinProxy`对象,调用API. + ``` java + WeixinProxy weixinProxy = new WeixinProxy(); + // weixinProxy = new WeixinProxy(appid,appsecret); + weixinProxy.getUser(openId); + ``` + +3.针对`token`存储有两种方案,`File存储`/`Redis存储`,当然也可自己实现`TokenHolder`(继承`AbstractTokenHolder`类并重写`getToken`方法),默认使用文件(xml)的方式保存token,如果环境中支持`redis`,建议使用`RedisTokenHolder`. + ``` java + WeixinProxy weixinProxy = new WeixinProxy(new RedisTokenHolder()); + // weixinProxy = new WeixinProxy(new RedisTokenHolder(appid,appsecret)); + ``` + +4.mvn package. + +更新LOG +------- +* 2014-10-27 + + + 用netty构建http服务器并支持消息分发 + +* 2014-10-28 + + + 调整`ActionMapping`抽象化 + +* 2014-10-31 + + + `weixin.properties`切分为API调用地址/公众号信息两部分 + +* 2014-11-03 + + + 分离为`weixin-mp-api`和`weixin-mp-server`两个工程 + + + 加入支付模块 \ No newline at end of file diff --git a/weixin4j-mp/weixin4j-mp-api/pom.xml b/weixin4j-mp/weixin4j-mp-api/pom.xml new file mode 100644 index 00000000..613e68a9 --- /dev/null +++ b/weixin4j-mp/weixin4j-mp-api/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + com.foxinmy.weixin4j + weixin4j-mp + 0.0.1-SNAPSHOT + + weixin4j-mp-api + weixin4j-mp-api + https://github.com/foxinmy/weixin4j/tree/master/weixin4j-mp + 微信公众号API + + weixin4j-mp-api + + + src/main/resources + + *.* + + + + + + + org.jsoup + jsoup + ${jsoup.version} + + + jaxen + jaxen + ${jaxen.version} + + + org.apache.poi + poi + ${poi.version} + + + commons-codec + commons-codec + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java similarity index 80% rename from weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java rename to weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java index a6644c53..027bea37 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java +++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/WeixinProxy.java @@ -2,13 +2,14 @@ package com.foxinmy.weixin4j.mp; import java.io.File; import java.io.IOException; +import java.util.Date; import java.util.List; import com.alibaba.fastjson.JSONObject; import com.foxinmy.weixin4j.exception.WeixinException; -import com.foxinmy.weixin4j.http.BaseResult; -import com.foxinmy.weixin4j.model.WeixinAccountV2; -import com.foxinmy.weixin4j.model.WeixinAccountV3; +import com.foxinmy.weixin4j.http.JsonResult; +import com.foxinmy.weixin4j.http.XmlResult; +import com.foxinmy.weixin4j.model.WeixinAccount; import com.foxinmy.weixin4j.mp.api.GroupApi; import com.foxinmy.weixin4j.mp.api.HelperApi; import com.foxinmy.weixin4j.mp.api.MassApi; @@ -30,7 +31,11 @@ import com.foxinmy.weixin4j.mp.model.UserToken; import com.foxinmy.weixin4j.mp.msg.model.Article; import com.foxinmy.weixin4j.mp.msg.model.BaseMsg; import com.foxinmy.weixin4j.mp.msg.notify.BaseNotify; +import com.foxinmy.weixin4j.mp.payment.BillType; +import com.foxinmy.weixin4j.mp.payment.IdQuery; +import com.foxinmy.weixin4j.mp.payment.IdType; import com.foxinmy.weixin4j.mp.payment.v2.Order; +import com.foxinmy.weixin4j.mp.payment.v3.Refund; import com.foxinmy.weixin4j.mp.response.TemplateMessage; import com.foxinmy.weixin4j.token.FileTokenHolder; import com.foxinmy.weixin4j.token.TokenHolder; @@ -74,17 +79,17 @@ public class WeixinProxy { this(new FileTokenHolder(appid, appsecret)); } - public WeixinProxy(TokenHolder tokenApi) { - this.mediaApi = new MediaApi(tokenApi); - this.notifyApi = new NotifyApi(tokenApi); - this.massApi = new MassApi(tokenApi); - this.userApi = new UserApi(tokenApi); - this.groupApi = new GroupApi(tokenApi); - this.menuApi = new MenuApi(tokenApi); - this.qrApi = new QrApi(tokenApi); - this.tmplApi = new TmplApi(tokenApi); - this.helperApi = new HelperApi(tokenApi); - this.payApi = new PayApi(tokenApi); + public WeixinProxy(TokenHolder tokenHolder) { + this.mediaApi = new MediaApi(tokenHolder); + this.notifyApi = new NotifyApi(tokenHolder); + this.massApi = new MassApi(tokenHolder); + this.userApi = new UserApi(tokenHolder); + this.groupApi = new GroupApi(tokenHolder); + this.menuApi = new MenuApi(tokenHolder); + this.qrApi = new QrApi(tokenHolder); + this.tmplApi = new TmplApi(tokenHolder); + this.helperApi = new HelperApi(tokenHolder); + this.payApi = new PayApi(tokenHolder); } /** @@ -182,7 +187,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.msg.notify.ArticleNotify * @see com.foxinmy.weixin4j.mp.api.NotifyApi */ - public BaseResult sendNotify(BaseNotify notify) throws WeixinException { + public JsonResult sendNotify(BaseNotify notify) throws WeixinException { return notifyApi.sendNotify(notify); } @@ -199,7 +204,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.msg.notify.ArticleNotify * @see com.foxinmy.weixin4j.mp.api.NotifyApi */ - public BaseResult sendNotify(String touser, List
articles) + public JsonResult sendNotify(String touser, List
articles) throws WeixinException { return notifyApi.sendNotify(touser, articles); } @@ -220,7 +225,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.msg.model.Voice * @see com.foxinmy.weixin4j.mp.api.NotifyApi */ - public BaseResult sendNotify(String touser, BaseMsg baseMsg) + public JsonResult sendNotify(String touser, BaseMsg baseMsg) throws WeixinException { return notifyApi.sendNotify(touser, baseMsg); } @@ -393,7 +398,7 @@ public class WeixinProxy { * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByGroup(JSONObject, String)} * @see {@link com.foxinmy.weixin4j.mp.WeixinProxy#massByOpenIds(JSONObject, String...) */ - public BaseResult deleteMassNews(String msgid) throws WeixinException { + public JsonResult deleteMassNews(String msgid) throws WeixinException { return massApi.deleteMassNews(msgid); } @@ -498,7 +503,7 @@ public class WeixinProxy { * href="http://mp.weixin.qq.com/wiki/index.php?title=%E8%AE%BE%E7%BD%AE%E7%94%A8%E6%88%B7%E5%A4%87%E6%B3%A8%E5%90%8D%E6%8E%A5%E5%8F%A3">设置用户备注名 * @see com.foxinmy.weixin4j.mp.api.UserApi */ - public BaseResult remarkUserName(String openId, String remark) + public JsonResult remarkUserName(String openId, String remark) throws WeixinException { return userApi.remarkUserName(openId, remark); } @@ -564,7 +569,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.model.Group#toModifyJson() * @see com.foxinmy.weixin4j.mp.api.GroupApi */ - public BaseResult modifyGroup(int groupId, String name) + public JsonResult modifyGroup(int groupId, String name) throws WeixinException { return groupApi.modifyGroup(groupId, name); } @@ -582,7 +587,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.mp.model.Group * @see com.foxinmy.weixin4j.mp.api.GroupApi */ - public BaseResult moveGroup(String openId, int groupId) + public JsonResult moveGroup(String openId, int groupId) throws WeixinException { return groupApi.moveGroup(openId, groupId); } @@ -598,7 +603,7 @@ public class WeixinProxy { * @see com.foxinmy.weixin4j.type.ButtonType * @see com.foxinmy.weixin4j.mp.api.MenuApi */ - public BaseResult createMenu(List