├── weixin4j-serverX ├── .gitignore ├── README.md └── src │ └── main │ └── java │ └── com │ └── zone │ └── weixin4j │ ├── socket │ └── README.md │ ├── message │ ├── event │ │ └── README.md │ └── README.md │ ├── spring │ ├── TokenGenerater.java │ └── PropertyTokenGenerater.java │ ├── qy │ ├── chat │ │ ├── ChatType.java │ │ └── ChatEventType.java │ ├── suite │ │ └── SuiteEventType.java │ └── event │ │ └── ScribeEventMessage.java │ ├── type │ ├── AccountType.java │ ├── EncryptType.java │ ├── AgentType.java │ └── MessageType.java │ ├── response │ ├── BlankResponse.java │ ├── SingleResponse.java │ ├── TextResponse.java │ ├── ImageResponse.java │ ├── VoiceResponse.java │ ├── WeixinResponse.java │ └── TransferCustomerResponse.java │ ├── mp │ ├── component │ │ └── ComponentEventType.java │ └── event │ │ ├── ScribeEventMessage.java │ │ ├── KfCloseEventMessage.java │ │ └── KfCreateEventMessage.java │ ├── annotation │ ├── WxMessageHandler.java │ └── WxMessageInterceptor.java │ ├── dispatcher │ └── WeixinMessageMatcher.java │ └── service │ ├── WeiXin4jContextAware.java │ └── WxService.java ├── weixin4j-base ├── src │ ├── main │ │ ├── resources │ │ │ └── com │ │ │ │ └── foxinmy │ │ │ │ └── weixin4j │ │ │ │ └── weixin4j.properties │ │ └── java │ │ │ └── com │ │ │ └── foxinmy │ │ │ └── weixin4j │ │ │ ├── api │ │ │ └── README.md │ │ │ ├── model │ │ │ ├── card │ │ │ │ ├── GiftCardOrder.java │ │ │ │ ├── GiftCoupon.java │ │ │ │ └── DiscountCoupon.java │ │ │ └── WeixinAccount.java │ │ │ ├── type │ │ │ ├── TarType.java │ │ │ ├── SignType.java │ │ │ ├── card │ │ │ │ ├── SubCardType.java │ │ │ │ ├── ActivateFormFieldType.java │ │ │ │ ├── UserCardStatus.java │ │ │ │ ├── CardStatus.java │ │ │ │ ├── CardType.java │ │ │ │ ├── CardCodeType.java │ │ │ │ └── FieldNameType.java │ │ │ ├── Gender.java │ │ │ ├── TicketType.java │ │ │ ├── mch │ │ │ │ ├── RedpacketType.java │ │ │ │ ├── RefundAccountType.java │ │ │ │ ├── RedpacketSendType.java │ │ │ │ ├── RedpacketStatus.java │ │ │ │ ├── CorpPaymentCheckNameType.java │ │ │ │ ├── CouponStockType.java │ │ │ │ ├── BillType.java │ │ │ │ ├── CouponStatus.java │ │ │ │ ├── RefundChannel.java │ │ │ │ ├── RefundStatus.java │ │ │ │ ├── RefundType.java │ │ │ │ ├── RedpacketSceneType.java │ │ │ │ ├── CouponType.java │ │ │ │ └── CouponStockStatus.java │ │ │ ├── Week.java │ │ │ ├── CredentialType.java │ │ │ ├── TradeType.java │ │ │ ├── CustomsSatus.java │ │ │ ├── QRType.java │ │ │ ├── CurrencyType.java │ │ │ ├── CustomsCity.java │ │ │ ├── TradeState.java │ │ │ ├── IdType.java │ │ │ └── IdQuery.java │ │ │ ├── http │ │ │ ├── HttpMethod.java │ │ │ ├── HttpMessage.java │ │ │ ├── entity │ │ │ │ └── HttpEntity.java │ │ │ ├── factory │ │ │ │ └── SimpleHttpClientFactory.java │ │ │ ├── HttpResponse.java │ │ │ ├── AbstractHttpResponse.java │ │ │ ├── HttpClientException.java │ │ │ ├── support │ │ │ │ └── okhttp │ │ │ │ │ └── OkHttpClientFactory.java │ │ │ └── URLParameter.java │ │ │ ├── tuple │ │ │ ├── ChatTuple.java │ │ │ ├── README.md │ │ │ ├── Tuple.java │ │ │ ├── MassTuple.java │ │ │ ├── NotifyTuple.java │ │ │ ├── Voice.java │ │ │ ├── Text.java │ │ │ └── MpVideo.java │ │ │ ├── cache │ │ │ ├── README.md │ │ │ ├── Cacheable.java │ │ │ ├── CacheCreator.java │ │ │ └── CacheStorager.java │ │ │ ├── xml │ │ │ ├── ListWrapper.java │ │ │ └── ListsuffixResult.java │ │ │ ├── sign │ │ │ ├── WeixinSignature.java │ │ │ ├── AbstractWeixinSignature.java │ │ │ └── WeixinPaymentSignature.java │ │ │ ├── payment │ │ │ └── mch │ │ │ │ └── AbstractPayRequest.java │ │ │ ├── util │ │ │ ├── RegexUtil.java │ │ │ └── NameValue.java │ │ │ └── token │ │ │ └── PerTicketManager.java │ └── test │ │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ ├── util │ │ └── ConstsTest.java │ │ ├── api │ │ └── MchApiTest.java │ │ └── base │ │ └── test │ │ └── http │ │ ├── SimpleHttpTest.java │ │ ├── OkHttp2ClinetTest.java │ │ ├── OkHttp3ClinetTest.java │ │ ├── NettyHttpClientTest.java │ │ ├── Apache3HttpClientTest.java │ │ ├── Apache4_1HttpClientTest.java │ │ └── Apache4_2HttpClientTest.java ├── README.md └── .gitignore ├── weixin4j-wxa └── src │ ├── main │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ └── wxa │ │ ├── api │ │ ├── package-info.java │ │ ├── WxaApiAsyncResult.java │ │ ├── WxaQrCodeParameter.java │ │ ├── AddTemplateParameter.java │ │ └── Color.java │ │ ├── model │ │ ├── package-info.java │ │ ├── template │ │ │ ├── package-info.java │ │ │ └── Keyword.java │ │ ├── custommessage │ │ │ ├── package-info.java │ │ │ ├── Text.java │ │ │ ├── Image.java │ │ │ ├── Command.java │ │ │ └── CustomMessage.java │ │ └── subscribemessage │ │ │ └── package-info.java │ │ └── package-info.java │ └── test │ ├── resources │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ └── wxa │ │ └── api │ │ ├── TemplateList.json │ │ ├── Template.json │ │ └── TemplateListInLibrary.json │ └── java │ └── com │ └── foxinmy │ └── weixin4j │ └── wxa │ ├── model │ ├── custommessage │ │ └── CommandTest.java │ └── SessionTest.java │ └── api │ ├── AddTemplateParameterTest.java │ ├── WxaQrCodeParameterTest.java │ ├── WxaCodeParameterTest.java │ ├── WxaCodeUnlimitParameterTest.java │ └── CustomMessageAdaptersTest.java ├── weixin4j-example ├── src │ └── main │ │ ├── webapp │ │ ├── static │ │ │ └── layui │ │ │ │ ├── font │ │ │ │ ├── iconfont.eot │ │ │ │ ├── iconfont.ttf │ │ │ │ └── iconfont.woff │ │ │ │ ├── images │ │ │ │ └── face │ │ │ │ │ ├── 0.gif │ │ │ │ │ ├── 1.gif │ │ │ │ │ ├── 2.gif │ │ │ │ │ ├── 3.gif │ │ │ │ │ ├── 4.gif │ │ │ │ │ ├── 5.gif │ │ │ │ │ ├── 6.gif │ │ │ │ │ ├── 7.gif │ │ │ │ │ ├── 8.gif │ │ │ │ │ ├── 9.gif │ │ │ │ │ ├── 10.gif │ │ │ │ │ ├── 11.gif │ │ │ │ │ ├── 12.gif │ │ │ │ │ ├── 13.gif │ │ │ │ │ ├── 14.gif │ │ │ │ │ ├── 15.gif │ │ │ │ │ ├── 16.gif │ │ │ │ │ ├── 17.gif │ │ │ │ │ ├── 18.gif │ │ │ │ │ ├── 19.gif │ │ │ │ │ ├── 20.gif │ │ │ │ │ ├── 21.gif │ │ │ │ │ ├── 22.gif │ │ │ │ │ ├── 23.gif │ │ │ │ │ ├── 24.gif │ │ │ │ │ ├── 25.gif │ │ │ │ │ ├── 26.gif │ │ │ │ │ ├── 27.gif │ │ │ │ │ ├── 28.gif │ │ │ │ │ ├── 29.gif │ │ │ │ │ ├── 30.gif │ │ │ │ │ ├── 31.gif │ │ │ │ │ ├── 32.gif │ │ │ │ │ ├── 33.gif │ │ │ │ │ ├── 34.gif │ │ │ │ │ ├── 35.gif │ │ │ │ │ ├── 36.gif │ │ │ │ │ ├── 37.gif │ │ │ │ │ ├── 38.gif │ │ │ │ │ ├── 39.gif │ │ │ │ │ ├── 40.gif │ │ │ │ │ ├── 41.gif │ │ │ │ │ ├── 42.gif │ │ │ │ │ ├── 43.gif │ │ │ │ │ ├── 44.gif │ │ │ │ │ ├── 45.gif │ │ │ │ │ ├── 46.gif │ │ │ │ │ ├── 47.gif │ │ │ │ │ ├── 48.gif │ │ │ │ │ ├── 49.gif │ │ │ │ │ ├── 50.gif │ │ │ │ │ ├── 51.gif │ │ │ │ │ ├── 52.gif │ │ │ │ │ ├── 53.gif │ │ │ │ │ ├── 54.gif │ │ │ │ │ ├── 55.gif │ │ │ │ │ ├── 56.gif │ │ │ │ │ ├── 57.gif │ │ │ │ │ ├── 58.gif │ │ │ │ │ ├── 59.gif │ │ │ │ │ ├── 60.gif │ │ │ │ │ ├── 61.gif │ │ │ │ │ ├── 62.gif │ │ │ │ │ ├── 63.gif │ │ │ │ │ ├── 64.gif │ │ │ │ │ ├── 65.gif │ │ │ │ │ ├── 66.gif │ │ │ │ │ ├── 67.gif │ │ │ │ │ ├── 68.gif │ │ │ │ │ ├── 69.gif │ │ │ │ │ ├── 70.gif │ │ │ │ │ └── 71.gif │ │ │ │ ├── css │ │ │ │ └── modules │ │ │ │ │ ├── laydate │ │ │ │ │ └── icon.png │ │ │ │ │ ├── layer │ │ │ │ │ └── default │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ └── loading-2.gif │ │ │ │ │ └── code.css │ │ │ │ └── lay │ │ │ │ └── modules │ │ │ │ └── util.js │ │ └── WEB-INF │ │ │ └── view │ │ │ ├── taglibs.jsp │ │ │ └── index.jsp │ │ ├── java │ │ └── com │ │ │ └── foxinmy │ │ │ └── weixin4j │ │ │ └── example │ │ │ ├── controller │ │ │ └── IndexController.java │ │ │ └── server │ │ │ └── handler │ │ │ ├── TextMessageHandler.java │ │ │ ├── SubscribeMessageHandler.java │ │ │ ├── VoiceMessageHandler.java │ │ │ └── ChatMessageHandler.java │ │ ├── resources │ │ ├── spring-bean.xml │ │ └── spring-weixin4j-server.xml │ │ └── script │ │ └── assembly.xml └── .gitignore ├── weixin4j-pay └── src │ ├── main │ ├── resources │ │ └── weixin4j.properties │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ └── pay │ │ ├── type │ │ ├── TarType.java │ │ ├── SignType.java │ │ ├── profitsharing │ │ │ ├── ReturnAccountType.java │ │ │ ├── ReceiverType.java │ │ │ └── RelationType.java │ │ ├── ProfitIdType.java │ │ ├── mch │ │ │ ├── RedpacketType.java │ │ │ ├── RefundAccountType.java │ │ │ ├── CorpPaymentCheckNameType.java │ │ │ ├── RedpacketSendType.java │ │ │ ├── RedpacketStatus.java │ │ │ ├── CouponStockType.java │ │ │ ├── BillType.java │ │ │ ├── CouponStatus.java │ │ │ ├── RefundChannel.java │ │ │ ├── RefundStatus.java │ │ │ ├── RefundType.java │ │ │ ├── RedpacketSceneType.java │ │ │ ├── CouponType.java │ │ │ └── CouponStockStatus.java │ │ ├── CredentialType.java │ │ ├── CustomsSatus.java │ │ ├── CurrencyType.java │ │ ├── CustomsCity.java │ │ ├── TradeType.java │ │ ├── TradeState.java │ │ ├── IdType.java │ │ └── IdQuery.java │ │ ├── payment │ │ └── mch │ │ │ ├── SceneInfo.java │ │ │ └── AbstractPayRequest.java │ │ ├── sign │ │ ├── WeixinSignature.java │ │ └── AbstractWeixinSignature.java │ │ └── profitsharing │ │ ├── ProfitId.java │ │ └── ReceiverRequest.java │ └── test │ └── java │ └── com │ └── foxinmy │ └── weixin4j │ └── pay │ └── test │ ├── TestHmacSHA256Sign.java │ └── TestDepositPay.java ├── weixin4j-server ├── src │ └── main │ │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ ├── socket │ │ └── README.md │ │ ├── message │ │ ├── event │ │ │ └── README.md │ │ └── README.md │ │ ├── qy │ │ ├── chat │ │ │ ├── ChatType.java │ │ │ └── ChatEventType.java │ │ ├── suite │ │ │ └── SuiteEventType.java │ │ └── event │ │ │ └── ScribeEventMessage.java │ │ ├── type │ │ ├── AccountType.java │ │ ├── EncryptType.java │ │ └── AgentType.java │ │ ├── response │ │ ├── BlankResponse.java │ │ ├── SingleResponse.java │ │ ├── TextResponse.java │ │ ├── ImageResponse.java │ │ ├── VoiceResponse.java │ │ ├── WeixinResponse.java │ │ └── TransferCustomerResponse.java │ │ ├── dispatcher │ │ ├── BeanFactory.java │ │ └── WeixinMessageMatcher.java │ │ └── mp │ │ ├── component │ │ └── ComponentEventType.java │ │ └── event │ │ └── ScribeEventMessage.java ├── README.md └── .gitignore ├── weixin4j-mp ├── src │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── foxinmy │ │ │ └── weixin4j │ │ │ └── mp │ │ │ ├── type │ │ │ ├── ClientPlatformType.java │ │ │ ├── AutoreplyMode.java │ │ │ ├── AutomatchMode.java │ │ │ ├── ShareSourceType.java │ │ │ ├── KfInviteStatus.java │ │ │ ├── DatacuteCountIntervalType.java │ │ │ ├── UserSourceType.java │ │ │ ├── FaceSize.java │ │ │ ├── KfOnlineStatus.java │ │ │ └── Lang.java │ │ │ ├── api │ │ │ ├── README.md │ │ │ └── MpApi.java │ │ │ └── model │ │ │ └── MenuSetting.java │ └── test │ │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ └── mp │ │ └── test │ │ ├── SemanticTest.java │ │ ├── HelpTest.java │ │ └── WeixinProxyTest.java ├── .gitignore └── README.md ├── weixin4j-qy ├── src │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── foxinmy │ │ │ └── weixin4j │ │ │ └── qy │ │ │ ├── type │ │ │ ├── LoginTargetType.java │ │ │ ├── ChatType.java │ │ │ ├── KfType.java │ │ │ ├── InviteType.java │ │ │ ├── AgentAuthType.java │ │ │ ├── CorpType.java │ │ │ ├── ReportLocationType.java │ │ │ ├── CorporateType.java │ │ │ ├── LoginUserType.java │ │ │ ├── BatchStatus.java │ │ │ ├── UserStatus.java │ │ │ └── BatchType.java │ │ │ ├── api │ │ │ ├── README.md │ │ │ └── QyApi.java │ │ │ └── model │ │ │ └── PrivilegeLevel.java │ └── test │ │ └── java │ │ └── com │ │ └── foxinmy │ │ └── weixin4j │ │ └── qy │ │ └── test │ │ └── HelperTest.java ├── .gitignore └── README.md ├── .gitignore ├── LICENSE ├── src └── site │ └── site.xml ├── maven-version-rules.xml └── assembly.xml /weixin4j-serverX/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /weixin4j-serverX/README.md: -------------------------------------------------------------------------------- 1 | # [接入示例](http://git.oschina.net/zeyu123/weixin4j-with-spring-mvc/tree/master/weixin4j-server-mvc-example) -------------------------------------------------------------------------------- /weixin4j-base/src/main/resources/com/foxinmy/weixin4j/weixin4j.properties: -------------------------------------------------------------------------------- 1 | weixin4j.name=weixin4j 2 | weixin4j.version=${project.version} 3 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/README.md: -------------------------------------------------------------------------------- 1 | * CashApi `现金红包API` 2 | 3 | * CouponApi `优惠券API` 4 | 5 | * PayApi `微信支付API` 6 | 7 | * CustomsApi `报关接口` -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/api/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * APIs. 3 | * 4 | * @since 1.8 5 | */ 6 | package com.foxinmy.weixin4j.wxa.api; 7 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/font/iconfont.eot -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/0.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/1.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/2.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/3.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/4.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/5.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/6.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/7.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/8.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/9.gif -------------------------------------------------------------------------------- /weixin4j-pay/src/main/resources/weixin4j.properties: -------------------------------------------------------------------------------- 1 | # \u914D\u7F6E\u5F53\u4F7F\u7528jdkLogger\u65F6\uFF0C\u65E5\u5FD7\u7684\u7EA7\u522B 2 | # weixin4j.jdkLogger.level=INFO 3 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Models. 3 | * 4 | * @since 1.8 5 | */ 6 | package com.foxinmy.weixin4j.wxa.model; 7 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/font/iconfont.woff -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/10.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/11.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/12.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/13.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/14.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/15.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/16.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/17.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/18.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/19.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/20.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/21.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/22.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/23.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/24.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/25.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/26.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/27.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/28.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/29.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/30.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/31.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/32.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/33.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/34.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/35.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/36.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/37.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/38.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/39.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/40.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/41.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/42.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/43.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/44.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/45.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/46.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/47.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/48.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/49.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/50.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/51.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/52.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/53.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/54.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/55.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/56.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/57.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/58.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/59.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/60.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/61.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/62.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/63.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/64.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/65.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/66.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/67.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/68.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/69.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/70.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/images/face/71.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/laydate/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/laydate/icon.png -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/socket/README.md: -------------------------------------------------------------------------------- 1 | WeixinMessageDecoder:对微信消息解码 2 | 3 | WeixinRequestHandler:微信请求处理类 4 | 5 | WeixinResponseEncoder:对微信回复编码 6 | 7 | SingleResponseEncoder:对微信单一回复编码 -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/socket/README.md: -------------------------------------------------------------------------------- 1 | WeixinMessageDecoder:对微信消息解码 2 | 3 | WeixinRequestHandler:微信请求处理类 4 | 5 | WeixinResponseEncoder:对微信回复编码 6 | 7 | SingleResponseEncoder:对微信单一回复编码 -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/foxinmy/weixin4j/HEAD/weixin4j-example/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/event/README.md: -------------------------------------------------------------------------------- 1 | 菜单事件消息 2 | 3 | 用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。 -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/message/event/README.md: -------------------------------------------------------------------------------- 1 | 菜单事件消息 2 | 3 | 用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。 -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/template/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Models for {@link com.foxinmy.weixin4j.wxa.api.TemplateApi}. 3 | * 4 | * @since 1.8 5 | */ 6 | package com.foxinmy.weixin4j.wxa.model.template; 7 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/custommessage/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Models for {@link com.foxinmy.weixin4j.wxa.api.CustomMessageApi}. 3 | * 4 | * @since 1.8 5 | */ 6 | package com.foxinmy.weixin4j.wxa.model.custommessage; 7 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/subscribemessage/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Models for {@link com.foxinmy.weixin4j.wxa.api.TemplateApi}. 3 | * 4 | * @since 1.8 5 | */ 6 | package com.foxinmy.weixin4j.wxa.model.subscribemessage; 7 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/message/README.md: -------------------------------------------------------------------------------- 1 | 普通消息 2 | ------- 3 | 4 | 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。 5 | 6 | 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 7 | 8 | 关于重试的消息排重,推荐使用msgid排重。 9 | 10 | 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/message/README.md: -------------------------------------------------------------------------------- 1 | 普通消息 2 | ------- 3 | 4 | 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。 5 | 6 | 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 7 | 8 | 关于重试的消息排重,推荐使用msgid排重。 9 | 10 | 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * WeChat Mini Program support library. 4 | * 5 | * @since 1.8 6 | */ 7 | package com.foxinmy.weixin4j.wxa; 8 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/GiftCardOrder.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.model.card; 2 | 3 | /** 4 | * 礼品卡销售订单信息 5 | * 6 | * @author kit (kit.li@qq.com) 7 | */ 8 | public class GiftCardOrder { 9 | private String orderId; 10 | private String pageId; 11 | } 12 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/TarType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 压缩类型 5 | * 6 | * @className TarType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年12月21日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum TarType { 13 | GZIP 14 | } 15 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/SignType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 签名类型 5 | * 6 | * @className SignType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum SignType { 13 | MD5, HMAC$SHA256 14 | } 15 | -------------------------------------------------------------------------------- /weixin4j-base/README.md: -------------------------------------------------------------------------------- 1 | weixin4j-base 2 | ============= 3 | 4 | 微信开发基础工程 5 | -------------- 6 | 7 | 功能列表 8 | ------- 9 | 10 | `Token的实现` 11 | 12 | `通用消息实体` 13 | 14 | `HttpClient的实现` 15 | 16 | `微信支付的实现` 17 | 18 | [如何使用](https://github.com/foxinmy/weixin4j/wiki) 19 | --------- 20 | 21 | [更新LOG](./CHANGE.md) 22 | --------------------- 23 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/SceneInfo.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.payment.mch; 2 | 3 | /** 4 | * 支付场景信息接口 5 | * 6 | * @author kit 7 | * @date 2020年06月03日 8 | */ 9 | public interface SceneInfo { 10 | /** 11 | * 格式化为Json字符串 12 | * 13 | * @return 14 | */ 15 | String toJson(); 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/ClientPlatformType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 平台类型 5 | * 6 | * @className ClientPlatformType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年12月17日 9 | * @since JDK 1.7 10 | * @see 11 | */ 12 | public enum ClientPlatformType { 13 | IOS, Android, Others 14 | } 15 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/TarType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 压缩类型 5 | * 6 | * @className TarType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年12月21日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum TarType { 15 | GZIP 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpMethod.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | /** 4 | * 请求方法 5 | * 6 | * @className HttpMethod 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月29日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum HttpMethod { 13 | GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE, CONNECT 14 | } 15 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/WEB-INF/view/taglibs.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 3 | <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 4 | 5 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/spring/TokenGenerater.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.spring; 2 | 3 | import com.zone.weixin4j.util.AesToken; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by Yz on 2017/3/15. 9 | * 生成Token 10 | */ 11 | public abstract class TokenGenerater { 12 | 13 | abstract public List getAesTokens(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/SignType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 签名类型 5 | * 6 | * @className SignType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月5日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum SignType { 15 | SHA1, MD5, HMAC$SHA256 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/LoginTargetType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 登录跳转到企业号后台的目标页面 5 | * 6 | * @className LoginTargetType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年12月30日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum LoginTargetType { 13 | agent_setting, send_msg, contact, third_admin 14 | } 15 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/ChatType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 会话类型 5 | * 6 | * @className ChatType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年7月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ChatType { 13 | /** 14 | * 单聊 15 | */ 16 | single, 17 | /** 18 | * 群聊 19 | */ 20 | group 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/qy/chat/ChatType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.qy.chat; 2 | 3 | /** 4 | * 会话类型 5 | * 6 | * @className ChatType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年7月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ChatType { 13 | /** 14 | * 单聊 15 | */ 16 | single, 17 | /** 18 | * 群聊 19 | */ 20 | group 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/type/AccountType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.type; 2 | 3 | /** 4 | * 账号类型 5 | * 6 | * @className AccountType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月18日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AccountType { 13 | /** 14 | * 公众号 15 | */ 16 | MP, 17 | /** 18 | * 企业号 19 | */ 20 | QY 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/SubCardType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 礼品卡类型 5 | * 6 | * @className SubCardType 7 | * @author kit(kit.li@qq.com) 8 | * @date 2018年10月23日 9 | */ 10 | public enum SubCardType { 11 | /** 12 | * 礼品卡 13 | */ 14 | GIFT_CARD, 15 | /** 16 | * 兑换卡 17 | */ 18 | VOUCHER 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/profitsharing/ReturnAccountType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.profitsharing; 2 | 3 | /** 4 | * 分帐回退的回退方类型 5 | * 6 | * @author kit 7 | * @date 2020年05月25日 8 | * @since weixin4j-pay 1.1.0 9 | */ 10 | public enum ReturnAccountType { 11 | /** 12 | * 商户ID 13 | * 目前仅支付商户接收方的回退 14 | */ 15 | MERCHANT_ID 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/KfType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 客服类型 5 | * 6 | * @className KfType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年1月23日 9 | * @since JDK 1.7 10 | * @see 11 | */ 12 | public enum KfType { 13 | /** 14 | * 内部客服 15 | */ 16 | internal, 17 | /** 18 | * 外部客服 19 | */ 20 | external 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/chat/ChatType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.chat; 2 | 3 | /** 4 | * 会话类型 5 | * 6 | * @className ChatType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年7月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ChatType { 13 | /** 14 | * 单聊 15 | */ 16 | single, 17 | /** 18 | * 群聊 19 | */ 20 | group 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/AccountType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 账号类型 5 | * 6 | * @className AccountType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月18日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AccountType { 13 | /** 14 | * 公众号 15 | */ 16 | MP, 17 | /** 18 | * 企业号 19 | */ 20 | QY 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/type/EncryptType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.type; 2 | 3 | /** 4 | * 消息加密类型 5 | * 6 | * @className EncryptType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月23日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum EncryptType { 13 | /** 14 | * 明文模式 15 | */ 16 | RAW, 17 | /** 18 | * 密文模式 19 | */ 20 | AES; 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/InviteType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 邀请类型 5 | * 6 | * @className InviteType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年1月15日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum InviteType { 13 | /** 14 | * 微信邀请 15 | */ 16 | WEIXIN, 17 | /** 18 | * 邮件邀请 19 | */ 20 | EMAIL 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/EncryptType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 消息加密类型 5 | * 6 | * @className EncryptType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月23日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum EncryptType { 13 | /** 14 | * 明文模式 15 | */ 16 | RAW, 17 | /** 18 | * 密文模式 19 | */ 20 | AES; 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/resources/com/foxinmy/weixin4j/wxa/api/TemplateList.json: -------------------------------------------------------------------------------- 1 | { 2 | "errcode": 0, 3 | "errmsg": "ok", 4 | "list": [ 5 | { 6 | "template_id": "wDYzYZVxobJivW9oMpSCpuvACOfJXQIoKUm0PY397Tc", 7 | "title": "购买成功通知", 8 | "content": "购买地点{{keyword1.DATA}}\n购买时间{{keyword2.DATA}}\n物品名称{{keyword3.DATA}}\n", 9 | "example": "购买地点:TIT造舰厂\n购买时间:2016年6月6日\n物品名称:咖啡\n" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateFormFieldType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 激活form表单字段类型 5 | * 6 | * @auther: Feng Yapeng 7 | * @since: 2016/12/20 15:34 8 | */ 9 | public enum ActivateFormFieldType { 10 | 11 | FORM_FIELD_RADIO,/*自定义单选 */ 12 | 13 | FORM_FIELD_SELECT,/*自定义选择项 */ 14 | 15 | FORM_FIELD_CHECK_BOX,/*自定义多选*/; 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/ProfitIdType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 分帐单号类型 5 | * 6 | * @author kit (kit.li@qq.com) 7 | * @date 2020年05月25日 8 | * @since weixin4j-pay 1.1.0 9 | */ 10 | public enum ProfitIdType { 11 | /** 12 | * 微信分帐单号 13 | */ 14 | ORDER_ID, 15 | /** 16 | * 商户分帐单号 17 | */ 18 | OUT_ORDER_NO 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/AgentAuthType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 管理员对应用的权限 5 | * 6 | * @className AgentAuthType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月12日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AgentAuthType { 13 | /** 14 | * 使用权限 15 | */ 16 | USE, 17 | /** 18 | * 管理权限 19 | */ 20 | MANAGE 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RedpacketType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 红包类型 5 | * 6 | * @className RedpacketType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月4日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum RedpacketType { 13 | /** 14 | * 裂变红包 15 | */ 16 | GROUP, 17 | /** 18 | * 普通红包 19 | */ 20 | NORMAL; 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/Gender.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 用户性别 5 | * 6 | * @className Gender 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum Gender { 13 | /** 14 | * 男 15 | */ 16 | male, 17 | /** 18 | * 女 19 | */ 20 | female, 21 | /** 22 | * 未知 23 | */ 24 | unknown; 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/AutoreplyMode.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 自动回复模式 5 | * 6 | * @className AutoreplyMode 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年4月15日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AutoreplyMode { 13 | /** 14 | * 代表全部回复 15 | */ 16 | reply_all, 17 | /** 18 | * 代表随机回复其中一条 19 | */ 20 | random_one 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/AutomatchMode.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 自动匹配模式 5 | * 6 | * @className AutomatchMode 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年4月15日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AutomatchMode { 13 | /** 14 | * 代表消息中含有该关键词即可 15 | */ 16 | contain, 17 | /** 18 | * 表示消息内容必须和关键词严格相同 19 | */ 20 | equal 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/UserCardStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 用户的会员卡状态 5 | * 6 | * @auther: Feng Yapeng 7 | * @since: 2016/12/21 11:42 8 | */ 9 | public enum UserCardStatus { 10 | 11 | NORMAL,//正常 12 | EXPIRE,//已过期 13 | GIFTING,// 转赠中 14 | GIFT_SUCC,// 转赠成功 15 | GIFT_TIMEOUT,// 转赠超时 16 | DELETE,//已删除 17 | UNAVAILABLE,//已失效 18 | ; 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/util/ConstsTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.util; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertFalse; 5 | 6 | import org.junit.Test; 7 | 8 | public class ConstsTest { 9 | 10 | @Test 11 | public void test() { 12 | assertEquals("weixin4j", Consts.WEIXIN4J); 13 | assertFalse(Consts.VERSION.equals("${project.version}")); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/CorpType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 授权方企业号类型 5 | * 6 | * @className CorpType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月12日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CorpType { 13 | /** 14 | * 认证号 15 | */ 16 | verified, 17 | /** 18 | * 注册号 19 | */ 20 | unverified, 21 | /** 22 | * 体验号 23 | */ 24 | test; 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/ChatTuple.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | /** 4 | * 企业号会话消息元件 5 | * 6 | * @className ChatTuple 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月1日 9 | * @since JDK 1.6 10 | * @see com.foxinmy.weixin4j.tuple.Text 11 | * @see com.foxinmy.weixin4j.tuple.Image 12 | * @see com.foxinmy.weixin4j.tuple.File 13 | */ 14 | public interface ChatTuple extends Tuple { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RefundAccountType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 退款资金来源 5 | * @className RefundAccountType 6 | * @author jinyu(foxinmy@gmail.com) 7 | * @date 2016年12月12日 8 | */ 9 | public enum RefundAccountType { 10 | /** 11 | * ---未结算资金退款(默认使用未结算资金退款) 12 | */ 13 | REFUND_SOURCE_UNSETTLED_FUNDS, 14 | /** 15 | * ---可用余额退款 16 | */ 17 | REFUND_SOURCE_RECHARGE_FUNDS 18 | } 19 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/README.md: -------------------------------------------------------------------------------- 1 | * AgentApi `应用设置API` 2 | 3 | * BatchApi `批量任务API` 4 | 5 | * ChatApi `会话服务API` 6 | 7 | * Helper `辅助API` 8 | 9 | * MediaApi `媒体素材API` 10 | 11 | * MenuApi `菜单管理API` 12 | 13 | * NotifyApi `消息发送API` 14 | 15 | * OauthApi `oauth授权登陆API` 16 | 17 | * PartyApi `部门管理API` 18 | 19 | * ProviderApi `服务商API` 20 | 21 | * SuiteApi `第三方应用API` 22 | 23 | * TagApi `标签管理API` 24 | 25 | * UserApi `成员管理API` 26 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/model/custommessage/CommandTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.custommessage; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | public class CommandTest { 8 | 9 | @Test 10 | public void testToString() { 11 | assertEquals("Typing", Command.TYPING.toString()); 12 | assertEquals("CancelTyping", Command.CANCEL_TYPING.toString()); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/README.md: -------------------------------------------------------------------------------- 1 | 不同的消息类型中的消息对象 2 | 3 | [被动消息](http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html) 4 | 5 | [客服消息](http://mp.weixin.qq.com/wiki/1/70a29afed17f56d537c833f89be979c9.html#.E5.AE.A2.E6.9C.8D.E6.8E.A5.E5.8F.A3-.E5.8F.91.E6.B6.88.E6.81.AF) 6 | 7 | [群发消息](http://mp.weixin.qq.com/wiki/15/5380a4e6f02f2ffdc7981a8ed7a40753.html) 8 | 9 | [模板消息](http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html) -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/TicketType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 票据类型(一般用于JSSDK 5 | * 6 | * @className TicketType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年12月25日 9 | * @since JDK 1.7 10 | * @see 11 | */ 12 | public enum TicketType { 13 | /** 14 | * jsapi 15 | */ 16 | jsapi, 17 | /** 18 | * 公众平台-卡券 19 | */ 20 | wx_card, 21 | /** 22 | * 企业号-选取联系人 23 | */ 24 | contact; 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 红包类型 5 | * 6 | * @className RedpacketType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月4日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum RedpacketType { 15 | /** 16 | * 裂变红包 17 | */ 18 | GROUP, 19 | /** 20 | * 普通红包 21 | */ 22 | NORMAL; 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-server/README.md: -------------------------------------------------------------------------------- 1 | weixin4j-server 2 | =============== 3 | 4 | [微信回调消息](http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html)服务器 5 | ---------------- 6 | based on netty. 7 | 8 | 功能列表 9 | ------- 10 | * `netty服务器` 11 | 12 | * `消息分发` 13 | 14 | * `消息拦截`(还需更多测试 15 | 16 | [如何使用](https://github.com/foxinmy/weixin4j/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Server) 17 | ------------- 18 | 19 | [更新LOG](./CHANGE.md) 20 | ---------------------- -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/api/MchApiTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.api; 2 | 3 | import static org.junit.Assert.assertNotNull; 4 | 5 | import org.junit.Test; 6 | 7 | import com.foxinmy.weixin4j.model.WeixinPayAccount; 8 | 9 | public class MchApiTest { 10 | 11 | @Test 12 | public void testWeixinBundle() { 13 | MchApi mchApi = new MchApi(new WeixinPayAccount(null, null, null)); 14 | assertNotNull(mchApi.weixinBundle()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/ReportLocationType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 上报策略 5 | * 6 | * @className ReportLocationType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月16日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ReportLocationType { 13 | /** 14 | * 不上报 15 | */ 16 | NOT, 17 | /** 18 | * 进入回话上报 19 | */ 20 | DIALOG, 21 | /** 22 | * 持续上报 23 | */ 24 | PERSIST; 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/resources/com/foxinmy/weixin4j/wxa/api/Template.json: -------------------------------------------------------------------------------- 1 | { 2 | "errcode": 0, 3 | "errmsg": "ok", 4 | "id": "AT0002", 5 | "title": "购买成功通知", 6 | "keyword_list": [ 7 | { 8 | "keyword_id": 3, 9 | "name": "购买地点", 10 | "example": "TIT造舰厂" 11 | }, 12 | { 13 | "keyword_id": 4, 14 | "name": "购买时间", 15 | "example": "2016年6月6日" 16 | }, 17 | { 18 | "keyword_id": 5, 19 | "name": "物品名称", 20 | "example": "咖啡" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/README.md: -------------------------------------------------------------------------------- 1 | ### CACHE的实现 2 | 3 | * CacheCreator 负责创建新的缓存对象 4 | 5 | * CacheStorager 负责查找已缓存的对象或者缓存新的对象 6 | 7 | * TokenManager 负责对缓存对象的管理(屏蔽细节) 8 | 9 | * FileCacheStorager 是系统默认的缓存存储策略实现 10 | 11 | * Redis(Cluster)CacheStorager 使用redis保存缓存对象(需要自行添加客户端包,[jedis](https://github.com/xetorthio/jedis)) 12 | 13 | * MemcacheCacheStorager 使用memcache保存缓存对象(需要自行添加客户端包,[Memcached-Java-Client](https://github.com/gwhalin/Memcached-Java-Client)) 14 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/type/AgentType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.type; 2 | 3 | /** 4 | * 应用类型 5 | * 6 | * @className AgentType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AgentType { 13 | /** 14 | * 聊天应用 15 | */ 16 | chat, 17 | // 企业客服回调 18 | /** 19 | * 企业号内部客服,客户为企业号通讯录成员 20 | */ 21 | kf_internal, 22 | /** 23 | * 企业号外部客服,客户为服务号openid 24 | */ 25 | kf_external 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/CorpPaymentCheckNameType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 企业付款检查收款人姓名的策略 5 | * 6 | * @className CorpPaymentCheckNameType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年4月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CorpPaymentCheckNameType { 13 | /** 14 | * 不校验真实姓名 15 | */ 16 | NO_CHECK, 17 | /** 18 | * 强校验真实姓名(未实名认证的用户会校验失败,无法转账) 19 | */ 20 | FORCE_CHECK 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RedpacketSendType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 红包发放类型 5 | * 6 | * @className RedpacketSendType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月4日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum RedpacketSendType { 13 | /** 14 | * 通过API接口发放 15 | */ 16 | API, 17 | /** 18 | * 通过上传文件方式发放 19 | */ 20 | UPLOAD, 21 | /** 22 | * 通过活动方式发放 23 | */ 24 | ACTIVITY; 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/type/AgentType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 应用类型 5 | * 6 | * @className AgentType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum AgentType { 13 | /** 14 | * 聊天应用 15 | */ 16 | chat, 17 | // 企业客服回调 18 | /** 19 | * 企业号内部客服,客户为企业号通讯录成员 20 | */ 21 | kf_internal, 22 | /** 23 | * 企业号外部客服,客户为服务号openid 24 | */ 25 | kf_external 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/BlankResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | /** 4 | * 空白回复(避免微信服务器重复推送消息) 5 | * 6 | * @className BlankResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月7日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class BlankResponse extends SingleResponse { 13 | 14 | public static final BlankResponse global = new BlankResponse(); 15 | 16 | private BlankResponse() { 17 | super("success"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpMessage.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | /** 4 | * HTTP messages consist of requests from client to server and responses from 5 | * server to client. 6 | * 7 | * @className HttpMessage 8 | * @author jinyu(foxinmy@gmail.com) 9 | * @date 2015年5月29日 10 | * @since JDK 1.6 11 | * @see 12 | */ 13 | public interface HttpMessage { 14 | /** 15 | * HTTP报头 16 | * 17 | * @return 18 | */ 19 | HttpHeaders getHeaders(); 20 | } 21 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/CorporateType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 企业类型 5 | * 6 | * @className CorporateType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月12日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CorporateType { 13 | /** 14 | * 企业 15 | */ 16 | CORP, 17 | /** 18 | * 政府以及事业单位 19 | */ 20 | GOVINS, 21 | /** 22 | * 其他组织 23 | */ 24 | OTHER, 25 | /** 26 | * 团队号 27 | */ 28 | TEAM; 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/BlankResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | /** 4 | * 空白回复(避免微信服务器重复推送消息) 5 | * 6 | * @className BlankResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月7日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class BlankResponse extends SingleResponse { 13 | 14 | public static final BlankResponse global = new BlankResponse(); 15 | 16 | private BlankResponse() { 17 | super("success"); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RefundAccountType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 退款资金来源 5 | * @className RefundAccountType 6 | * @author jinyu(foxinmy@gmail.com) 7 | * @date 2016年12月12日 8 | * @deprecated 迁移到子模块weixin4j-pay 9 | */ 10 | @Deprecated 11 | public enum RefundAccountType { 12 | /** 13 | * ---未结算资金退款(默认使用未结算资金退款) 14 | */ 15 | REFUND_SOURCE_UNSETTLED_FUNDS, 16 | /** 17 | * ---可用余额退款 18 | */ 19 | REFUND_SOURCE_RECHARGE_FUNDS 20 | } 21 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/CredentialType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 证件类型 5 | * 6 | * @className CredentialType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CredentialType { 13 | IDCARD("身份证"); 14 | CredentialType(String name) { 15 | this.name = name; 16 | } 17 | 18 | private String name; 19 | 20 | public String getName() { 21 | return this.name; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/resources/com/foxinmy/weixin4j/wxa/api/TemplateListInLibrary.json: -------------------------------------------------------------------------------- 1 | { 2 | "errcode": 0, 3 | "errmsg": "ok", 4 | "list": [ 5 | { 6 | "id": "AT0002", 7 | "title": "购买成功通知" 8 | }, 9 | { 10 | "id": "AT0003", 11 | "title": "购买失败通知" 12 | }, 13 | { 14 | "id": "AT0004", 15 | "title": "交易提醒" 16 | }, 17 | { 18 | "id": "AT0005", 19 | "title": "付款成功通知" 20 | }, 21 | { 22 | "id": "AT0006", 23 | "title": "付款失败通知" 24 | } 25 | ], 26 | "total_count": 599 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/entity/HttpEntity.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http.entity; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.io.OutputStream; 6 | 7 | import com.foxinmy.weixin4j.http.ContentType; 8 | 9 | public interface HttpEntity { 10 | 11 | ContentType getContentType(); 12 | 13 | long getContentLength(); 14 | 15 | InputStream getContent() throws IOException; 16 | 17 | void writeTo(OutputStream outstream) throws IOException; 18 | } 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | .settings/ 16 | .project 17 | .classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/ 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | weixin4j-future 33 | .DS_Store 34 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/ShareSourceType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 分享的场景 5 | * 6 | * @className ShareSourceType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年1月30日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ShareSourceType { 13 | /** 14 | * 好友转发 15 | */ 16 | FRIENDFORWARD, 17 | /** 18 | * 朋友圈 19 | */ 20 | FRIENDSCIRCLE, 21 | /** 22 | * 腾讯微博 23 | */ 24 | TENCENTWEIBO, 25 | /** 26 | * 其它 27 | */ 28 | OTHER; 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/Tuple.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | import java.io.Serializable; 4 | 5 | import javax.xml.bind.annotation.XmlTransient; 6 | 7 | /** 8 | * 消息元件 9 | * 10 | * @className Tuple 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2015年4月19日 13 | * @since JDK 1.6 14 | * @see 15 | */ 16 | public interface Tuple extends Serializable { 17 | 18 | /** 19 | * 消息类型 20 | * 21 | * @return 22 | */ 23 | @XmlTransient 24 | public String getMessageType(); 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/Week.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 星期 5 | * 6 | * @className Week 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年8月5日 9 | * @since JDK 1.6 10 | */ 11 | public enum Week { 12 | MONDAY("周一"), TUESDAY("周二"), WEDNESDAY("周三"), THURSDAY("周四"), FRIDAY("周五"), SATURDAY( 13 | "周六"), SUNDAY("周日"); 14 | private String desc; 15 | 16 | Week(String desc) { 17 | this.desc = desc; 18 | } 19 | 20 | public String getDesc() { 21 | return desc; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSendType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 红包发放类型 5 | * 6 | * @className RedpacketSendType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月4日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum RedpacketSendType { 15 | /** 16 | * 通过API接口发放 17 | */ 18 | API, 19 | /** 20 | * 通过上传文件方式发放 21 | */ 22 | UPLOAD, 23 | /** 24 | * 通过活动方式发放 25 | */ 26 | ACTIVITY; 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-mp/.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | *.settings/* 16 | /.project 17 | /.classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/* 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | .DS_Store 33 | /target/ 34 | /target/ 35 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/KfInviteStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 多客服邀请状态 5 | * 6 | * @className KfInviteStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月16日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum KfInviteStatus { 13 | WAITING("等待确认"), REJECTED("被拒绝"), EXPIRED("已过期"); 14 | private String desc; 15 | 16 | KfInviteStatus(String desc) { 17 | this.desc = desc; 18 | } 19 | 20 | public String getDesc() { 21 | return desc; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-qy/.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | *.settings/* 16 | /.project 17 | /.classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/* 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | .DS_Store 33 | /target/ 34 | /target/ 35 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/BeanFactory.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.dispatcher; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Bean构造 7 | * 8 | * @className BeanFactory 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2015年5月7日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public interface BeanFactory { 15 | Object getBean(String name); 16 | 17 | T getBean(Class clazz); 18 | 19 | T getBean(String name, Class clazz); 20 | 21 | Map getBeans(Class clazz); 22 | } 23 | -------------------------------------------------------------------------------- /weixin4j-base/.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | *.settings/* 16 | /.project 17 | /.classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/* 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | .DS_Store 33 | /target/ 34 | /target/ 35 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/DatacuteCountIntervalType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 消息量分布的区间 5 | * 6 | * @className DatacuteCountIntervalType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月29日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum DatacuteCountIntervalType { 13 | /** 14 | * 0 15 | */ 16 | ZERO, 17 | /** 18 | * 1-5 19 | */ 20 | ONE2FIVE, 21 | /** 22 | * 6-10 23 | */ 24 | SIX2TEN, 25 | /** 26 | * 10次以上 27 | */ 28 | MORE_THAN_TEN 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/CredentialType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 证件类型 5 | * 6 | * @className CredentialType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CredentialType { 15 | IDCARD("身份证"); 16 | CredentialType(String name) { 17 | this.name = name; 18 | } 19 | 20 | private String name; 21 | 22 | public String getName() { 23 | return this.name; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RedpacketStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 红包状态 5 | * @className RedpacketStatus 6 | * @author jinyu(foxinmy@gmail.com) 7 | * @date 2015年6月4日 8 | * @since JDK 1.6 9 | * @see 10 | */ 11 | public enum RedpacketStatus { 12 | /** 13 | * 发放中 14 | */ 15 | SENDING, 16 | /** 17 | * 已发放待领取 18 | */ 19 | SENT, 20 | /** 21 | * 发放失败 22 | */ 23 | FAILED, 24 | /** 25 | * 已领取 26 | */ 27 | RECEIVED, 28 | /** 29 | * 已退款 30 | */ 31 | REFUND; 32 | } 33 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/mp/component/ComponentEventType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.mp.component; 2 | 3 | /** 4 | * 应用组件回调事件 5 | * 6 | * @className ComponentEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年7月5日 9 | * @since JDK 1.6 10 | */ 11 | public enum ComponentEventType { 12 | /** 13 | * 推送ticket 14 | */ 15 | component_verify_ticket, 16 | /** 17 | * 取消授权 18 | */ 19 | unauthorized, 20 | /** 21 | * 授权成功 22 | */ 23 | authorized, 24 | /** 25 | * 授权更新 26 | */ 27 | updateauthorized 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/component/ComponentEventType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.component; 2 | 3 | /** 4 | * 应用组件回调事件 5 | * 6 | * @className ComponentEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年7月5日 9 | * @since JDK 1.6 10 | */ 11 | public enum ComponentEventType { 12 | /** 13 | * 推送ticket 14 | */ 15 | component_verify_ticket, 16 | /** 17 | * 取消授权 18 | */ 19 | unauthorized, 20 | /** 21 | * 授权成功 22 | */ 23 | authorized, 24 | /** 25 | * 授权更新 26 | */ 27 | updateauthorized 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/README.md: -------------------------------------------------------------------------------- 1 | * CustomApi `多客服API` 2 | 3 | * DataApi `数据统计API` 4 | 5 | * GroupApi `分组管理API` 6 | 7 | * HelperApi `辅助API` 8 | 9 | * MassApi `群发消息API` 10 | 11 | * MediaApi `上传/下载媒体文件API` 12 | 13 | * MenuApi `底部菜单API` 14 | 15 | * NotifyApi `客服消息API` 16 | 17 | * OauthApi `oauth授权API` 18 | 19 | * Pay2Api `原V2支付API` 20 | 21 | * QrApi `二维码API` 22 | 23 | * TmplApi `模板消息API` 24 | 25 | * UserApi `用户管理API` 26 | 27 | * TagApi `用户标签管理API` 28 | 29 | * ComponentApi `第三方组件API` 30 | 31 | * CardApi `卡券API` 32 | 33 | * CommentApi `评论API` -------------------------------------------------------------------------------- /weixin4j-server/.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | *.settings/* 16 | /.project 17 | /.classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/* 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | .DS_Store 33 | /target/ 34 | -------------------------------------------------------------------------------- /weixin4j-example/.gitignore: -------------------------------------------------------------------------------- 1 | # Mobile Tools for Java (J2ME) 2 | .mtj.tmp/ 3 | 4 | # Package Files # 5 | *.jar 6 | *.war 7 | *.ear 8 | 9 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 10 | hs_err_pid* 11 | 12 | *~ 13 | 14 | # eclipse ignore 15 | *.settings/* 16 | /.project 17 | /.classpath 18 | /.tomcatplugin 19 | 20 | # idea ignore 21 | /.idea 22 | *.iml 23 | 24 | # maven ignore 25 | target/* 26 | 27 | # other ignore 28 | *.log 29 | *.tmp 30 | Thumbs.db 31 | /target/ 32 | .DS_Store 33 | bin 34 | /target/ 35 | /target/ 36 | /target/ 37 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/LoginUserType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 成员登录类型 5 | * 6 | * @className LoginUserType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年11月4日 9 | * @since JDK 1.6 10 | */ 11 | public enum LoginUserType { 12 | /** 13 | * 企业号创建者 14 | */ 15 | CREATOR, 16 | /** 17 | * 企业号内部系统管理员 18 | */ 19 | INNERADMIN, 20 | /** 21 | * 企业号外部系统管理员 22 | */ 23 | OUTTERADMIN, 24 | /** 25 | * 企业号分级管理员 26 | */ 27 | LEVELADMIN, 28 | /** 29 | * 企业号成员 30 | */ 31 | MEMBER; 32 | } 33 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/qy/chat/ChatEventType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.qy.chat; 2 | 3 | /** 4 | * 会话事件 5 | * 6 | * @className ChatEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ChatEventType { 13 | /** 14 | * 创建会话 15 | */ 16 | create_chat, 17 | /** 18 | * 修改会话 19 | */ 20 | update_chat, 21 | /** 22 | * 退出会话 23 | */ 24 | quit_chat, 25 | /** 26 | * 订阅事件 27 | */ 28 | subscribe, 29 | /** 30 | * 取消订阅事件 31 | */ 32 | unsubscribe; 33 | } 34 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/api/AddTemplateParameterTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | import com.alibaba.fastjson.JSON; 8 | 9 | public class AddTemplateParameterTest { 10 | 11 | @Test 12 | public void test() { 13 | AddTemplateParameter param = new AddTemplateParameter("AT0002", new int[] { 3, 4, 5 }); 14 | String json = JSON.toJSONString(param); 15 | assertEquals("{\"id\":\"AT0002\",\"keyword_id_list\":[3,4,5]}", json); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/api/WxaQrCodeParameterTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import org.junit.Test; 6 | 7 | import com.alibaba.fastjson.JSON; 8 | 9 | public class WxaQrCodeParameterTest { 10 | 11 | @Test 12 | public void test() { 13 | WxaQrCodeParameter param = new WxaQrCodeParameter("myPath", 100); 14 | String json = JSON.toJSONString(param); 15 | assertTrue(json.contains("\"path\":\"myPath\"")); 16 | assertTrue(json.contains("\"width\":100")); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/chat/ChatEventType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.chat; 2 | 3 | /** 4 | * 会话事件 5 | * 6 | * @className ChatEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum ChatEventType { 13 | /** 14 | * 创建会话 15 | */ 16 | create_chat, 17 | /** 18 | * 修改会话 19 | */ 20 | update_chat, 21 | /** 22 | * 退出会话 23 | */ 24 | quit_chat, 25 | /** 26 | * 订阅事件 27 | */ 28 | subscribe, 29 | /** 30 | * 取消订阅事件 31 | */ 32 | unsubscribe; 33 | } 34 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/CouponStockType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 代金券批次类型 5 | * 6 | * @className CouponStockType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CouponStockType { 13 | /** 14 | * 批量型 15 | */ 16 | BATCH(1), 17 | /** 18 | * 触发型 19 | */ 20 | TRIGGER(2); 21 | private int val; 22 | 23 | CouponStockType(int val) { 24 | this.val = val; 25 | } 26 | 27 | public int getVal() { 28 | return val; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/MassTuple.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | 4 | /** 5 | * 群发消息元件 6 | * 7 | * @className MassTuple 8 | * @author jinyu(foxinmy@gmail.com) 9 | * @date 2014年11月22日 10 | * @since JDK 1.6 11 | * @see com.foxinmy.weixin4j.tuple.Text 12 | * @see com.foxinmy.weixin4j.tuple.Image 13 | * @see com.foxinmy.weixin4j.tuple.Voice 14 | * @see com.foxinmy.weixin4j.tuple.MpVideo 15 | * @see com.foxinmy.weixin4j.tuple.MpNews 16 | * @see com.foxinmy.weixin4j.tuple.Card 17 | */ 18 | public interface MassTuple extends Tuple { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/Cacheable.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.cache; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 可缓存的对象 7 | * 8 | * @className Cacheable 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年5月26日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public interface Cacheable extends Serializable { 15 | /** 16 | * 过期时间(单位:毫秒),值小于0时视为永不过期 17 | * 18 | * @return 缓存过期时间 19 | */ 20 | public long getExpires(); 21 | 22 | /** 23 | * 创建时间(单位:毫秒) 24 | * 25 | * @return 缓存对象创建时间 26 | */ 27 | public long getCreateTime(); 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/CustomsSatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 报关状态 5 | * 6 | * @className CustomsSatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CustomsSatus { 13 | UNDECLARED("未申报"), SUBMITTED("申报已提交"), PROCESSING("申报中"), SUCCESS("申报成功"), FAIL( 14 | "申报失败"), EXCEPT("海关接口异常"); 15 | private String sate; 16 | 17 | CustomsSatus(String sate) { 18 | this.sate = sate; 19 | } 20 | 21 | public String getSate() { 22 | return this.sate; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/BillType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 对账单类型 5 | * 6 | * @className BillType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年10月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum BillType { 13 | /** 14 | * 全部 15 | */ 16 | ALL(0), 17 | /** 18 | * 成功订单 19 | */ 20 | SUCCESS(1), 21 | /** 22 | * 退款订单 23 | */ 24 | REFUND(2); 25 | private int val; 26 | 27 | BillType(int val) { 28 | this.val = val; 29 | } 30 | 31 | public int getVal() { 32 | return val; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/custommessage/Text.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.custommessage; 2 | 3 | import com.alibaba.fastjson.annotation.JSONField; 4 | 5 | /** 6 | * 文本消息。 7 | * 8 | * @since 1.8 9 | */ 10 | public class Text extends com.foxinmy.weixin4j.tuple.Text { 11 | 12 | private static final long serialVersionUID = 2018052901L; 13 | 14 | public Text(String content) { 15 | super(content); 16 | } 17 | 18 | @Override 19 | @JSONField(serialize = false) 20 | public String getMessageType() { 21 | return super.getMessageType(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 红包状态 5 | * @className RedpacketStatus 6 | * @author jinyu(foxinmy@gmail.com) 7 | * @date 2015年6月4日 8 | * @since JDK 1.6 9 | * @see 10 | * @deprecated 迁移到子模块weixin4j-pay 11 | */ 12 | @Deprecated 13 | public enum RedpacketStatus { 14 | /** 15 | * 发放中 16 | */ 17 | SENDING, 18 | /** 19 | * 已发放待领取 20 | */ 21 | SENT, 22 | /** 23 | * 发放失败 24 | */ 25 | FAILED, 26 | /** 27 | * 已领取 28 | */ 29 | RECEIVED, 30 | /** 31 | * 已退款 32 | */ 33 | REFUND; 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/ListWrapper.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.xml; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | import javax.xml.bind.annotation.XmlAnyElement; 8 | 9 | public class ListWrapper implements Serializable { 10 | 11 | private static final long serialVersionUID = 7550802632983954221L; 12 | 13 | private List items; 14 | 15 | public ListWrapper() { 16 | items = new ArrayList(); 17 | } 18 | 19 | @XmlAnyElement(lax = true) 20 | public List getItems() { 21 | return items; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/controller/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.example.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | import com.foxinmy.weixin4j.mp.WeixinProxy; 8 | 9 | @Controller 10 | @RequestMapping("") 11 | public class IndexController { 12 | @Autowired 13 | private WeixinProxy weixinProxy; 14 | 15 | @RequestMapping 16 | public String index() { 17 | return "index"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/BatchStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 异步任务的状态 5 | * 6 | * @className BatchStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum BatchStatus { 13 | /** 14 | * 开始 15 | */ 16 | START(1), 17 | /** 18 | * 进行中 19 | */ 20 | PROCESS(2), 21 | /** 22 | * 完成 23 | */ 24 | DONE(3); 25 | private int code; 26 | 27 | BatchStatus(int code) { 28 | this.code = code; 29 | } 30 | 31 | public int getCode() { 32 | return code; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/custommessage/Image.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.custommessage; 2 | 3 | import com.alibaba.fastjson.annotation.JSONField; 4 | 5 | /** 6 | * 图片消息。 7 | * 8 | * @since 1.8 9 | */ 10 | public class Image extends com.foxinmy.weixin4j.tuple.Image { 11 | 12 | private static final long serialVersionUID = 2018052901L; 13 | 14 | public Image(String mediaId) { 15 | super(mediaId); 16 | } 17 | 18 | @Override 19 | @JSONField(serialize = false) 20 | public String getMessageType() { 21 | return super.getMessageType(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/CorpPaymentCheckNameType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 企业付款检查收款人姓名的策略 5 | * 6 | * @className CorpPaymentCheckNameType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年4月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | @Deprecated 13 | public enum CorpPaymentCheckNameType { 14 | /** 15 | * 不校验真实姓名 16 | */ 17 | NO_CHECK, 18 | /** 19 | * 强校验真实姓名(未实名认证的用户会校验失败,无法转账) 20 | */ 21 | FORCE_CHECK, 22 | /** 23 | * 针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) 24 | */ 25 | OPTION_CHECK; 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/annotation/WxMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.annotation; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by Yz on 2017/3/13. 11 | * WxMessageHandler 12 | * WxMessageHandler 注解声明处理消息内容的类 13 | */ 14 | @Target({java.lang.annotation.ElementType.TYPE}) 15 | @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) 16 | @Documented 17 | @Component 18 | public @interface WxMessageHandler { 19 | } 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The Apache License 2 | 3 | Copyright (c) 2014 jinyu 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/SimpleHttpTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.factory.SimpleHttpClientFactory; 5 | 6 | /** 7 | * SimpleClient for test 8 | * @className SimpleHttpTest 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年7月28日 11 | * @since JDK 1.6 12 | */ 13 | public class SimpleHttpTest extends HttpClientTest { 14 | 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new SimpleHttpClientFactory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/CouponStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 代金券状态 5 | * 6 | * @className CouponStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CouponStatus { 13 | /** 14 | * 已激活 15 | */ 16 | ACTIVATED(2), 17 | /** 18 | * 已锁定 19 | */ 20 | LOCKED(4), 21 | /** 22 | * 已实扣 23 | */ 24 | USED(8); 25 | private int val; 26 | 27 | CouponStatus(int val) { 28 | this.val = val; 29 | } 30 | 31 | public int getVal() { 32 | return val; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/profitsharing/ReceiverType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.profitsharing; 2 | 3 | /** 4 | * 分帐接收方类型 5 | * 6 | * @author kit (kit.li@qq.com) 7 | * @date 2020年05月20日 8 | * @since weixin4j-pay 1.1.0 9 | */ 10 | public enum ReceiverType { 11 | /** 12 | * 商户ID 13 | */ 14 | MERCHANT_ID, 15 | /** 16 | * 个人微信号 17 | */ 18 | PERSONAL_WECHATID, 19 | /** 20 | * 个人微信openid 21 | */ 22 | PERSONAL_OPENID, 23 | /** 24 | * 个人微信sub_openid (对应服务商API的子商户sub_appid转换得到) 25 | */ 26 | PERSONAL_SUB_OPENID; 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/spring/PropertyTokenGenerater.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.spring; 2 | 3 | import com.zone.weixin4j.util.AesToken; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Created by Yz on 2017/3/15. 9 | * 配置文件中获取Token 10 | */ 11 | public class PropertyTokenGenerater extends TokenGenerater { 12 | 13 | private List aesTokens; 14 | 15 | @Override 16 | public List getAesTokens() { 17 | return aesTokens; 18 | } 19 | 20 | public void setAesTokens(List aesTokens) { 21 | this.aesTokens = aesTokens; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/OkHttp2ClinetTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.okhttp.OkHttpClient2Factory; 5 | 6 | /** 7 | * OkHttp for test 8 | * 9 | * @className OkHttpClinetTest 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2016年7月28日 12 | * @since JDK 1.6 13 | */ 14 | public class OkHttp2ClinetTest extends HttpClientTest { 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new OkHttpClient2Factory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/OkHttp3ClinetTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.okhttp.OkHttpClient3Factory; 5 | 6 | /** 7 | * OkHttp for test 8 | * 9 | * @className OkHttpClinetTest 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2016年7月28日 12 | * @since JDK 1.6 13 | */ 14 | public class OkHttp3ClinetTest extends HttpClientTest { 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new OkHttpClient3Factory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/qy/suite/SuiteEventType.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.qy.suite; 2 | 3 | /** 4 | * 应用套件回调事件 5 | * 6 | * @className SuiteEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月21日 9 | * @since JDK 1.6 10 | * @see 第三方回调协议 12 | */ 13 | public enum SuiteEventType { 14 | /** 15 | * 推送ticket 16 | */ 17 | suite_ticket, 18 | /** 19 | * 变更授权 20 | */ 21 | change_auth, 22 | /** 23 | * 取消授权 24 | */ 25 | cancel_auth; 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/CouponStockType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 代金券批次类型 5 | * 6 | * @className CouponStockType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CouponStockType { 15 | /** 16 | * 批量型 17 | */ 18 | BATCH(1), 19 | /** 20 | * 触发型 21 | */ 22 | TRIGGER(2); 23 | private int val; 24 | 25 | CouponStockType(int val) { 26 | this.val = val; 27 | } 28 | 29 | public int getVal() { 30 | return val; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/xml/ListsuffixResult.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.xml; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 对$n结尾的节点注解 10 | * 11 | * @className ListsuffixResult 12 | * @author jinyu(foxinmy@gmail.com) 13 | * @date 2015年6月15日 14 | * @since JDK 1.6 15 | * @see 16 | */ 17 | @Target(ElementType.FIELD) 18 | @Retention(RetentionPolicy.RUNTIME) 19 | public @interface ListsuffixResult { 20 | String[] value() default { "(_\\d)$" }; 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/CurrencyType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 币种 5 | * 6 | * @className CurrencyType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CurrencyType { 13 | CNY("人民币"), HKD("港元"), TWD("台币"), EUR("欧元"), USD("美元"), GBP("英镑"), JPY("日元"), CAD( 14 | "加拿大元"), AUD("澳大利亚元"), NZD("新西兰元"), KRW("韩元"), THB("泰铢"); 15 | 16 | private String desc; 17 | 18 | CurrencyType(String desc) { 19 | this.desc = desc; 20 | } 21 | 22 | public String getDesc() { 23 | return desc; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/suite/SuiteEventType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.suite; 2 | 3 | /** 4 | * 应用套件回调事件 5 | * 6 | * @className SuiteEventType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年6月21日 9 | * @since JDK 1.6 10 | * @see 第三方回调协议 12 | */ 13 | public enum SuiteEventType { 14 | /** 15 | * 推送ticket 16 | */ 17 | suite_ticket, 18 | /** 19 | * 变更授权 20 | */ 21 | change_auth, 22 | /** 23 | * 取消授权 24 | */ 25 | cancel_auth; 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/annotation/WxMessageInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.annotation; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Created by Yz on 2017/3/13. 11 | * WxMessageInterceptor 12 | * WxMessageInterceptor 注解声明拦截消息内容的类 13 | */ 14 | @Target({java.lang.annotation.ElementType.TYPE}) 15 | @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) 16 | @Documented 17 | @Component 18 | public @interface WxMessageInterceptor { 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/NettyHttpClientTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.netty.Netty4HttpClientFactory; 5 | 6 | /** 7 | * Netty for http test 8 | * @className NettyHttpClientTest 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年7月28日 11 | * @since JDK 1.6 12 | */ 13 | public class NettyHttpClientTest extends HttpClientTest { 14 | 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new Netty4HttpClientFactory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/UserSourceType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 用户渠道来源 5 | * 6 | * @className UserSourceType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年1月25日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum UserSourceType { 13 | OTHER("其它(包括带参数二维码)"), QRCODE("扫二维码"), CARDSHARE("名片分享"), SONUMBER("搜号码(即微信添加朋友页的搜索)"), SOMPACCOUNT( 14 | "查询微信公众帐号"), ARTICLEMENU("图文页右上角菜单"); 15 | private String desc; 16 | 17 | UserSourceType(String desc) { 18 | this.desc = desc; 19 | } 20 | 21 | public String getDesc() { 22 | return desc; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RefundChannel.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 退款渠道 5 | * 6 | * @className RefundChannel 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月6日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum RefundChannel { 13 | /** 14 | * 原路退款 15 | */ 16 | ORIGINAL, 17 | /** 18 | * 退回到余额 19 | */ 20 | BALANCE, 21 | /** 22 | * 财付通 23 | */ 24 | TENPAY, 25 | /** 26 | * 银行 27 | */ 28 | BANK, 29 | /** 30 | * 原账户异常退到其他余额账户 31 | */ 32 | OTHER_BALANCE, 33 | /** 34 | * 原银行卡异常退到其他银行卡 35 | */ 36 | OTHER_BANKCARD 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/TradeType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 微信支付类型 5 | * 6 | * @className TradeType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年10月21日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到weixin4j-pay子模块 12 | */ 13 | @Deprecated 14 | public enum TradeType { 15 | /** 16 | * JS支付 17 | */ 18 | JSAPI, 19 | /** 20 | * 刷卡支付 21 | */ 22 | MICROPAY, 23 | /** 24 | * 扫码支付 25 | */ 26 | NATIVE, 27 | /** 28 | * APP支付 29 | */ 30 | APP, 31 | /** 32 | * WAP支付 33 | */ 34 | MWEB; 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/api/WxaCodeParameterTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import java.awt.Color; 6 | 7 | import org.junit.Test; 8 | 9 | import com.alibaba.fastjson.JSON; 10 | 11 | public class WxaCodeParameterTest { 12 | 13 | @Test 14 | public void test() { 15 | WxaCodeParameter param = new WxaCodeParameter("pages/index/index", 430, false, new Color(1, 2, 3), true); 16 | String json = JSON.toJSONString(param); 17 | assertTrue(json.contains("\"line_color\":")); 18 | assertTrue(json.contains("\"is_hyaline\":true")); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/CustomsSatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 报关状态 5 | * 6 | * @className CustomsSatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CustomsSatus { 15 | UNDECLARED("未申报"), SUBMITTED("申报已提交"), PROCESSING("申报中"), SUCCESS("申报成功"), FAIL( 16 | "申报失败"), EXCEPT("海关接口异常"); 17 | private String sate; 18 | 19 | CustomsSatus(String sate) { 20 | this.sate = sate; 21 | } 22 | 23 | public String getSate() { 24 | return this.sate; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/BillType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 对账单类型 5 | * 6 | * @className BillType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年10月31日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum BillType { 15 | /** 16 | * 全部 17 | */ 18 | ALL(0), 19 | /** 20 | * 成功订单 21 | */ 22 | SUCCESS(1), 23 | /** 24 | * 退款订单 25 | */ 26 | REFUND(2); 27 | private int val; 28 | 29 | BillType(int val) { 30 | this.val = val; 31 | } 32 | 33 | public int getVal() { 34 | return val; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/Apache3HttpClientTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.apache3.HttpComponent3Factory; 5 | 6 | /** 7 | * Apache3 for http test 8 | * 9 | * @className Apache3HttpClientTest 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2016年7月28日 12 | * @since JDK 1.6 13 | */ 14 | public class Apache3HttpClientTest extends HttpClientTest { 15 | 16 | @Override 17 | protected HttpClientFactory createHttpFactory() { 18 | return new HttpComponent3Factory(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/Apache4_1HttpClientTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.apache4.HttpComponent4_1Factory; 5 | 6 | /** 7 | * Apache4 for http test 8 | * @className Apache4HttpClientTest 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年7月28日 11 | * @since JDK 1.6 12 | */ 13 | public class Apache4_1HttpClientTest extends HttpClientTest { 14 | 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new HttpComponent4_1Factory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/test/java/com/foxinmy/weixin4j/base/test/http/Apache4_2HttpClientTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.base.test.http; 2 | 3 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 4 | import com.foxinmy.weixin4j.http.support.apache4.HttpComponent4_2Factory; 5 | 6 | /** 7 | * Apache4 for http test 8 | * @className Apache4HttpClientTest 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年7月28日 11 | * @since JDK 1.6 12 | */ 13 | public class Apache4_2HttpClientTest extends HttpClientTest { 14 | 15 | @Override 16 | protected HttpClientFactory createHttpFactory() { 17 | return new HttpComponent4_2Factory(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/CardStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 会员卡的状态 5 | * 6 | * @auther: Feng Yapeng 7 | * @since: 2016/12/19 11:39 8 | */ 9 | public enum CardStatus { 10 | 11 | /** 12 | * 待审核; 13 | */ 14 | CARD_STATUS_NOT_VERIFY, 15 | 16 | /** 17 | * 审核失败 18 | */ 19 | CARD_STATUS_VERIFY_FAIL, 20 | 21 | /** 22 | * 通过审核 23 | */ 24 | CARD_STATUS_VERIFY_OK, 25 | 26 | /** 27 | * 卡券被商户删除 28 | */ 29 | CARD_STATUS_DELETE, 30 | 31 | /** 32 | * 在公众平台投放过的卡券 33 | */ 34 | CARD_STATUS_DISPATCH; 35 | 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/FaceSize.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 头像大小 5 | * 6 | * @className FaceSize 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum FaceSize { 13 | /** 14 | * 46x46 15 | */ 16 | small(46), 17 | /** 18 | * 64x64 19 | */ 20 | middle1(64), 21 | /** 22 | * 96x96 23 | */ 24 | middle2(96), 25 | /** 26 | * 132x132 27 | */ 28 | big(132); 29 | private int size; 30 | 31 | FaceSize(int size) { 32 | this.size = size; 33 | } 34 | 35 | public int getInt() { 36 | return size; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RefundStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 退款状态 5 | * 6 | * @className RefundStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum RefundStatus { 13 | /** 14 | * 退款成功 15 | */ 16 | SUCCESS, 17 | /** 18 | * 退款失败 19 | */ 20 | FAIL, 21 | /** 22 | * 退款处理中 23 | */ 24 | PROCESSING, 25 | /** 26 | * 未确定,需要商户 原退款单号重新发起 27 | */ 28 | NOTSURE, 29 | /** 30 | * 转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财付通转 31 | * 账的方式进行退款。 32 | */ 33 | CHANGE; 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/UserStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 成员状态 5 | * 6 | * @className UserStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月19日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum UserStatus { 13 | /** 14 | * 0=全部 15 | */ 16 | BOTH(0), 17 | /** 18 | * 1=已关注 19 | */ 20 | FOLLOW(1), 21 | /** 22 | * 2=已冻结 23 | */ 24 | FROZEN(2), 25 | /** 26 | * 4=未关注 27 | */ 28 | UNFOLLOW(4); 29 | private int val; 30 | 31 | UserStatus(int val) { 32 | this.val = val; 33 | } 34 | 35 | public int getVal() { 36 | return val; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/CardType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 卡券类型 5 | * 6 | * @className CardType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年4月4日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CardType { 13 | /** 14 | * 团购券 15 | */ 16 | GROUPON, 17 | /** 18 | * 代金券 19 | */ 20 | CASH, 21 | /** 22 | * 折扣券 23 | */ 24 | DISCOUNT, 25 | /** 26 | * 兑换券 27 | */ 28 | GIFT, 29 | /** 30 | * 优惠券 31 | */ 32 | GENERAL_COUPON, 33 | 34 | /** 35 | * 会员卡 36 | */ 37 | MEMBER_CARD, 38 | 39 | /** 40 | * 通用(礼品)卡 41 | */ 42 | GENERAL_CARD 43 | } 44 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/resources/spring-bean.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/CustomsCity.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 海关 5 | * 6 | * @className CustomsCity 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CustomsCity { 13 | NO("无需上报海关"), GUANGZHOU("广州"), HANGZHOU("杭州"), NINGBO("宁波"), ZHENGZHOU_BS( 14 | "郑州(保税物流中心)"), CHONGQING("重庆"), XIAN("西安"), SHANGHAI("上海"), ZHENGZHOU_ZH( 15 | "郑州(综保区)"); 16 | 17 | private String name; 18 | 19 | CustomsCity(String name) { 20 | this.name = name; 21 | } 22 | 23 | public String getName() { 24 | return this.name; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/TradeType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 微信支付类型 5 | * 6 | * @className TradeType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年10月21日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum TradeType { 13 | /** 14 | * JS支付 15 | */ 16 | JSAPI, 17 | /** 18 | * 刷卡支付 19 | */ 20 | MICROPAY, 21 | /** 22 | * 扫码支付 23 | */ 24 | NATIVE, 25 | /** 26 | * APP支付 27 | */ 28 | APP, 29 | /** 30 | * WAP支付 31 | */ 32 | MWEB, 33 | /** 34 | * 刷脸支付 35 | */ 36 | FACEPAY; 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/CouponStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 代金券状态 5 | * 6 | * @className CouponStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CouponStatus { 15 | /** 16 | * 已激活 17 | */ 18 | ACTIVATED(2), 19 | /** 20 | * 已锁定 21 | */ 22 | LOCKED(4), 23 | /** 24 | * 已实扣 25 | */ 26 | USED(8); 27 | private int val; 28 | 29 | CouponStatus(int val) { 30 | this.val = val; 31 | } 32 | 33 | public int getVal() { 34 | return val; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/KfOnlineStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 多客服在线状态 5 | * 6 | * @className KfOnlineStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月16日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum KfOnlineStatus { 13 | PC(1, "PC在线"), MOBILE(2, "手机在线"), BOTH(3, "PC跟手机同时在线"); 14 | private int code; 15 | private String desc; 16 | 17 | KfOnlineStatus(int code, String desc) { 18 | this.code = code; 19 | this.desc = desc; 20 | } 21 | 22 | public int getCode() { 23 | return code; 24 | } 25 | 26 | public String getDesc() { 27 | return desc; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/cache/CacheCreator.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.cache; 2 | 3 | import com.foxinmy.weixin4j.exception.WeixinException; 4 | 5 | /** 6 | * Cache的创建 7 | * 8 | * @className CacheCreator 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年5月24日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public interface CacheCreator { 15 | /** 16 | * CacheKey 17 | * 18 | * @return 19 | */ 20 | public String key(); 21 | 22 | /** 23 | * 创建Cache 24 | * 25 | * @throws WeixinException 26 | * @return 缓存对象 27 | */ 28 | public T create() throws WeixinException; 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/QRType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 二维码类型 5 | * 6 | * @className QRType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月4日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum QRType { 13 | /** 14 | * 临时二维码 15 | */ 16 | QR_SCENE, 17 | /** 18 | * 永久二维码(场景值为数字范围在1-100000之间) 19 | */ 20 | QR_LIMIT_SCENE, 21 | /** 22 | * 永久二维码(场景值为字符串长度在1-64之间) 23 | */ 24 | QR_LIMIT_STR_SCENE, 25 | /** 26 | * 卡券二维码:单个卡券 27 | */ 28 | QR_CARD, 29 | /** 30 | * 临时的字符串参数值 31 | */ 32 | QR_STR_SCENE, 33 | /** 34 | * 卡券二维码:多个卡券 35 | */ 36 | QR_MULTIPLE_CARD; 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/CardCodeType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 卡券码型 5 | * 6 | * @className CardCodeType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年8月4日 9 | * @since JDK 1.7 10 | */ 11 | public enum CardCodeType { 12 | /** 13 | * 文本 14 | */ 15 | CODE_TYPE_TEXT, 16 | /** 17 | * 一维码 18 | */ 19 | CODE_TYPE_BARCODE, 20 | /** 21 | * 二维码 22 | */ 23 | CODE_TYPE_QRCODE, 24 | /** 25 | * 二维码无code显示 26 | */ 27 | CODE_TYPE_ONLY_QRCODE, 28 | /** 29 | * 一维码无code显示 30 | */ 31 | CODE_TYPE_ONLY_BARCODE, 32 | /** 33 | * 不显示code和条形码类型 34 | */ 35 | CODE_TYPE_NONE; 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RefundType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 退款类型 5 | * 6 | * @className RefundType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年12月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum RefundType { 13 | /** 14 | * 1:商户号余额退款; 15 | */ 16 | BALANCE(1), 17 | /** 18 | * 2:现金帐号 退款; 19 | */ 20 | CASH(2), 21 | /** 22 | * 3:优先商户号退款,若商户号余额不足, 再做现金帐号退款。 使用 2 或 3 时,需联系财 付通开通此功能 23 | */ 24 | BOTH(3); 25 | 26 | private int val; 27 | 28 | RefundType(int val) { 29 | this.val = val; 30 | } 31 | 32 | public int getVal() { 33 | return val; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/api/WxaApiAsyncResult.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import com.alibaba.fastjson.TypeReference; 4 | 5 | class WxaApiAsyncResult extends WxaApiResult { 6 | 7 | private static final long serialVersionUID = 2020022001L; 8 | 9 | public static final TypeReference TYPE_REFERENCE 10 | = new TypeReference() { 11 | }; 12 | 13 | private String traceId; 14 | 15 | public WxaApiAsyncResult() { 16 | } 17 | 18 | public String getTraceId() { 19 | return traceId; 20 | } 21 | 22 | public void setTraceId(String traceId) { 23 | this.traceId = traceId; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/NotifyTuple.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | /** 4 | * 客服消息元件 5 | * 6 | * @className NotifyTuple 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月22日 9 | * @since JDK 1.6 10 | * @see com.foxinmy.weixin4j.tuple.Text 11 | * @see com.foxinmy.weixin4j.tuple.Image 12 | * @see com.foxinmy.weixin4j.tuple.Voice 13 | * @see com.foxinmy.weixin4j.tuple.Video 14 | * @see com.foxinmy.weixin4j.tuple.Music 15 | * @see com.foxinmy.weixin4j.tuple.File 16 | * @see com.foxinmy.weixin4j.tuple.News 17 | * @see com.foxinmy.weixin4j.tuple.MpNews 18 | */ 19 | public interface NotifyTuple extends Tuple { 20 | 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/CurrencyType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 币种 5 | * 6 | * @className CurrencyType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CurrencyType { 15 | CNY("人民币"), HKD("港元"), TWD("台币"), EUR("欧元"), USD("美元"), GBP("英镑"), JPY("日元"), CAD( 16 | "加拿大元"), AUD("澳大利亚元"), NZD("新西兰元"), KRW("韩元"), THB("泰铢"); 17 | 18 | private String desc; 19 | 20 | CurrencyType(String desc) { 21 | this.desc = desc; 22 | } 23 | 24 | public String getDesc() { 25 | return desc; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RefundChannel.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 退款渠道 5 | * 6 | * @className RefundChannel 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月6日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum RefundChannel { 15 | /** 16 | * 原路退款 17 | */ 18 | ORIGINAL, 19 | /** 20 | * 退回到余额 21 | */ 22 | BALANCE, 23 | /** 24 | * 财付通 25 | */ 26 | TENPAY, 27 | /** 28 | * 银行 29 | */ 30 | BANK, 31 | /** 32 | * 原账户异常退到其他余额账户 33 | */ 34 | OTHER_BALANCE, 35 | /** 36 | * 原银行卡异常退到其他银行卡 37 | */ 38 | OTHER_BANKCARD 39 | } 40 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/api/WxaCodeUnlimitParameterTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import java.awt.Color; 6 | 7 | import org.junit.Test; 8 | 9 | import com.alibaba.fastjson.JSON; 10 | 11 | public class WxaCodeUnlimitParameterTest { 12 | 13 | @Test 14 | public void test() { 15 | WxaCodeUnlimitParameter param = new WxaCodeUnlimitParameter("myScene", "pages/index/index", 430, false, new Color(1, 2, 3), true); 16 | String json = JSON.toJSONString(param); 17 | assertTrue(json.contains("\"line_color\":")); 18 | assertTrue(json.contains("\"is_hyaline\":true")); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/type/BatchType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.type; 2 | 3 | /** 4 | * 异步任务的类型 5 | * 6 | * @className BatchType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月31日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum BatchType { 13 | /** 14 | * 增量更新成员 15 | */ 16 | SYNC_USER(1), 17 | /** 18 | * 全量覆盖成员 19 | */ 20 | REPLACE_USER(2), 21 | /** 22 | * 邀请成员关注 23 | */ 24 | INVITE_USER(3), 25 | /** 26 | * 全量覆盖部门 27 | */ 28 | REPLACE_PARTY(4); 29 | 30 | private int code; 31 | 32 | BatchType(int code) { 33 | this.code = code; 34 | } 35 | 36 | public int getCode() { 37 | return code; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RefundStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 退款状态 5 | * 6 | * @className RefundStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum RefundStatus { 15 | /** 16 | * 退款成功 17 | */ 18 | SUCCESS, 19 | /** 20 | * 退款失败 21 | */ 22 | FAIL, 23 | /** 24 | * 退款处理中 25 | */ 26 | PROCESSING, 27 | /** 28 | * 未确定,需要商户 原退款单号重新发起 29 | */ 30 | NOTSURE, 31 | /** 32 | * 转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财付通转 33 | * 账的方式进行退款。 34 | */ 35 | CHANGE; 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/CustomsCity.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 海关 5 | * 6 | * @className CustomsCity 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CustomsCity { 15 | NO("无需上报海关"), GUANGZHOU("广州"), HANGZHOU("杭州"), NINGBO("宁波"), ZHENGZHOU_BS( 16 | "郑州(保税物流中心)"), CHONGQING("重庆"), XIAN("西安"), SHANGHAI("上海"), ZHENGZHOU_ZH( 17 | "郑州(综保区)"); 18 | 19 | private String name; 20 | 21 | CustomsCity(String name) { 22 | this.name = name; 23 | } 24 | 25 | public String getName() { 26 | return this.name; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/type/Lang.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.type; 2 | 3 | /** 4 | * 国家地区语言版本 5 | * 6 | * @className Lang 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum Lang { 13 | zh_CN("简体中文"), zh_TW("繁体中文"), zh_HK("繁体中文"), en("英语"), id("印尼"), ms("马来"), es( 14 | "西班牙"), ko("韩国"), it("意大利"), ja("日本"), pl("波兰"), pt("葡萄牙"), ru("俄国"), th( 15 | "泰文"), vi("越南"), ar("阿拉伯语"), hi("北印度"), he("希伯来"), tr("土耳其"), de( 16 | "德语"), fr("法语"); 17 | private String desc; 18 | 19 | Lang(String desc) { 20 | this.desc = desc; 21 | } 22 | 23 | public String getDesc() { 24 | return desc; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/TradeState.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * 交易状态 5 | * 6 | * @className TradeState 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum TradeState { 13 | /** 14 | * 支付成功 15 | */ 16 | SUCCESS, 17 | /** 18 | * 转入退款 19 | */ 20 | REFUND, 21 | /** 22 | * 未支付 23 | */ 24 | NOTPAY, 25 | /** 26 | * 已关闭 27 | */ 28 | CLOSED, 29 | /** 30 | * 已撤销 31 | */ 32 | REVOKED, 33 | /** 34 | * 用户支付中 35 | */ 36 | USERPAYING, 37 | /** 38 | * 未支付(输入密码或 确认支付超时) 39 | */ 40 | NOPAY, 41 | /** 42 | * 支付失败(其他 原因,如银行返回失败) 43 | */ 44 | PAYERROR; 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/custommessage/Command.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.custommessage; 2 | 3 | import com.foxinmy.weixin4j.wxa.api.CustomMessageApi; 4 | 5 | /** 6 | * 客服输入状态命令。 7 | * 8 | * @see CustomMessageApi#typingCustomMessage(String, Command) 9 | * @since 1.8 10 | */ 11 | public enum Command { 12 | 13 | /** 14 | * 对用户下发“正在输入"状态。 15 | */ 16 | TYPING("Typing"), 17 | 18 | /** 19 | * 取消对用户的”正在输入"状态。 20 | */ 21 | CANCEL_TYPING("CancelTyping"); 22 | 23 | private final String value; 24 | 25 | Command(final String value) { 26 | this.value = value; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return this.value; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RefundType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 退款类型 5 | * 6 | * @className RefundType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年12月31日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum RefundType { 15 | /** 16 | * 1:商户号余额退款; 17 | */ 18 | BALANCE(1), 19 | /** 20 | * 2:现金帐号 退款; 21 | */ 22 | CASH(2), 23 | /** 24 | * 3:优先商户号退款,若商户号余额不足, 再做现金帐号退款。 使用 2 或 3 时,需联系财 付通开通此功能 25 | */ 26 | BOTH(3); 27 | 28 | private int val; 29 | 30 | RefundType(int val) { 31 | this.val = val; 32 | } 33 | 34 | public int getVal() { 35 | return val; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/model/PrivilegeLevel.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.model; 2 | 3 | /** 4 | * 权限级别 5 | * 6 | * @className PrivilegeLevel 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2016年3月28日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum PrivilegeLevel { 13 | /** 14 | * 标识只读 15 | */ 16 | IDENTIFYING_READABLE(1), 17 | /** 18 | * 信息只读 19 | */ 20 | INFORMATION_READABLE(2), 21 | /** 22 | * 信息读写 23 | */ 24 | INFORMATION_READABLE$WRITABLE(3); 25 | 26 | private int level; 27 | 28 | PrivilegeLevel(int level) { 29 | this.level = level; 30 | } 31 | 32 | public int getLevel() { 33 | return this.level; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/factory/SimpleHttpClientFactory.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http.factory; 2 | 3 | import com.foxinmy.weixin4j.http.HttpClient; 4 | import com.foxinmy.weixin4j.http.HttpParams; 5 | import com.foxinmy.weixin4j.http.SimpleHttpClient; 6 | 7 | /** 8 | * HttpURLConnection的简单实现 9 | * 10 | * @className SimpleHttpClientFactory 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2015年8月12日 13 | * @since JDK 1.6 14 | * @see com.foxinmy.weixin4j.http.SimpleHttpClient 15 | */ 16 | public class SimpleHttpClientFactory extends HttpClientFactory { 17 | 18 | @Override 19 | public HttpClient newInstance(HttpParams params) { 20 | return new SimpleHttpClient(params); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/RedpacketSceneType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 发放红包使用场景 5 | * 6 | * @className RedpacketSceneType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2017年1月4日 9 | * @since JDK 1.6 10 | */ 11 | public enum RedpacketSceneType { 12 | /** 13 | * 商品促销 14 | */ 15 | PRODUCT_1, 16 | /** 17 | * 抽奖 18 | */ 19 | PRODUCT_2, 20 | /** 21 | * 虚拟物品兑奖 22 | */ 23 | PRODUCT_3, 24 | /** 25 | * 企业内部福利 26 | */ 27 | PRODUCT_4, 28 | /** 29 | * 渠道分润 30 | */ 31 | PRODUCT_5, 32 | /** 33 | * 保险回馈 34 | */ 35 | PRODUCT_6, 36 | /** 37 | * 彩票派奖 38 | */ 39 | PRODUCT_7, 40 | /** 41 | * 税务刮奖 42 | */ 43 | PRODUCT_8 44 | } 45 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/CouponType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 代金券类型 5 | * 6 | * @className CouponType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CouponType { 13 | /** 14 | * 使用无门槛 15 | */ 16 | NO_THRESHOLD(1), 17 | /** 18 | * 使用有门槛 19 | */ 20 | HAS_THRESHOLD(2), 21 | /** 22 | * 门槛叠加 23 | */ 24 | THRESHOLD_PLUS(3), 25 | 26 | /** 27 | * 充值代金券 28 | */ 29 | CASH(-1), 30 | /** 31 | * 非充值代金券 32 | */ 33 | NO_CASH(-2); 34 | private int val; 35 | 36 | CouponType(int val) { 37 | this.val = val; 38 | } 39 | 40 | public int getVal() { 41 | return val; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/mch/CouponStockStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.mch; 2 | 3 | /** 4 | * 代金券批次状态 5 | * 6 | * @className CouponStockStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum CouponStockStatus { 13 | /** 14 | * 未激活 15 | */ 16 | INACTIVE(1), 17 | /** 18 | * 审批中 19 | */ 20 | APPROVAL_PROCESS(2), 21 | /** 22 | * 已激活 23 | */ 24 | ACTIVATED(4), 25 | /** 26 | * 已作废 27 | */ 28 | SUPERSEDED(8), 29 | /** 30 | * 中止发放 31 | */ 32 | SUSPEND(16); 33 | private int val; 34 | 35 | CouponStockStatus(int val) { 36 | this.val = val; 37 | } 38 | 39 | public int getVal() { 40 | return val; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/TradeState.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * 交易状态 5 | * 6 | * @className TradeState 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月2日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum TradeState { 15 | /** 16 | * 支付成功 17 | */ 18 | SUCCESS, 19 | /** 20 | * 转入退款 21 | */ 22 | REFUND, 23 | /** 24 | * 未支付 25 | */ 26 | NOTPAY, 27 | /** 28 | * 已关闭 29 | */ 30 | CLOSED, 31 | /** 32 | * 已撤销 33 | */ 34 | REVOKED, 35 | /** 36 | * 用户支付中 37 | */ 38 | USERPAYING, 39 | /** 40 | * 未支付(输入密码或 确认支付超时) 41 | */ 42 | NOPAY, 43 | /** 44 | * 支付失败(其他 原因,如银行返回失败) 45 | */ 46 | PAYERROR; 47 | } 48 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/api/WxaQrCodeParameter.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import java.io.Serializable; 4 | 5 | class WxaQrCodeParameter implements Serializable { 6 | 7 | private static final long serialVersionUID = 2018052201L; 8 | 9 | private String path; 10 | private Integer width; 11 | 12 | public WxaQrCodeParameter(String path, Integer width) { 13 | this.path = path; 14 | this.width = width; 15 | } 16 | 17 | public String getPath() { 18 | return path; 19 | } 20 | 21 | public void setPath(String path) { 22 | this.path = path; 23 | } 24 | 25 | public Integer getWidth() { 26 | return width; 27 | } 28 | 29 | public void setWidth(Integer width) { 30 | this.width = width; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/SingleResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | /** 4 | * 单一内容回复 5 | * 6 | * @className SingleResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月3日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class SingleResponse implements WeixinResponse { 13 | 14 | private final String content; 15 | 16 | public SingleResponse(String content) { 17 | this.content = content; 18 | } 19 | 20 | @Override 21 | public String toContent() { 22 | return content; 23 | } 24 | 25 | @Override 26 | public String getMsgType() { 27 | return "single"; 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | return "SingleResponse [content=" + content + "]"; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-qy/README.md: -------------------------------------------------------------------------------- 1 | weixin4j-qy 2 | =========== 3 | 4 | [微信企业号](http://qydev.weixin.qq.com/wiki/index.php)开发工具包 5 | --------------------------------------------------------------- 6 | 7 | 功能列表 8 | ------- 9 | 10 | * AgentApi `应用设置API` 11 | 12 | * BatchApi `批量任务API` 13 | 14 | * ChatApi `会话服务API` 15 | 16 | * Helper `辅助API` 17 | 18 | * MediaApi `媒体素材API` 19 | 20 | * MenuApi `菜单管理API` 21 | 22 | * NotifyApi `消息发送API` 23 | 24 | * OauthApi `oauth授权登陆API` 25 | 26 | * PartyApi `部门管理API` 27 | 28 | * ProviderApi `服务商API` 29 | 30 | * SuiteApi `第三方应用API` 31 | 32 | * TagApi `标签管理API` 33 | 34 | * UserApi `成员管理API` 35 | 36 | 37 | [如何使用](https://github.com/foxinmy/weixin4j/wiki) 38 | --------- 39 | 40 | [更新LOG](./CHANGE.md) 41 | ---------------------- -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/SingleResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | /** 4 | * 单一内容回复 5 | * 6 | * @className SingleResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年8月3日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class SingleResponse implements WeixinResponse { 13 | 14 | private final String content; 15 | 16 | public SingleResponse(String content) { 17 | this.content = content; 18 | } 19 | 20 | @Override 21 | public String toContent() { 22 | return content; 23 | } 24 | 25 | @Override 26 | public String getMsgType() { 27 | return "single"; 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | return "SingleResponse [content=" + content + "]"; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/RedpacketSceneType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 发放红包使用场景 5 | * 6 | * @className RedpacketSceneType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2017年1月4日 9 | * @since JDK 1.6 10 | * @deprecated 迁移到子模块weixin4j-pay 11 | */ 12 | @Deprecated 13 | public enum RedpacketSceneType { 14 | /** 15 | * 商品促销 16 | */ 17 | PRODUCT_1, 18 | /** 19 | * 抽奖 20 | */ 21 | PRODUCT_2, 22 | /** 23 | * 虚拟物品兑奖 24 | */ 25 | PRODUCT_3, 26 | /** 27 | * 企业内部福利 28 | */ 29 | PRODUCT_4, 30 | /** 31 | * 渠道分润 32 | */ 33 | PRODUCT_5, 34 | /** 35 | * 保险回馈 36 | */ 37 | PRODUCT_6, 38 | /** 39 | * 彩票派奖 40 | */ 41 | PRODUCT_7, 42 | /** 43 | * 税务刮奖 44 | */ 45 | PRODUCT_8 46 | } 47 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/CouponType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 代金券类型 5 | * 6 | * @className CouponType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CouponType { 15 | /** 16 | * 使用无门槛 17 | */ 18 | NO_THRESHOLD(1), 19 | /** 20 | * 使用有门槛 21 | */ 22 | HAS_THRESHOLD(2), 23 | /** 24 | * 门槛叠加 25 | */ 26 | THRESHOLD_PLUS(3), 27 | 28 | /** 29 | * 充值代金券 30 | */ 31 | CASH(-1), 32 | /** 33 | * 非充值代金券 34 | */ 35 | NO_CASH(-2); 36 | private int val; 37 | 38 | CouponType(int val) { 39 | this.val = val; 40 | } 41 | 42 | public int getVal() { 43 | return val; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | import java.io.InputStream; 4 | 5 | /** 6 | * HTTP 响应 7 | * 8 | * @className HttpResponse 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2015年5月30日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public interface HttpResponse extends HttpMessage { 15 | /** 16 | * HTTP协议 17 | * 18 | * @return 19 | */ 20 | HttpVersion getProtocol(); 21 | 22 | /** 23 | * 响应状态 24 | * 25 | * @return 26 | */ 27 | HttpStatus getStatus(); 28 | /** 29 | * 响应内容 30 | * 31 | * @return 32 | */ 33 | InputStream getBody(); 34 | 35 | /** 36 | * 响应内容 37 | * 38 | * @return 39 | */ 40 | byte[] getContent(); 41 | 42 | /** 43 | * 释放资源 44 | */ 45 | void close(); 46 | } 47 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/Voice.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | import com.alibaba.fastjson.annotation.JSONCreator; 4 | import com.alibaba.fastjson.annotation.JSONField; 5 | 6 | /** 7 | * 语音对象 8 | *

9 | * 可用于「客服消息」「群发消息」 10 | *

11 | * 12 | * @className Voice 13 | * @author jinyu(foxinmy@gmail.com) 14 | * @date 2014年9月29日 15 | * @since JDK 1.6 16 | * @see 17 | */ 18 | public class Voice extends Image implements NotifyTuple { 19 | 20 | private static final long serialVersionUID = 8853054484809101524L; 21 | 22 | @Override 23 | public String getMessageType() { 24 | return "voice"; 25 | } 26 | 27 | @JSONCreator 28 | public Voice(@JSONField(name = "mediaId") String mediaId) { 29 | super(mediaId); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/mch/CouponStockStatus.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.mch; 2 | 3 | /** 4 | * 代金券批次状态 5 | * 6 | * @className CouponStockStatus 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年3月27日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum CouponStockStatus { 15 | /** 16 | * 未激活 17 | */ 18 | INACTIVE(1), 19 | /** 20 | * 审批中 21 | */ 22 | APPROVAL_PROCESS(2), 23 | /** 24 | * 已激活 25 | */ 26 | ACTIVATED(4), 27 | /** 28 | * 已作废 29 | */ 30 | SUPERSEDED(8), 31 | /** 32 | * 中止发放 33 | */ 34 | SUSPEND(16); 35 | private int val; 36 | 37 | CouponStockStatus(int val) { 38 | this.val = val; 39 | } 40 | 41 | public int getVal() { 42 | return val; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/QyApi.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.api; 2 | 3 | import java.util.ResourceBundle; 4 | 5 | import com.foxinmy.weixin4j.api.BaseApi; 6 | 7 | /** 8 | * 微信企业号API 9 | * 10 | * @className QyApi 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2014年11月18日 13 | * @since JDK 1.6 14 | * @see com.foxinmy.weixin4j.api.BaseApi 15 | * @see api文档 16 | */ 17 | public class QyApi extends BaseApi { 18 | 19 | private final static ResourceBundle WEIXIN_BUNDLE; 20 | static { 21 | WEIXIN_BUNDLE = ResourceBundle 22 | .getBundle("com/foxinmy/weixin4j/qy/api/weixin"); 23 | } 24 | 25 | @Override 26 | protected ResourceBundle weixinBundle() { 27 | return WEIXIN_BUNDLE; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/TextResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | /** 4 | * 回复文本消息 5 | * 6 | * @className TextResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class TextResponse implements WeixinResponse { 13 | 14 | /** 15 | * 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) 16 | */ 17 | private String content; 18 | 19 | public TextResponse(String content) { 20 | this.content = content; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format("", content); 26 | } 27 | 28 | @Override 29 | public String getMsgType() { 30 | return "text"; 31 | } 32 | 33 | public String getContent() { 34 | return content; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MpApi.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.api; 2 | 3 | import java.util.ResourceBundle; 4 | 5 | import com.foxinmy.weixin4j.api.BaseApi; 6 | 7 | /** 8 | * 微信公众平台API 9 | * 10 | * @className MpApi 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2014年9月26日 13 | * @since JDK 1.6 14 | * @see com.foxinmy.weixin4j.api.BaseApi 15 | * @see api文档 16 | */ 17 | public class MpApi extends BaseApi { 18 | 19 | private final static ResourceBundle WEIXIN_BUNDLE; 20 | 21 | static { 22 | WEIXIN_BUNDLE = ResourceBundle 23 | .getBundle("com/foxinmy/weixin4j/mp/api/weixin"); 24 | } 25 | 26 | @Override 27 | protected ResourceBundle weixinBundle() { 28 | return WEIXIN_BUNDLE; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/TextResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | /** 4 | * 回复文本消息 5 | * 6 | * @className TextResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class TextResponse implements WeixinResponse { 13 | 14 | /** 15 | * 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) 16 | */ 17 | private String content; 18 | 19 | public TextResponse(String content) { 20 | this.content = content; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format("", content); 26 | } 27 | 28 | @Override 29 | public String getMsgType() { 30 | return "text"; 31 | } 32 | 33 | public String getContent() { 34 | return content; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/ImageResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | /** 4 | * 回复图片消息 5 | * 6 | * @className ImageResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class ImageResponse implements WeixinResponse { 13 | 14 | /** 15 | * 通过上传多媒体文件,得到的id。 16 | */ 17 | private String mediaId; 18 | 19 | public ImageResponse(String mediaId) { 20 | this.mediaId = mediaId; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format( 26 | "", mediaId); 27 | } 28 | 29 | public String getMediaId() { 30 | return mediaId; 31 | } 32 | 33 | @Override 34 | public String getMsgType() { 35 | return "image"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/VoiceResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | /** 4 | * 回复语音消息 5 | * 6 | * @className VoiceResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class VoiceResponse implements WeixinResponse { 13 | 14 | /** 15 | * 通过上传多媒体文件,得到的id 16 | */ 17 | private String mediaId; 18 | 19 | public VoiceResponse(String mediaId) { 20 | this.mediaId = mediaId; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format( 26 | "", mediaId); 27 | } 28 | 29 | public String getMediaId() { 30 | return mediaId; 31 | } 32 | 33 | @Override 34 | public String getMsgType() { 35 | return "voice"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/ImageResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | /** 4 | * 回复图片消息 5 | * 6 | * @className ImageResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class ImageResponse implements WeixinResponse { 13 | 14 | /** 15 | * 通过上传多媒体文件,得到的id。 16 | */ 17 | private String mediaId; 18 | 19 | public ImageResponse(String mediaId) { 20 | this.mediaId = mediaId; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format( 26 | "", mediaId); 27 | } 28 | 29 | public String getMediaId() { 30 | return mediaId; 31 | } 32 | 33 | @Override 34 | public String getMsgType() { 35 | return "image"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/VoiceResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | /** 4 | * 回复语音消息 5 | * 6 | * @className VoiceResponse 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2015年5月5日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public class VoiceResponse implements WeixinResponse { 13 | 14 | /** 15 | * 通过上传多媒体文件,得到的id 16 | */ 17 | private String mediaId; 18 | 19 | public VoiceResponse(String mediaId) { 20 | this.mediaId = mediaId; 21 | } 22 | 23 | @Override 24 | public String toContent() { 25 | return String.format( 26 | "", mediaId); 27 | } 28 | 29 | public String getMediaId() { 30 | return mediaId; 31 | } 32 | 33 | @Override 34 | public String getMsgType() { 35 | return "voice"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/site/site.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | org.apache.maven.skins 7 | maven-fluido-skin 8 | 1.9 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | true 18 | true 19 | true 20 | pull-right 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/FieldNameType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type.card; 2 | 3 | /** 4 | * 会员信息类目半自定义名称 5 | * 6 | * @auther: Feng Yapeng 7 | * @since: 2016/12/15 10:37 8 | */ 9 | public enum FieldNameType { 10 | /** 11 | * 等级 12 | */ 13 | FIELD_NAME_TYPE_LEVEL, 14 | /** 15 | * 优惠券 16 | */ 17 | FIELD_NAME_TYPE_COUPON, 18 | /** 19 | * 印花 20 | */ 21 | FIELD_NAME_TYPE_STAMP, 22 | /** 23 | * 折扣 24 | */ 25 | FIELD_NAME_TYPE_DISCOUNT, 26 | /** 27 | * 成就 28 | */ 29 | FIELD_NAME_TYPE_ACHIEVEMEN, 30 | /** 31 | * 里程 32 | */ 33 | FIELD_NAME_TYPE_MILEAGE, 34 | /** 35 | * 集点 36 | */ 37 | FIELD_NAME_TYPE_SET_POINTS, 38 | /** 39 | * 次数 40 | */ 41 | FIELD_NAME_TYPE_TIMS; 42 | } 43 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/AbstractHttpResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | import java.io.ByteArrayInputStream; 4 | import java.io.InputStream; 5 | 6 | /** 7 | * 8 | * @className AbstractHttpResponse 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2015年9月7日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public abstract class AbstractHttpResponse implements HttpResponse { 15 | protected final static String KEEP_ALIVE = "keep-alive"; 16 | private final byte[] content; 17 | 18 | public AbstractHttpResponse(byte[] content) { 19 | this.content = content; 20 | } 21 | 22 | @Override 23 | public byte[] getContent() { 24 | return content; 25 | } 26 | 27 | @Override 28 | public InputStream getBody() { 29 | return content != null ? new ByteArrayInputStream(content) : null; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/HttpClientException.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | 4 | public class HttpClientException extends Exception { 5 | 6 | private static final long serialVersionUID = -1760373205801759702L; 7 | 8 | /** 9 | * Construct a new instance of {@code HttpClientException} with the given 10 | * message. 11 | * 12 | * @param msg 13 | * the message 14 | */ 15 | public HttpClientException(String msg) { 16 | super(msg); 17 | } 18 | 19 | /** 20 | * Construct a new instance of {@code HttpClientException} with the given 21 | * message and exception. 22 | * 23 | * @param msg 24 | * the message 25 | * @param ex 26 | * the exception 27 | */ 28 | public HttpClientException(String msg, Throwable ex) { 29 | super(msg, ex); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/WeixinSignature.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.sign; 2 | 3 | import com.foxinmy.weixin4j.pay.type.SignType; 4 | 5 | /** 6 | * 微信签名 7 | * 8 | * @className WeixinSignature 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年3月26日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public interface WeixinSignature { 15 | /** 16 | * 是否编码 17 | * 18 | * @return 19 | */ 20 | boolean encoder(); 21 | 22 | /** 23 | * 是否转换小写 24 | * 25 | * @return 26 | */ 27 | boolean lowerCase(); 28 | 29 | /** 30 | * 签名(默认的MD5签名) 31 | * 32 | * @param obj 33 | * @return 34 | */ 35 | String sign(Object obj); 36 | 37 | /** 38 | * 签名(指定签名算法) 39 | * 40 | * @param obj 41 | * @param signType 42 | * @return 43 | */ 44 | String sign(Object obj, SignType signType); 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/IdType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | /** 4 | * ID类型 5 | * 6 | * @className IdType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月1日 9 | * @since JDK 1.6 10 | * @see 11 | */ 12 | public enum IdType { 13 | /** 14 | * 微信退款单号 15 | */ 16 | REFUNDID("refund_id"), 17 | /** 18 | * 微信订单号 19 | */ 20 | TRANSACTIONID("transaction_id"), 21 | /** 22 | * 商户订单号 23 | */ 24 | TRADENO("out_trade_no"), 25 | /** 26 | * 商户退款号 27 | */ 28 | REFUNDNO("out_refund_no"), 29 | /** 30 | * 商户子订单号 31 | */ 32 | SUBORDERNO("sub_order_no"), 33 | /** 34 | * 微信子订单号 35 | */ 36 | SUBORDERID("sub_order_id"); 37 | private String name; 38 | 39 | IdType(String name) { 40 | this.name = name; 41 | } 42 | 43 | public String getName() { 44 | return name; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /weixin4j-mp/README.md: -------------------------------------------------------------------------------- 1 | weixin4j-mp 2 | =========== 3 | 4 | [微信公众平台](http://mp.weixin.qq.com/wiki)开发工具包 5 | ---------------------------------------------------- 6 | 7 | 功能列表 8 | ------- 9 | 10 | * CustomApi `多客服API` 11 | 12 | * DataApi `数据统计API` 13 | 14 | * GroupApi `分组管理API` 15 | 16 | * HelperApi `辅助API` 17 | 18 | * MassApi `群发消息API` 19 | 20 | * MediaApi `上传/下载媒体文件API` 21 | 22 | * MenuApi `底部菜单API` 23 | 24 | * NotifyApi `客服消息API` 25 | 26 | * OauthApi `oauth授权API` 27 | 28 | * Pay2Api `V2支付API` 29 | 30 | * QrApi `二维码API` 31 | 32 | * TmplApi `模板消息API` 33 | 34 | * UserApi `用户管理API` 35 | 36 | * TagApi `用户标签管理API` 37 | 38 | * ComponentApi `第三方组件API` 39 | 40 | * CardApi `卡券API` 41 | 42 | * CommentApi `评论API` 43 | 44 | [如何使用](https://github.com/foxinmy/weixin4j/wiki) 45 | --------- 46 | 47 | [更新LOG](./CHANGE.md) 48 | ---------------------- -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/profitsharing/ProfitId.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.profitsharing; 2 | 3 | import com.foxinmy.weixin4j.pay.type.ProfitIdType; 4 | 5 | /** 6 | * 分帐单单号 7 | * 8 | * @author kit 9 | * @date 2020年05月25日 10 | * @since weixin4j-pay 1.1.0 11 | */ 12 | public class ProfitId { 13 | private String id; 14 | private ProfitIdType idType; 15 | 16 | public ProfitId(String id, ProfitIdType type){ 17 | this.id = id; 18 | this.idType = type; 19 | } 20 | 21 | public String getId() { 22 | return id; 23 | } 24 | 25 | public void setId(String id) { 26 | this.id = id; 27 | } 28 | 29 | public ProfitIdType getIdType() { 30 | return idType; 31 | } 32 | 33 | public void setIdType(ProfitIdType idType) { 34 | this.idType = idType; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/mp/event/ScribeEventMessage.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.mp.event; 2 | 3 | import com.zone.weixin4j.type.EventType; 4 | 5 | /** 6 | * 关注/取消关注事件
包括直接关注与扫描关注 7 | * 8 | * @className ScribeEventMessage 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2014年4月6日 11 | * @since JDK 1.6 12 | * @see 订阅号、服务号的关注/取消关注事件 14 | */ 15 | public class ScribeEventMessage extends ScanEventMessage { 16 | 17 | private static final long serialVersionUID = -6846321620262204915L; 18 | 19 | public ScribeEventMessage() { 20 | super(EventType.subscribe.name()); 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "ScribeEventMessage [" + super.toString() + "]"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinSignature.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.sign; 2 | 3 | import com.foxinmy.weixin4j.type.SignType; 4 | 5 | /** 6 | * 微信签名 7 | * 8 | * @className WeixinSignature 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年3月26日 11 | * @since JDK 1.6 12 | * @see 13 | * @deprecated 迁移到子模块weixin4j-pay 14 | */ 15 | @Deprecated 16 | public interface WeixinSignature { 17 | /** 18 | * 是否编码 19 | * 20 | * @return 21 | */ 22 | public boolean encoder(); 23 | 24 | /** 25 | * 是否转换小写 26 | * 27 | * @return 28 | */ 29 | public boolean lowerCase(); 30 | 31 | /** 32 | * 签名类型 33 | * 34 | * @return 35 | */ 36 | public SignType getSignType(); 37 | 38 | /** 39 | * 签名 40 | * 41 | * @param obj 42 | * @return 43 | */ 44 | public String sign(Object obj); 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/handler/TextMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.example.server.handler; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; 6 | import com.foxinmy.weixin4j.message.TextMessage; 7 | import com.foxinmy.weixin4j.request.WeixinRequest; 8 | import com.foxinmy.weixin4j.response.TextResponse; 9 | import com.foxinmy.weixin4j.response.WeixinResponse; 10 | 11 | /** 12 | * 文本消息处理 13 | * 14 | * @className TextMessageHandler 15 | * @author jinyu(foxinmy@gmail.com) 16 | * @date 2015年11月18日 17 | * @since JDK 1.6 18 | */ 19 | @Component 20 | public class TextMessageHandler extends MessageHandlerAdapter { 21 | @Override 22 | public WeixinResponse doHandle0(TextMessage message) { 23 | return new TextResponse("收到了文本消息"); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/SemanticTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.test; 2 | 3 | import org.junit.Before; 4 | import org.junit.Test; 5 | 6 | import com.foxinmy.weixin4j.exception.WeixinException; 7 | import com.foxinmy.weixin4j.mp.api.HelperApi; 8 | import com.foxinmy.weixin4j.mp.model.SemQuery; 9 | import com.foxinmy.weixin4j.mp.type.SemCategory; 10 | 11 | public class SemanticTest extends TokenTest { 12 | private HelperApi helperApi; 13 | 14 | @Before 15 | public void init() { 16 | helperApi = new HelperApi(tokenManager); 17 | } 18 | 19 | @Test 20 | public void testApi() throws WeixinException { 21 | SemQuery query = SemQuery.build("附近有啥 100 元以内的保龄球馆"); 22 | query.city("北京").category(SemCategory.nearby); 23 | query.uid("opKwyt6IhrqPmTTZshyqH5W9gIVo"); 24 | System.out.println(query); 25 | System.out.println(helperApi.semantic(query)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-pay/src/test/java/com/foxinmy/weixin4j/pay/test/TestHmacSHA256Sign.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.test; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | import com.foxinmy.weixin4j.pay.sign.WeixinPaymentSignature; 5 | import com.foxinmy.weixin4j.pay.type.SignType; 6 | import org.junit.Assert; 7 | import org.junit.Test; 8 | 9 | /** 10 | * HmacSHA256签名算法测试 11 | * @author kit (kit_21cn@21cn.com) 12 | */ 13 | public class TestHmacSHA256Sign { 14 | @Test 15 | public void test(){ 16 | WeixinPaymentSignature signature = new WeixinPaymentSignature("muses"); 17 | JSONObject json = new JSONObject(); 18 | json.put("appid", "1"); 19 | json.put("mch_id", "2"); 20 | String sign = signature.sign(json, SignType.HMAC$SHA256); 21 | 22 | Assert.assertEquals("637CF27B23F731398B2BE0118F484191B3728749C25D1EEF7479B6E93033602C", sign); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/IdType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | /** 4 | * ID类型 5 | * 6 | * @className IdType 7 | * @author jinyu(foxinmy@gmail.com) 8 | * @date 2014年11月1日 9 | * @since JDK 1.6 10 | * @see 11 | * @deprecated 迁移到子模块weixin4j-pay 12 | */ 13 | @Deprecated 14 | public enum IdType { 15 | /** 16 | * 微信退款单号 17 | */ 18 | REFUNDID("refund_id"), 19 | /** 20 | * 微信订单号 21 | */ 22 | TRANSACTIONID("transaction_id"), 23 | /** 24 | * 商户订单号 25 | */ 26 | TRADENO("out_trade_no"), 27 | /** 28 | * 商户退款号 29 | */ 30 | REFUNDNO("out_refund_no"), 31 | /** 32 | * 商户子订单号 33 | */ 34 | SUBORDERNO("sub_order_no"), 35 | /** 36 | * 微信子订单号 37 | */ 38 | SUBORDERID("sub_order_id"); 39 | private String name; 40 | 41 | IdType(String name) { 42 | this.name = name; 43 | } 44 | 45 | public String getName() { 46 | return name; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/mp/event/ScribeEventMessage.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.event; 2 | 3 | import com.foxinmy.weixin4j.type.EventType; 4 | 5 | /** 6 | * 关注/取消关注事件
包括直接关注与扫描关注 7 | * 8 | * @className ScribeEventMessage 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2014年4月6日 11 | * @since JDK 1.6 12 | * @see 订阅号、服务号的关注/取消关注事件 14 | */ 15 | public class ScribeEventMessage extends ScanEventMessage { 16 | 17 | private static final long serialVersionUID = -6846321620262204915L; 18 | 19 | public ScribeEventMessage() { 20 | super(EventType.subscribe.name()); 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return "ScribeEventMessage [" + super.toString() + "]"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageMatcher.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.dispatcher; 2 | 3 | import com.foxinmy.weixin4j.request.WeixinMessage; 4 | 5 | /** 6 | * 微信消息匹配 7 | * 8 | * @className WeixinMessageMatcher 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2015年5月17日 11 | * @since JDK 1.6 12 | * @see DefaultMessageMatcher 13 | */ 14 | public interface WeixinMessageMatcher { 15 | /** 16 | * 匹配消息类型 17 | * 18 | * @param messageKey 19 | * 消息key 20 | * @return 消息类型 21 | */ 22 | public Class match(WeixinMessageKey messageKey); 23 | 24 | /** 25 | * 注册消息类型「程序没有及时更新而微信又产生了新的消息类型」 26 | * 27 | * @param messageKey 28 | * 消息key 29 | * @param messageClass 30 | * 消息类型 31 | */ 32 | public void regist(WeixinMessageKey messageKey, 33 | Class messageClass); 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/dispatcher/WeixinMessageMatcher.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.dispatcher; 2 | 3 | import com.zone.weixin4j.request.WeixinMessage; 4 | 5 | /** 6 | * 微信消息匹配 7 | * 8 | * @className WeixinMessageMatcher 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2015年5月17日 11 | * @since JDK 1.6 12 | * @see DefaultMessageMatcher 13 | */ 14 | public interface WeixinMessageMatcher { 15 | /** 16 | * 匹配消息类型 17 | * 18 | * @param messageKey 19 | * 消息key 20 | * @return 消息类型 21 | */ 22 | public Class match(WeixinMessageKey messageKey); 23 | 24 | /** 25 | * 注册消息类型「程序没有及时更新而微信又产生了新的消息类型」 26 | * 27 | * @param messageKey 28 | * 消息key 29 | * @param messageClass 30 | * 消息类型 31 | */ 32 | public void regist(WeixinMessageKey messageKey, 33 | Class messageClass); 34 | } 35 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/api/CustomMessageAdaptersTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import org.junit.Test; 6 | 7 | import com.alibaba.fastjson.JSON; 8 | import com.foxinmy.weixin4j.wxa.model.custommessage.CustomMessage; 9 | import com.foxinmy.weixin4j.wxa.model.custommessage.Text; 10 | 11 | public class CustomMessageAdaptersTest { 12 | 13 | @Test 14 | public void testToMap() { 15 | CustomMessage customMessage = new CustomMessage(); 16 | customMessage.setToUser("OPENID"); 17 | customMessage.setTuple(new Text("Hello World")); 18 | 19 | String json = JSON.toJSONString(CustomMessageAdapters.toMap(customMessage)); 20 | assertTrue(json.contains("\"touser\":\"OPENID\"")); 21 | assertTrue(json.contains("\"msgtype\":\"text\"")); 22 | assertTrue(json.contains("\"text\":{\"content\":\"Hello World\"}")); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/handler/SubscribeMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.example.server.handler; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; 6 | import com.foxinmy.weixin4j.mp.event.ScribeEventMessage; 7 | import com.foxinmy.weixin4j.request.WeixinRequest; 8 | import com.foxinmy.weixin4j.response.TextResponse; 9 | import com.foxinmy.weixin4j.response.WeixinResponse; 10 | 11 | /** 12 | * 处理关注消息 13 | * 14 | * @className SubscribeMessageHandler 15 | * @author jinyu(foxinmy@gmail.com) 16 | * @date 2015年12月3日 17 | * @since JDK 1.6 18 | */ 19 | @Component 20 | public class SubscribeMessageHandler extends MessageHandlerAdapter { 21 | 22 | @Override 23 | public WeixinResponse doHandle0(ScribeEventMessage message) { 24 | return new TextResponse("欢迎关注~"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/IdQuery.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * ID查询 7 | * 8 | * @className IdQuery 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2014年11月1日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public class IdQuery implements Serializable { 15 | 16 | private static final long serialVersionUID = -5273675987521807370L; 17 | /** 18 | * id值 19 | */ 20 | private String id; 21 | /** 22 | * id类型 23 | * 24 | * @see IdType 25 | */ 26 | private IdType type; 27 | 28 | public IdQuery(String id, IdType idType) { 29 | this.id = id; 30 | this.type = idType; 31 | } 32 | 33 | public String getId() { 34 | return id; 35 | } 36 | 37 | public IdType getType() { 38 | return type; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | return String.format("%s=%s", type.getName(), id); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/api/AddTemplateParameter.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.alibaba.fastjson.annotation.JSONField; 6 | 7 | class AddTemplateParameter implements Serializable { 8 | 9 | private static final long serialVersionUID = 2018052601L; 10 | 11 | private String id; 12 | private int[] keywordIds; 13 | 14 | public AddTemplateParameter() { 15 | } 16 | 17 | public AddTemplateParameter(String id, int[] keywordIds) { 18 | this.id = id; 19 | this.keywordIds = keywordIds; 20 | } 21 | 22 | public String getId() { 23 | return id; 24 | } 25 | 26 | public void setId(String id) { 27 | this.id = id; 28 | } 29 | 30 | @JSONField(name = "keyword_id_list") 31 | public int[] getKeywordIds() { 32 | return keywordIds; 33 | } 34 | 35 | public void setKeywordIds(int[] keywordIds) { 36 | this.keywordIds = keywordIds; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/api/Color.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.api; 2 | 3 | import java.io.Serializable; 4 | 5 | class Color implements Serializable { 6 | 7 | private static final long serialVersionUID = 2018052201L; 8 | 9 | private String r; 10 | private String g; 11 | private String b; 12 | 13 | public Color() { 14 | } 15 | 16 | public Color(java.awt.Color color) { 17 | this.r = String.valueOf(color.getRed()); 18 | this.g = String.valueOf(color.getGreen()); 19 | this.b = String.valueOf(color.getBlue()); 20 | } 21 | 22 | public String getR() { 23 | return r; 24 | } 25 | 26 | public void setR(String r) { 27 | this.r = r; 28 | } 29 | 30 | public String getG() { 31 | return g; 32 | } 33 | 34 | public void setG(String g) { 35 | this.g = g; 36 | } 37 | 38 | public String getB() { 39 | return b; 40 | } 41 | 42 | public void setB(String b) { 43 | this.b = b; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/test/java/com/foxinmy/weixin4j/wxa/model/SessionTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNull; 5 | 6 | import org.junit.Test; 7 | 8 | import com.alibaba.fastjson.JSON; 9 | 10 | public class SessionTest { 11 | 12 | @Test 13 | public void test() { 14 | Session session = JSON.parseObject("{\"openid\": \"OPENID\", \"session_key\": \"SESSIONKEY\"}", Session.class); 15 | assertEquals("OPENID", session.getOpenId()); 16 | assertEquals("SESSIONKEY", session.getSessionKey()); 17 | assertNull(session.getUnionId()); 18 | 19 | session = JSON.parseObject("{\"openid\": \"OPENID\", \"session_key\": \"SESSIONKEY\", \"unionid\": \"UNIONID\"}", Session.class); 20 | assertEquals("OPENID", session.getOpenId()); 21 | assertEquals("SESSIONKEY", session.getSessionKey()); 22 | assertEquals("UNIONID", session.getUnionId()); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/service/WeiXin4jContextAware.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.service; 2 | 3 | import com.zone.weixin4j.dispatcher.WeixinMessageMatcher; 4 | import com.zone.weixin4j.util.AesToken; 5 | import org.springframework.context.ApplicationContext; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * Created by Yz on 2017/3/15. 12 | * WeiXin4j上下文 13 | */ 14 | public interface WeiXin4jContextAware { 15 | 16 | boolean isOpenAlwaysResponse(); 17 | 18 | boolean isUseDebugMessageHandler(); 19 | 20 | List getAesTokens(); 21 | 22 | ApplicationContext getApplicationContext(); 23 | 24 | Map getAesTokenMap(); 25 | 26 | void setAesTokenMap(Map aesTokenMap); 27 | 28 | public WeixinMessageMatcher getWeixinMessageMatcher(); 29 | 30 | public void setWeixinMessageMatcher(WeixinMessageMatcher weixinMessageMatcher); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /weixin4j-qy/src/test/java/com/foxinmy/weixin4j/qy/test/HelperTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.test; 2 | 3 | import java.util.List; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Before; 7 | import org.junit.Test; 8 | 9 | import com.foxinmy.weixin4j.exception.WeixinException; 10 | import com.foxinmy.weixin4j.qy.api.HelperApi; 11 | 12 | /** 13 | * 辅助API测试 14 | * 15 | * @className HelperTest 16 | * @author jinyu(foxinmy@gmail.com) 17 | * @date 2014年12月28日 18 | * @since JDK 1.6 19 | * @see 20 | */ 21 | public class HelperTest extends TokenTest { 22 | public HelperApi helperApi; 23 | 24 | @Before 25 | public void init() { 26 | this.helperApi = new HelperApi(tokenManager); 27 | } 28 | 29 | @Test 30 | public void backip() throws WeixinException { 31 | List ips = helperApi.getWechatServerIp(); 32 | Assert.assertTrue(ips != null && !ips.isEmpty()); 33 | System.out.println(ips); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/type/profitsharing/RelationType.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.type.profitsharing; 2 | 3 | /** 4 | * 子商户与接收方的关系 5 | * 6 | * @author kit (kit.li@qq.com) 7 | * @date 2020年05月20日 8 | * @since weixin4j-pay 1.1.0 9 | */ 10 | public enum RelationType { 11 | /** 12 | * 服务商 13 | */ 14 | SERVICE_PROVIDER, 15 | /** 16 | * 门店 17 | */ 18 | STORE, 19 | /** 20 | * 员工 21 | */ 22 | STAFF, 23 | /** 24 | * 店主 25 | */ 26 | STORE_OWNER, 27 | /** 28 | * 合作伙伴 29 | */ 30 | PARTNER, 31 | /** 32 | * 总部 33 | */ 34 | HEADQUARTER, 35 | /** 36 | * 品牌方 37 | */ 38 | BRAND, 39 | /** 40 | * 分销商 41 | */ 42 | DISTRIBUTOR, 43 | /** 44 | * 用户 45 | */ 46 | USER, 47 | /** 48 | * 供应商 49 | */ 50 | SUPPLIER, 51 | /** 52 | * 自定义 53 | */ 54 | CUSTOM; 55 | } 56 | -------------------------------------------------------------------------------- /maven-version-rules.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | .*(-|\.)(alpha|Alpha|ALPHA|beta|Beta|BETA|rc|RC).* 9 | 10 | 11 | 12 | 13 | .*-alpha[\.\-].* 14 | .*-b[0-9]+ 15 | 16 | 17 | 18 | 19 | .*-b.* 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/handler/VoiceMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.example.server.handler; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import com.foxinmy.weixin4j.handler.MessageHandlerAdapter; 6 | import com.foxinmy.weixin4j.message.VoiceMessage; 7 | import com.foxinmy.weixin4j.request.WeixinRequest; 8 | import com.foxinmy.weixin4j.response.TextResponse; 9 | import com.foxinmy.weixin4j.response.WeixinResponse; 10 | 11 | /** 12 | * 只处理语音消息 13 | * 14 | * @className VoiceMessageHandler 15 | * @author jinyu(foxinmy@gmail.com) 16 | * @date 2015年11月18日 17 | * @since JDK 1.6 18 | */ 19 | @Component 20 | public class VoiceMessageHandler extends MessageHandlerAdapter { 21 | 22 | @Override 23 | public WeixinResponse doHandle0(VoiceMessage message) { 24 | /** 25 | * 返回一段文字给用户 26 | */ 27 | return new TextResponse("你讲了一句话"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/template/Keyword.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.template; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.alibaba.fastjson.annotation.JSONField; 6 | 7 | /** 8 | * 模板消息的模板里的关键词。 9 | * 10 | * @since 1.8 11 | */ 12 | public class Keyword implements Serializable { 13 | 14 | private static final long serialVersionUID = 2018052601L; 15 | 16 | private int id; 17 | private String name; 18 | private String example; 19 | 20 | public int getId() { 21 | return id; 22 | } 23 | 24 | @JSONField(name = "keyword_id") 25 | public void setId(int id) { 26 | this.id = id; 27 | } 28 | 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | public String getExample() { 38 | return example; 39 | } 40 | 41 | public void setExample(String example) { 42 | this.example = example; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/sign/AbstractWeixinSignature.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.sign; 2 | 3 | import com.foxinmy.weixin4j.util.MapUtil; 4 | 5 | /** 6 | * 微信签名 7 | * 8 | * @className AbstractWeixinSignature 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年3月26日 11 | * @since JDK 1.6 12 | * @see 13 | */ 14 | public abstract class AbstractWeixinSignature implements WeixinSignature { 15 | /** 16 | * 是否编码 17 | * 18 | * @return 默认false不进行编码 19 | */ 20 | @Override 21 | public boolean encoder() { 22 | return false; 23 | } 24 | 25 | /** 26 | * 是否转换小写 27 | * 28 | * @return 默认false不转换小写 29 | */ 30 | @Override 31 | public boolean lowerCase() { 32 | return false; 33 | } 34 | 35 | /** 36 | * 拼接字符串 37 | * 38 | * @param obj 39 | * @return 40 | */ 41 | protected StringBuilder join(Object obj) { 42 | return new StringBuilder(MapUtil.toJoinString(obj, encoder(), 43 | lowerCase())); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-wxa/src/main/java/com/foxinmy/weixin4j/wxa/model/custommessage/CustomMessage.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.wxa.model.custommessage; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.foxinmy.weixin4j.tuple.NotifyTuple; 6 | 7 | /** 8 | * 客服消息。 9 | * 10 | * @since 1.8 11 | */ 12 | public class CustomMessage implements Serializable { 13 | 14 | private static final long serialVersionUID = 2018052901L; 15 | 16 | private String toUser; 17 | 18 | private NotifyTuple tuple; 19 | 20 | public String getToUser() { 21 | return toUser; 22 | } 23 | 24 | public void setToUser(String toUser) { 25 | this.toUser = toUser; 26 | } 27 | 28 | public NotifyTuple getTuple() { 29 | return tuple; 30 | } 31 | 32 | /** 33 | * The {@link NotifyTuple}. 34 | * 35 | * @param tuple the tuple. 36 | * @see Text 37 | * @see Image 38 | * @see Link 39 | * @see MiniProgramPage 40 | */ 41 | public void setTuple(NotifyTuple tuple) { 42 | this.tuple = tuple; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/AbstractPayRequest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.payment.mch; 2 | 3 | import com.foxinmy.weixin4j.model.WeixinPayAccount; 4 | import com.foxinmy.weixin4j.sign.WeixinPaymentSignature; 5 | import com.foxinmy.weixin4j.sign.WeixinSignature; 6 | 7 | @Deprecated 8 | public abstract class AbstractPayRequest implements MchPayRequest { 9 | 10 | private final String prePayId; 11 | private final WeixinPayAccount paymentAccount; 12 | protected final WeixinSignature weixinSignature; 13 | 14 | public AbstractPayRequest(String prePayId, WeixinPayAccount paymentAccount) { 15 | this.prePayId = prePayId; 16 | this.paymentAccount = paymentAccount; 17 | this.weixinSignature = new WeixinPaymentSignature(paymentAccount.getPaySignKey()); 18 | } 19 | 20 | @Override 21 | public String getPrePayId() { 22 | return this.prePayId; 23 | } 24 | 25 | @Override 26 | public WeixinPayAccount getPaymentAccount() { 27 | return this.paymentAccount; 28 | } 29 | } -------------------------------------------------------------------------------- /weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/HelpTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.test; 2 | 3 | import java.util.List; 4 | 5 | import org.junit.Assert; 6 | import org.junit.Before; 7 | import org.junit.Test; 8 | 9 | import com.foxinmy.weixin4j.exception.WeixinException; 10 | import com.foxinmy.weixin4j.mp.api.HelperApi; 11 | 12 | public class HelpTest extends TokenTest { 13 | private HelperApi helperApi; 14 | 15 | @Before 16 | public void init() { 17 | helperApi = new HelperApi(tokenManager); 18 | } 19 | 20 | @Test 21 | public void getWechatServerIp() throws WeixinException { 22 | List ipList = helperApi.getWechatServerIp(); 23 | Assert.assertFalse(ipList.isEmpty()); 24 | } 25 | 26 | @Test 27 | public void getMenuSetting() throws WeixinException { 28 | System.err.println(helperApi.getMenuSetting()); 29 | } 30 | 31 | @Test 32 | public void getAutoReplySetting() throws WeixinException { 33 | System.err.println(helperApi.getAutoReplySetting()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-pay/src/main/java/com/foxinmy/weixin4j/pay/payment/mch/AbstractPayRequest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.pay.payment.mch; 2 | 3 | import com.foxinmy.weixin4j.pay.model.WeixinPayAccount; 4 | import com.foxinmy.weixin4j.pay.sign.WeixinPaymentSignature; 5 | import com.foxinmy.weixin4j.pay.sign.WeixinSignature; 6 | 7 | public abstract class AbstractPayRequest implements MchPayRequest { 8 | 9 | private final String prePayId; 10 | private final WeixinPayAccount paymentAccount; 11 | protected final WeixinSignature weixinSignature; 12 | 13 | public AbstractPayRequest(String prePayId, WeixinPayAccount paymentAccount) { 14 | this.prePayId = prePayId; 15 | this.paymentAccount = paymentAccount; 16 | this.weixinSignature = new WeixinPaymentSignature(paymentAccount.getPaySignKey()); 17 | } 18 | 19 | @Override 20 | public String getPrePayId() { 21 | return this.prePayId; 22 | } 23 | 24 | @Override 25 | public WeixinPayAccount getPaymentAccount() { 26 | return this.paymentAccount; 27 | } 28 | } -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/qy/event/ScribeEventMessage.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.qy.event; 2 | 3 | import com.zone.weixin4j.message.event.EventMessage; 4 | import com.zone.weixin4j.type.EventType; 5 | 6 | /** 7 | * 关注/取消关注事件
包括直接关注与扫描关注 8 | * 9 | * @className ScribeEventMessage 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2014年4月6日 12 | * @since JDK 1.6 13 | * @see 成员关注/取消关注事件 15 | */ 16 | public class ScribeEventMessage extends EventMessage { 17 | 18 | private static final long serialVersionUID = -6846321620262204915L; 19 | 20 | public ScribeEventMessage() { 21 | super(EventType.subscribe.name()); 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return "ScribeEventMessage [" + super.toString() + "]"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/IdQuery.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.type; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * ID查询 7 | * 8 | * @className IdQuery 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2014年11月1日 11 | * @since JDK 1.6 12 | * @see 13 | * @deprecated 迁移到子模块weixin4j-pay 14 | */ 15 | @Deprecated 16 | public class IdQuery implements Serializable { 17 | 18 | private static final long serialVersionUID = -5273675987521807370L; 19 | /** 20 | * id值 21 | */ 22 | private String id; 23 | /** 24 | * id类型 25 | * 26 | * @see com.foxinmy.weixin4j.type.IdType 27 | */ 28 | private IdType type; 29 | 30 | public IdQuery(String id, IdType idType) { 31 | this.id = id; 32 | this.type = idType; 33 | } 34 | 35 | public String getId() { 36 | return id; 37 | } 38 | 39 | public IdType getType() { 40 | return type; 41 | } 42 | 43 | @Override 44 | public String toString() { 45 | return String.format("%s=%s", type.getName(), id); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/RegexUtil.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.util; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** 7 | * 正则表达式工具类 8 | * 9 | * @className RegexUtil 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2015年12月8日 12 | * @since JDK 1.7 13 | * @see 14 | */ 15 | public final class RegexUtil { 16 | /** 17 | * Content-disposition 中的 filename提取正则 18 | */ 19 | private static final Pattern FILENAME_RGX = Pattern 20 | .compile("(?<=filename=\").*?(?=\")"); 21 | 22 | /** 23 | * 从 Content-disposition提取文件名 24 | * 25 | * @param contentDisposition 26 | * @return 27 | */ 28 | public static String regexFileNameFromContentDispositionHeader( 29 | String contentDisposition) { 30 | if (StringUtil.isBlank(contentDisposition)) { 31 | return null; 32 | } 33 | Matcher filenameMatcher = FILENAME_RGX.matcher(contentDisposition); 34 | return filenameMatcher.find() ? filenameMatcher.group() : null; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/AbstractWeixinSignature.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.sign; 2 | 3 | import com.foxinmy.weixin4j.util.MapUtil; 4 | 5 | /** 6 | * 微信签名 7 | * 8 | * @className AbstractWeixinSignature 9 | * @author jinyu(foxinmy@gmail.com) 10 | * @date 2016年3月26日 11 | * @since JDK 1.6 12 | * @see 13 | * @deprecated 迁移到子模块weixin4j-pay 14 | */ 15 | @Deprecated 16 | public abstract class AbstractWeixinSignature implements WeixinSignature { 17 | /** 18 | * 是否编码 19 | * 20 | * @return 默认false不进行编码 21 | */ 22 | @Override 23 | public boolean encoder() { 24 | return false; 25 | } 26 | 27 | /** 28 | * 是否转换小写 29 | * 30 | * @return 默认false不转换小写 31 | */ 32 | @Override 33 | public boolean lowerCase() { 34 | return false; 35 | } 36 | 37 | /** 38 | * 拼接字符串 39 | * 40 | * @param obj 41 | * @return 42 | */ 43 | protected StringBuilder join(Object obj) { 44 | return new StringBuilder(MapUtil.toJoinString(obj, encoder(), 45 | lowerCase())); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/resources/spring-weixin4j-server.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/service/WxService.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.service; 2 | 3 | import com.zone.weixin4j.exception.HttpResponseException; 4 | import com.zone.weixin4j.exception.MessageInterceptorException; 5 | import com.zone.weixin4j.exception.WeixinException; 6 | import com.zone.weixin4j.request.WeixinRequest; 7 | import com.zone.weixin4j.response.WeixinResponse; 8 | import com.zone.weixin4j.util.AesToken; 9 | 10 | import javax.servlet.http.HttpServletRequest; 11 | 12 | /** 13 | * Created by Yz on 2017/3/14. 14 | * WxServiceImpl 15 | */ 16 | public interface WxService { 17 | 18 | WeixinResponse processRequest(String uri, String encryptType, String echostr, String timestamp, String nonce, String signature, String msg_signature, String messageContent, AesToken aesToken, HttpServletRequest request) throws WeixinException, HttpResponseException, MessageInterceptorException; 19 | 20 | String transferResponse(WeixinResponse weixinResponse) throws WeixinException; 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/support/okhttp/OkHttpClientFactory.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http.support.okhttp; 2 | 3 | import com.foxinmy.weixin4j.http.HttpClient; 4 | import com.foxinmy.weixin4j.http.HttpParams; 5 | import com.foxinmy.weixin4j.http.factory.HttpClientFactory; 6 | 7 | /** 8 | * 使用OkHttp 9 | * 10 | * @className OkHttpClientFactory 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2016年7月25日 13 | * @since JDK 1.6 14 | */ 15 | public class OkHttpClientFactory extends HttpClientFactory { 16 | private static HttpClientFactory okHttpClientFactory; 17 | static { 18 | try { 19 | okHttpClientFactory = new OkHttpClient3Factory(); 20 | } catch (Throwable e1) { 21 | try { 22 | okHttpClientFactory = new OkHttpClient2Factory(); 23 | } catch (Throwable e2) { 24 | throw new RuntimeException(e2); 25 | } 26 | } 27 | } 28 | 29 | @Override 30 | public HttpClient newInstance(HttpParams params) { 31 | return okHttpClientFactory.newInstance(params); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/WeixinProxyTest.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.test; 2 | 3 | import java.util.List; 4 | 5 | import org.junit.Before; 6 | import org.junit.Test; 7 | 8 | import com.foxinmy.weixin4j.exception.WeixinException; 9 | import com.foxinmy.weixin4j.mp.WeixinProxy; 10 | import com.foxinmy.weixin4j.mp.model.Menu; 11 | 12 | /** 13 | * 微信接口测试 14 | * 15 | * @className WeixinProxyTest 16 | * @author jinyu(foxinmy@gmail.com) 17 | * @date 2016年8月18日 18 | * @since JDK 1.6 19 | * @see 20 | */ 21 | public class WeixinProxyTest { 22 | private WeixinProxy weixinProxy; 23 | 24 | @Before 25 | public void init() { 26 | this.weixinProxy = new WeixinProxy(); 27 | // Weixin4jSettings settings = new 28 | // Weixin4jSettings(RediscacheStorager); 29 | // this.weixinProxy= new WeixinProxy(settings); 30 | } 31 | 32 | @Test 33 | public void test() throws WeixinException{ 34 | List buttons = weixinProxy.getAllMenu(); 35 | System.err.println(buttons); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/qy/event/ScribeEventMessage.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.qy.event; 2 | 3 | import com.foxinmy.weixin4j.message.event.EventMessage; 4 | import com.foxinmy.weixin4j.type.EventType; 5 | 6 | /** 7 | * 关注/取消关注事件
包括直接关注与扫描关注 8 | * 9 | * @className ScribeEventMessage 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2014年4月6日 12 | * @since JDK 1.6 13 | * @see 成员关注/取消关注事件 15 | */ 16 | public class ScribeEventMessage extends EventMessage { 17 | 18 | private static final long serialVersionUID = -6846321620262204915L; 19 | 20 | public ScribeEventMessage() { 21 | super(EventType.subscribe.name()); 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return "ScribeEventMessage [" + super.toString() + "]"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/URLParameter.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.http; 2 | 3 | import com.foxinmy.weixin4j.util.Consts; 4 | import com.foxinmy.weixin4j.util.NameValue; 5 | import com.foxinmy.weixin4j.util.URLEncodingUtil; 6 | 7 | /** 8 | * 键值对参数 9 | * 10 | * @className UrlParameter 11 | * @author jinyu(foxinmy@gmail.com) 12 | * @date 2015年5月29日 13 | * @since JDK 1.6 14 | * @see 15 | */ 16 | public class URLParameter extends NameValue { 17 | 18 | private static final long serialVersionUID = -115491642760990655L; 19 | 20 | public URLParameter(String name, String value) { 21 | super(name, value); 22 | } 23 | 24 | public String encoding() { 25 | return String.format("%s=%s", 26 | URLEncodingUtil.encoding(getName(), Consts.UTF_8, true), 27 | URLEncodingUtil.encoding(getValue(), Consts.UTF_8, true)); 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | return String.format("[URLParameter name=%s, value=%s]", getName(), 33 | getValue()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /weixin4j-serverX/src/main/java/com/zone/weixin4j/response/WeixinResponse.java: -------------------------------------------------------------------------------- 1 | package com.zone.weixin4j.response; 2 | 3 | 4 | /** 5 | * 微信被动消息回复 6 | * 7 | * @className WeixinResponse 8 | * @author jinyu(foxinmy@gmail.com) 9 | * @date 2015年5月5日 10 | * @since JDK 1.6 11 | * @see TextResponse 12 | * @see ImageResponse 13 | * @see MusicResponse 14 | * @see VoiceResponse 15 | * @see VideoResponse 16 | * @see NewsResponse 17 | * @see TransferCustomerResponse 18 | * @see SingleResponse 19 | * @see BlankResponse 20 | * @see 订阅号、服务号的被动响应消息 22 | * @see 企业号的被动响应消息 24 | */ 25 | public interface WeixinResponse { 26 | /** 27 | * 回复的消息类型 28 | * 29 | * @return 30 | */ 31 | public String getMsgType(); 32 | 33 | /** 34 | * 回复的消息内容 35 | * 36 | * @return 37 | */ 38 | public String toContent(); 39 | } 40 | -------------------------------------------------------------------------------- /assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | full 7 | 8 | jar 9 | 10 | false 11 | 12 | 13 | target/classes 14 | / 15 | 16 | /** 17 | 18 | 19 | *.properties 20 | *.xml 21 | 22 | 23 | 24 | 25 | 26 | true 27 | 28 | com.foxinmy:weixin4j-base 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/tuple/Text.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.tuple; 2 | 3 | import com.alibaba.fastjson.annotation.JSONCreator; 4 | import com.alibaba.fastjson.annotation.JSONField; 5 | 6 | /** 7 | * 文本对象 8 | *

9 | * 可用于「客服消息」「群发消息」及企业号的「聊天消息」 10 | *

11 | * 12 | * @className Text 13 | * @author jinyu(foxinmy@gmail.com) 14 | * @date 2014年9月29日 15 | * @since JDK 1.6 16 | * @see 17 | */ 18 | public class Text implements MassTuple, NotifyTuple, ChatTuple { 19 | 20 | private static final long serialVersionUID = 520050144519064503L; 21 | 22 | @Override 23 | public String getMessageType() { 24 | return "text"; 25 | } 26 | 27 | /** 28 | * 内容 29 | */ 30 | private String content; 31 | 32 | @JSONCreator 33 | public Text(@JSONField(name = "content") String content) { 34 | this.content = content; 35 | } 36 | 37 | public String getContent() { 38 | return content; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | return "Text [content=" + content + "]"; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/NameValue.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.util; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.alibaba.fastjson.annotation.JSONCreator; 6 | import com.alibaba.fastjson.annotation.JSONField; 7 | 8 | /** 9 | * name-value 10 | * 11 | * @className NameValue 12 | * @author jinyu(foxinmy@gmail.com) 13 | * @date 2015年3月29日 14 | * @since JDK 1.6 15 | * @see 16 | */ 17 | public class NameValue implements Serializable { 18 | 19 | private static final long serialVersionUID = -348620146718819093L; 20 | private String name; 21 | private String value; 22 | 23 | @JSONCreator 24 | public NameValue(@JSONField(name = "name") String name, 25 | @JSONField(name = "value") String value) { 26 | this.name = name; 27 | this.value = value; 28 | } 29 | 30 | public String getName() { 31 | return name; 32 | } 33 | 34 | public String getValue() { 35 | return value; 36 | } 37 | 38 | @Override 39 | public String toString() { 40 | return "NameValue [name=" + name + ", value=" + value + "]"; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/PerTicketManager.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.token; 2 | 3 | import com.foxinmy.weixin4j.cache.CacheStorager; 4 | import com.foxinmy.weixin4j.model.Token; 5 | 6 | /** 7 | * 第三方应用永久授权码的存取 8 | * 9 | * @className PerTicketManager 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2015年6月22日 12 | * @since JDK 1.6 13 | */ 14 | public class PerTicketManager extends TicketManager { 15 | 16 | private final String authAppId; 17 | 18 | public PerTicketManager(String authAppId, String thirdId, 19 | String thirdSecret, CacheStorager cacheStorager) { 20 | super(thirdId, thirdSecret, cacheStorager); 21 | this.authAppId = authAppId; 22 | } 23 | 24 | /** 25 | * 获取永久授权码的key 26 | * 27 | * @return 28 | */ 29 | @Override 30 | public String getCacheKey() { 31 | return String.format("%sthird_party_percode_ticket_%s_%s", 32 | TokenCreator.CACHEKEY_PREFIX, getThirdId(), authAppId); 33 | } 34 | 35 | public String getAuthAppId() { 36 | return authAppId; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.1 经典模块化前端框架@LGPL www.layui.com By 贤心 */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #ddd;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /weixin4j-base/src/main/java/com/foxinmy/weixin4j/sign/WeixinPaymentSignature.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.sign; 2 | 3 | import com.foxinmy.weixin4j.type.SignType; 4 | import com.foxinmy.weixin4j.util.DigestUtil; 5 | 6 | /** 7 | * 微信支付签名实现 8 | * 9 | * @className WeixinPaymentSignature 10 | * @author jinyu(foxinmy@gmail.com) 11 | * @date 2016年3月26日 12 | * @since JDK 1.6 13 | * @see 支付签名说明 15 | * @deprecated 迁移到子模块weixin4j-pay 16 | */ 17 | @Deprecated 18 | public class WeixinPaymentSignature extends AbstractWeixinSignature { 19 | /** 20 | * 支付密钥 21 | */ 22 | private final String paySignKey; 23 | 24 | public WeixinPaymentSignature(String paySignKey) { 25 | this.paySignKey = paySignKey; 26 | } 27 | 28 | @Override 29 | public SignType getSignType() { 30 | return SignType.MD5; 31 | } 32 | 33 | @Override 34 | public String sign(Object obj) { 35 | StringBuilder sb = join(obj).append("&key=").append(paySignKey); 36 | return DigestUtil.MD5(sb.toString()).toUpperCase(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/java/com/foxinmy/weixin4j/example/server/handler/ChatMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.example.server.handler; 2 | 3 | import java.util.Set; 4 | 5 | import com.foxinmy.weixin4j.handler.WeixinMessageHandler; 6 | import com.foxinmy.weixin4j.qy.chat.WeixinChatMessage; 7 | import com.foxinmy.weixin4j.request.WeixinMessage; 8 | import com.foxinmy.weixin4j.request.WeixinRequest; 9 | import com.foxinmy.weixin4j.response.BlankResponse; 10 | import com.foxinmy.weixin4j.response.WeixinResponse; 11 | 12 | public class ChatMessageHandler implements WeixinMessageHandler { 13 | 14 | @Override 15 | public boolean canHandle(WeixinRequest request, WeixinMessage message, Set nodeNames) { 16 | return nodeNames.contains("PackageId"); 17 | } 18 | 19 | @Override 20 | public WeixinResponse doHandle(WeixinRequest request, WeixinMessage message) { 21 | WeixinChatMessage chatMessage = null; // 转换为实体 22 | return BlankResponse.global; 23 | } 24 | 25 | @Override 26 | public int weight() { 27 | return 0; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /weixin4j-server/src/main/java/com/foxinmy/weixin4j/response/WeixinResponse.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.response; 2 | 3 | 4 | /** 5 | * 微信被动消息回复 6 | * 7 | * @className WeixinResponse 8 | * @author jinyu(foxinmy@gmail.com) 9 | * @date 2015年5月5日 10 | * @since JDK 1.6 11 | * @see TextResponse 12 | * @see ImageResponse 13 | * @see MusicResponse 14 | * @see VoiceResponse 15 | * @see VideoResponse 16 | * @see NewsResponse 17 | * @see TransferCustomerResponse 18 | * @see SingleResponse 19 | * @see BlankResponse 20 | * @see 订阅号、服务号的被动响应消息 22 | * @see 企业号的被动响应消息 24 | */ 25 | public interface WeixinResponse { 26 | /** 27 | * 回复的消息类型 28 | * 29 | * @return 30 | */ 31 | public String getMsgType(); 32 | 33 | /** 34 | * 回复的消息内容 35 | * 36 | * @return 37 | */ 38 | public String toContent(); 39 | } 40 | -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/static/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.1 经典模块化前端框架 LGPL license By www.layui.com */ 2 | ;layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['
    ',l.bar1?'
  • '+t[0]+"
  • ":"",l.bar2?'
  • '+t[1]+"
  • ":"",'
  • '+t[2]+"
  • ","
"].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)}); -------------------------------------------------------------------------------- /weixin4j-example/src/main/webapp/WEB-INF/view/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" contentType="text/html; charset=UTF-8" 2 | pageEncoding="UTF-8"%> 3 | <%@ include file="/WEB-INF/view/taglibs.jsp"%> 4 | 5 | 6 | 7 | 8 | 10 | weixin4j 11 | 12 | 13 | 14 | 15 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/model/MenuSetting.java: -------------------------------------------------------------------------------- 1 | package com.foxinmy.weixin4j.mp.model; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | import com.foxinmy.weixin4j.model.Button; 7 | 8 | /** 9 | * 自定义菜单配置 10 | * 11 | * @className MenuSetting 12 | * @author jinyu(foxinmy@gmail.com) 13 | * @date 2015年4月14日 14 | * @since JDK 1.6 15 | * @see 16 | */ 17 | public class MenuSetting implements Serializable { 18 | 19 | private static final long serialVersionUID = 2461505572495855830L; 20 | 21 | /** 22 | * 菜单是否开启 23 | */ 24 | private boolean isMenuOpen; 25 | /** 26 | * 菜单列表 27 | */ 28 | private List