diff --git a/README.md b/README.md index 84ad680e1a..4bf7de631d 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,25 @@ -weixin-java-tools +# Weixin-java-tools +## 微信公众号、企业号Java SDK。 -[![Build Status](https://travis-ci.org/chanjarster/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/chanjarster/weixin-java-tools) -![Maven Central](https://img.shields.io/maven-central/v/me.chanjar/weixin-java-parent.svg) -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/chanjarster/weixin-java-tools?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/binarywang/weixin-java-tools.svg?branch=develop)](https://travis-ci.org/binarywang/weixin-java-tools) +![Maven Central](https://img.shields.io/maven-central/v/com.github.binarywang/weixin-java-parent.svg) + +### 详细文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。 + +#### 1.3.4版发布!!! By Binary Wang 2016-06-01 -=========== -* 群/聊天室:请点击上方的GITTER按钮 -* 本项目的发布周期:本人子2015年6月开始进入到了一个非常忙碌的状态,且公司目前也没有开发微信相关的项目,因此本项目的维护基本靠“等”。所以靠人不如靠自己,提交pull request吧。 +=========== +* QQ群:343954419 +* 微信群: +![Alt text](https://raw.githubusercontent.com/binarywang/weixin-java-tools/master/weixinqun.jpg "微信群") + =========== -微信公众号、企业号Java SDK。 +## 发布周期 +暂定为一月一次发布,月初或月底发布新版本,遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request。 -详细文档请看 [wiki](https://github.com/chanjarster/weixin-java-tools/wiki)。 ## Quick Start @@ -21,9 +27,9 @@ weixin-java-tools ```xml - me.chanjar + com.github.binarywang weixin-java-mp - 1.3.3 + 1.3.4 ``` @@ -31,9 +37,9 @@ weixin-java-tools ```xml - me.chanjar + com.github.binarywang weixin-java-cp - 1.3.3 + 1.3.4 ``` @@ -51,14 +57,8 @@ weixin-java-tools ``` -## 升级指南 - -* [1.0.3升级指南](https://github.com/chanjarster/weixin-java-tools/wiki/1_0_3升级指南) -* [1.1.0升级指南](https://github.com/chanjarster/weixin-java-tools/wiki/1_1_0升级指南) -* [1.1.1升级指南](https://github.com/chanjarster/weixin-java-tools/wiki/1_1_1升级指南) - ## 关于Pull Request 非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于[git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow)开发流程,因此在发起Pull Request的时候请选择develop分支。 -且本项目代码风格是用2个空格代表一个tab,因此在发起PR时注意一下,否则很容易发生在IDE格式化代码后与原代码产生大量diff,这样我在阅读PR的时候就很困难。 +且本项目代码风格是用2个空格代表一个tab,因此在发起PR时注意一下,否则很容易发生在IDE格式化代码后与原代码产生大量diff,这样我在阅读PR的时候就很困难。 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7f6b66a644..3ac86ee876 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - me.chanjar + com.github.binarywang weixin-java-parent - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT pom WeiXin Java Tools - Parent 微信公众号、企业号上级POM - https://github.com/chanjarster/weixin-java-tools + https://github.com/binarywang/weixin-java-tools @@ -23,12 +23,16 @@ Daniel Qian chanjarster@gmail.com + + Binary Wang + binarywang@gmail.com + - scm:git:https://github.com/chanjarster/weixin-java-tools.git - scm:git:git@github.com:chanjarster/weixin-java-tools.git - https://github.com/chanjarster/weixin-java-tools + scm:git:https://github.com/binarywang/weixin-java-tools.git + scm:git:git@github.com:binarywang/weixin-java-tools.git + https://github.com/binarywang/weixin-java-tools @@ -144,6 +148,16 @@ + + doclint-java8-disable + + [1.8,) + + + -Xdoclint:none + + + release @@ -174,6 +188,7 @@ + ${javadoc.opts} UTF-8 zh_CN diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml index 230484ac3d..38749b9fb0 100644 --- a/weixin-java-common/pom.xml +++ b/weixin-java-common/pom.xml @@ -4,9 +4,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - me.chanjar + com.github.binarywang weixin-java-parent - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT weixin-java-common @@ -27,31 +27,26 @@ org.testng testng - 6.8.7 test org.mockito mockito-all - 1.9.5 test com.google.inject guice - 3.0 test org.eclipse.jetty jetty-server - 9.3.0.M0 test org.eclipse.jetty jetty-servlet - 9.3.0.M0 test diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java index c923e4f6bd..ce69a10462 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessToken.java @@ -5,6 +5,7 @@ import java.io.Serializable; public class WxAccessToken implements Serializable { + private static final long serialVersionUID = 8709719312922168909L; private String accessToken; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java index 5d4d46a9c8..e1d1b058f3 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxCardApiSignature.java @@ -10,6 +10,8 @@ */ public class WxCardApiSignature implements Serializable { + private static final long serialVersionUID = 158176707226975979L; + private String appId; private String cardId; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java index 886fd36001..74f0b1b1ab 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxJsapiSignature.java @@ -6,6 +6,8 @@ * jspai signature */ public class WxJsapiSignature implements Serializable { + private static final long serialVersionUID = -1116808193154384804L; + private String appid; private String noncestr; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java index ccc7bc490d..d33f47e3bb 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxMenu.java @@ -16,6 +16,8 @@ */ public class WxMenu implements Serializable { + private static final long serialVersionUID = -7083914585539687746L; + private List buttons = new ArrayList(); private WxMenuRule matchRule; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java index 740841b9ae..737f506f69 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxError.java @@ -12,6 +12,8 @@ */ public class WxError implements Serializable { + private static final long serialVersionUID = 7869786563361406291L; + private int errorCode; private String errorMsg; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java index 0ac7fe8a7c..500dc0000a 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMediaUploadResult.java @@ -5,7 +5,8 @@ import java.io.Serializable; public class WxMediaUploadResult implements Serializable { - + private static final long serialVersionUID = 330834334738622341L; + private String type; private String mediaId; private String thumbMediaId; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java index a711c590d2..bd6ec15eeb 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/SHA1.java @@ -1,11 +1,10 @@ package me.chanjar.weixin.common.util.crypto; -import org.apache.commons.codec.digest.DigestUtils; - -import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import org.apache.commons.codec.digest.DigestUtils; + /** * Created by Daniel Qian on 14/10/19. */ diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java index a9ebfc2c75..a8fa9e15f7 100755 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java @@ -83,7 +83,7 @@ public String encrypt(String plainText) { String encryptedXml = encrypt(genRandomStr(), plainText); // 生成安全签名 - String timeStamp = timeStamp = Long.toString(System.currentTimeMillis() / 1000l); + String timeStamp = Long.toString(System.currentTimeMillis() / 1000l); String nonce = genRandomStr(); try { diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java index 5d407cb951..b0d498a345 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java @@ -5,7 +5,6 @@ import org.apache.http.HttpHost; import org.apache.http.client.ClientProtocolException; import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; import me.chanjar.weixin.common.exception.WxErrorException; diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java index d545a796f7..1caa0a068b 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamInitializer.java @@ -1,19 +1,15 @@ package me.chanjar.weixin.common.util.xml; +import java.io.Writer; + import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.converters.basic.DoubleConverter; -import com.thoughtworks.xstream.converters.basic.FloatConverter; -import com.thoughtworks.xstream.converters.basic.IntConverter; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.XppDriver; -import com.thoughtworks.xstream.security.NoTypePermission; import com.thoughtworks.xstream.security.NullPermission; import com.thoughtworks.xstream.security.PrimitiveTypePermission; -import java.io.Writer; - public class XStreamInitializer { public static XStream getInstance() { diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 2fc13c3d11..38e14fa72e 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -4,9 +4,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - me.chanjar + com.github.binarywang weixin-java-parent - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT weixin-java-cp @@ -15,7 +15,7 @@ - me.chanjar + com.github.binarywang weixin-java-common ${project.version} @@ -27,31 +27,26 @@ org.testng testng - 6.8.7 test org.mockito mockito-all - 1.9.5 test com.google.inject guice - 3.0 test org.eclipse.jetty jetty-server - 9.3.0.M0 test org.eclipse.jetty jetty-servlet - 9.3.0.M0 test diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml index cc761298f5..ada2e442cb 100644 --- a/weixin-java-mp/pom.xml +++ b/weixin-java-mp/pom.xml @@ -4,9 +4,9 @@ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - me.chanjar + com.github.binarywang weixin-java-parent - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT weixin-java-mp WeiXin Java Tools - MP @@ -14,7 +14,7 @@ - me.chanjar + com.github.binarywang weixin-java-common ${project.version} @@ -26,31 +26,26 @@ org.testng testng - 6.8.7 test org.mockito mockito-all - 1.9.5 test com.google.inject guice - 3.0 test org.eclipse.jetty jetty-server - 9.3.0.M0 test org.eclipse.jetty jetty-servlet - 9.3.0.M0 test diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java index 16ca6bca26..c2c2f21693 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java @@ -351,7 +351,7 @@ public interface WxMpService { * @throws WxErrorException */ public void menuDelete(String menuid) throws WxErrorException; - + /** *
    * 自定义菜单查询接口
@@ -361,7 +361,7 @@ public interface WxMpService {
    * @throws WxErrorException
    */
   public WxMenu menuGet() throws WxErrorException;
-  
+
   /**
    * 
    * 测试个性化菜单匹配结果
@@ -723,7 +723,7 @@ public interface WxMpService {
   /**
    * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
    * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
-   * 
+   *
    * @param parameters
    *            All required/optional parameters for weixin payment
    * @return
@@ -737,10 +737,10 @@ public interface WxMpService {
    * @param parameters
    *            the required or optional parameters
    * @return
- * @throws WxErrorException 
+ * @throws WxErrorException
    */
-  Map getJSSDKPayInfo(Map parameters) throws WxErrorException;  	
-  	
+  Map getJSSDKPayInfo(Map parameters) throws WxErrorException;
+
   /**
    * 该接口调用“统一下单”接口,并拼装JSSDK发起支付请求需要的参数
    * 详见http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E5.8F.91.E8.B5.B7.E4.B8.80.E4.B8.AA.E5.BE.AE.E4.BF.A1.E6.94.AF.E4.BB.98.E8.AF.B7.E6.B1.82
@@ -752,7 +752,7 @@ public interface WxMpService {
    * @param ip 发起支付的客户端IP
    * @param notifyUrl 通知地址
    * @return
- * @throws WxErrorException 
+ * @throws WxErrorException
    * @deprecated Use me.chanjar.weixin.mp.api.WxMpService.getJSSDKPayInfo(Map) instead
    */
   @Deprecated
@@ -773,7 +773,7 @@ public interface WxMpService {
      * @return
      */
     WxMpPayCallback getJSSDKCallbackData(String xmlData);
-    
+
     /**
      * 微信支付-申请退款
      * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
@@ -784,10 +784,10 @@ public interface WxMpService {
      *        
  • total_fee *
  • refund_fee * @return 退款操作结果 - * @throws WxErrorException + * @throws WxErrorException */ public WxMpPayRefundResult refundPay(Map parameters) throws WxErrorException; - + /** *
          * 计算Map键值对是否和签名相符,
    @@ -914,7 +914,7 @@ public WxMpCardResult queryCardCode(String cardId, String code, boolean checkCon
          */
       public void markCardCode(String code, String cardId, String openId, boolean isMark) throws
           WxErrorException;
    -  
    +
       /**
        * 查看卡券详情接口
        * 详见 https://mp.weixin.qq.com/wiki/14/8dd77aeaee85f922db5f8aa6386d385e.html#.E6.9F.A5.E7.9C.8B.E5.8D.A1.E5.88.B8.E8.AF.A6.E6.83.85
    @@ -925,4 +925,26 @@ public void markCardCode(String code, String cardId, String openId, boolean isMa
        * @throws WxErrorException
        */
       public String getCardDetail(String cardId) throws WxErrorException;
    +
    +  /*
    +     * 
    +     * 预览接口
    +     * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E9.A2.84.E8.A7.88.E6.8E.A5.E5.8F.A3.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91
    +     * 
    + * @param wxMpMassPreviewMessage + * @return wxMpMassSendResult + * @throws WxErrorException + */ + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception; + + /* + *
    +     * 上传图文消息内的图片获取URL
    +     * 详情请见:http://mp.weixin.qq.com/wiki/15/40b6865b893947b764e2de8e4a1fb55f.html#.E4.B8.8A.E4.BC.A0.E5.9B.BE.E6.96.87.E6.B6.88.E6.81.AF.E5.86.85.E7.9A.84.E5.9B.BE.E7.89.87.E8.8E.B7.E5.8F.96URL.E3.80.90.E8.AE.A2.E9.98.85.E5.8F.B7.E4.B8.8E.E6.9C.8D.E5.8A.A1.E5.8F.B7.E8.AE.A4.E8.AF.81.E5.90.8E.E5.9D.87.E5.8F.AF.E7.94.A8.E3.80.91
    +     * 
    + * @param file + * @return WxMediaImgUploadResult 返回图片url + * @throws WxErrorException + */ + public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java index 1805b27107..cbfa7dec14 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpServiceImpl.java @@ -1259,4 +1259,17 @@ public String getCardDetail(String cardId) throws WxErrorException { return responseContent; } + @Override + public WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception { + String url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview"; + String responseContent = execute(new SimplePostRequestExecutor(), url, wxMpMassPreviewMessage.toJson()); + return WxMpMassSendResult.fromJson(responseContent); + } + + @Override + public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException { + String url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg"; + return execute(new MediaImgUploadRequestExecutor(), url, file); + } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java new file mode 100644 index 0000000000..154195dbb7 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/WxMpMassPreviewMessage.java @@ -0,0 +1,68 @@ +package me.chanjar.weixin.mp.bean; + +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + +/** + * @author miller + */ +public class WxMpMassPreviewMessage implements Serializable { + private String toWxUsername; + private String msgType; + private String content; + private String mediaId; + + public WxMpMassPreviewMessage() { + super(); + } + + public String getToWxUsername() { + return toWxUsername; + } + + public void setToWxUsername(String toWxUsername) { + this.toWxUsername = toWxUsername; + } + + public String getMsgType() { + return msgType; + } + + /** + *
    +   * 请使用
    +   * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_IMAGE}
    +   * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_NEWS}
    +   * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_TEXT}
    +   * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VIDEO}
    +   * {@link me.chanjar.weixin.common.api.WxConsts#MASS_MSG_VOICE}
    +   * 如果msgtype和media_id不匹配的话,会返回系统繁忙的错误
    +   * 
    + * + * @param msgType + */ + public void setMsgType(String msgType) { + this.msgType = msgType; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getMediaId() { + return mediaId; + } + + public void setMediaId(String mediaId) { + this.mediaId = mediaId; + } + + public String toJson() { + return WxMpGsonBuilder.INSTANCE.create().toJson(this); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java new file mode 100644 index 0000000000..3e5ff6b2fd --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMediaImgUploadResult.java @@ -0,0 +1,24 @@ +package me.chanjar.weixin.mp.bean.result; + +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; + +/** + * @author miller + */ +public class WxMediaImgUploadResult implements Serializable { + private String url; + + public static WxMediaImgUploadResult fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMediaImgUploadResult.class); + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java index adf6ebbc5b..dd12a53a98 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSendResult.java @@ -20,6 +20,7 @@ public class WxMpMassSendResult implements Serializable { private String errorCode; private String errorMsg; private String msgId; + private String msgDataId; public String getErrorCode() { return errorCode; @@ -44,7 +45,15 @@ public String getMsgId() { public void setMsgId(String msgId) { this.msgId = msgId; } - + + public String getMsgDataId() { + return msgDataId; + } + + public void setMsgDataId(String msgDataId) { + this.msgDataId = msgDataId; + } + public static WxMpMassSendResult fromJson(String json) { return WxMpGsonBuilder.create().fromJson(json, WxMpMassSendResult.class); } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java new file mode 100644 index 0000000000..bdbc8f6728 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/http/MediaImgUploadRequestExecutor.java @@ -0,0 +1,51 @@ +package me.chanjar.weixin.mp.util.http; + +import me.chanjar.weixin.common.bean.result.WxError; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.util.http.RequestExecutor; +import me.chanjar.weixin.common.util.http.Utf8ResponseHandler; +import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; + +import java.io.File; +import java.io.IOException; + +/** + * @author miller + */ +public class MediaImgUploadRequestExecutor implements RequestExecutor { + @Override + public WxMediaImgUploadResult execute(CloseableHttpClient httpclient, HttpHost httpProxy, String uri, File data) throws WxErrorException, ClientProtocolException, IOException { + HttpPost httpPost = new HttpPost(uri); + if (httpProxy != null) { + RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); + httpPost.setConfig(config); + } + if (data != null) { + HttpEntity entity = MultipartEntityBuilder + .create() + .addBinaryBody("media", data) + .setMode(HttpMultipartMode.RFC6532) + .build(); + httpPost.setEntity(entity); + httpPost.setHeader("Content-Type", ContentType.MULTIPART_FORM_DATA.toString()); + } + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); + WxError error = WxError.fromJson(responseContent); + if (error.getErrorCode() != 0) { + throw new WxErrorException(error); + } + return WxMediaImgUploadResult.fromJson(responseContent); + } + } +} \ No newline at end of file diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java new file mode 100644 index 0000000000..39746ccd61 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMediaImgUploadResultGsonAdapter.java @@ -0,0 +1,22 @@ +package me.chanjar.weixin.mp.util.json; + +import com.google.gson.*; +import me.chanjar.weixin.common.util.json.GsonHelper; +import me.chanjar.weixin.mp.bean.result.WxMediaImgUploadResult; + +import java.lang.reflect.Type; + +/** + * @author miller + */ +public class WxMediaImgUploadResultGsonAdapter implements JsonDeserializer { + @Override + public WxMediaImgUploadResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + WxMediaImgUploadResult wxMediaImgUploadResult = new WxMediaImgUploadResult(); + JsonObject jsonObject = json.getAsJsonObject(); + if (null != jsonObject.get("url") && !jsonObject.get("url").isJsonNull()) { + wxMediaImgUploadResult.setUrl(GsonHelper.getAsString(jsonObject.get("url"))); + } + return wxMediaImgUploadResult; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java index 316f22f546..a451673d99 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpGsonBuilder.java @@ -40,6 +40,8 @@ public class WxMpGsonBuilder { INSTANCE.registerTypeAdapter(WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem.class, new WxMpMaterialFileBatchGetGsonItemAdapter()); INSTANCE.registerTypeAdapter(WxMpCardResult.class, new WxMpCardResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxMpCard.class, new WxMpCardGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMpMassPreviewMessage.class, new WxMpMassPreviewMessageGsonAdapter()); + INSTANCE.registerTypeAdapter(WxMediaImgUploadResult.class, new WxMediaImgUploadResultGsonAdapter()); } public static Gson create() { diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java new file mode 100644 index 0000000000..fd3e52df3e --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassPreviewMessageGsonAdapter.java @@ -0,0 +1,48 @@ +package me.chanjar.weixin.mp.util.json; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.mp.bean.WxMpMassPreviewMessage; + +import java.lang.reflect.Type; + +/** + * @author miller + */ +public class WxMpMassPreviewMessageGsonAdapter implements JsonSerializer { + @Override + public JsonElement serialize(WxMpMassPreviewMessage wxMpMassPreviewMessage, Type type, JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("towxname", wxMpMassPreviewMessage.getToWxUsername()); + if (WxConsts.MASS_MSG_NEWS.equals(wxMpMassPreviewMessage.getMsgType())) { + JsonObject news = new JsonObject(); + news.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); + jsonObject.add(WxConsts.MASS_MSG_NEWS, news); + } + if (WxConsts.MASS_MSG_TEXT.equals(wxMpMassPreviewMessage.getMsgType())) { + JsonObject sub = new JsonObject(); + sub.addProperty("content", wxMpMassPreviewMessage.getContent()); + jsonObject.add(WxConsts.MASS_MSG_TEXT, sub); + } + if (WxConsts.MASS_MSG_VOICE.equals(wxMpMassPreviewMessage.getMsgType())) { + JsonObject sub = new JsonObject(); + sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); + jsonObject.add(WxConsts.MASS_MSG_VOICE, sub); + } + if (WxConsts.MASS_MSG_IMAGE.equals(wxMpMassPreviewMessage.getMsgType())) { + JsonObject sub = new JsonObject(); + sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); + jsonObject.add(WxConsts.MASS_MSG_IMAGE, sub); + } + if (WxConsts.MASS_MSG_VIDEO.equals(wxMpMassPreviewMessage.getMsgType())) { + JsonObject sub = new JsonObject(); + sub.addProperty("media_id", wxMpMassPreviewMessage.getMediaId()); + jsonObject.add(WxConsts.MASS_MSG_VIDEO, sub); + } + jsonObject.addProperty("msgtype", wxMpMassPreviewMessage.getMsgType()); + return jsonObject; + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java index 99fc02b89b..658ac358ff 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpMassSendResultAdapter.java @@ -34,6 +34,9 @@ public WxMpMassSendResult deserialize(JsonElement json, Type typeOfT, JsonDeseri if (sendResultJsonObject.get("msg_id") != null && !sendResultJsonObject.get("msg_id").isJsonNull()) { sendResult.setMsgId(GsonHelper.getAsString(sendResultJsonObject.get("msg_id"))); } + if (sendResultJsonObject.get("msg_data_id") != null && !sendResultJsonObject.get("msg_data_id").isJsonNull()) { + sendResult.setMsgDataId(GsonHelper.getAsString(sendResultJsonObject.get("msg_data_id"))); + } return sendResult; }