diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/CategoryData.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/CategoryData.java similarity index 86% rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/CategoryData.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/CategoryData.java index 72e68e6aa..3b2f33293 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/CategoryData.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/CategoryData.java @@ -1,4 +1,4 @@ -package cn.binarywang.wx.miniapp.bean.subscribemsg; +package me.chanjar.weixin.common.bean.subscribemsg; import lombok.Data; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/PubTemplateKeyword.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateKeyword.java similarity index 88% rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/PubTemplateKeyword.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateKeyword.java index 5a6f15c88..c44f2b0bd 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/PubTemplateKeyword.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateKeyword.java @@ -1,4 +1,4 @@ -package cn.binarywang.wx.miniapp.bean.subscribemsg; +package me.chanjar.weixin.common.bean.subscribemsg; import lombok.Data; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateTitleListResult.java similarity index 66% rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateTitleListResult.java index 6c68b0148..32154a14f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaPubTemplateTitleListResult.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/PubTemplateTitleListResult.java @@ -1,4 +1,4 @@ -package cn.binarywang.wx.miniapp.bean.template; +package me.chanjar.weixin.common.bean.subscribemsg; import lombok.Data; import me.chanjar.weixin.common.util.json.WxGsonBuilder; @@ -10,15 +10,15 @@ import java.util.List; * @author ArBing */ @Data -public class WxMaPubTemplateTitleListResult implements Serializable { +public class PubTemplateTitleListResult implements Serializable { private static final long serialVersionUID = -7718911668757837527L; private int count; private List data; - public static WxMaPubTemplateTitleListResult fromJson(String json) { - return WxGsonBuilder.create().fromJson(json, WxMaPubTemplateTitleListResult.class); + public static PubTemplateTitleListResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, PubTemplateTitleListResult.class); } @Data diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/TemplateInfo.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/TemplateInfo.java similarity index 88% rename from weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/TemplateInfo.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/TemplateInfo.java index 75329f65f..b42924aa7 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/subscribemsg/TemplateInfo.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/subscribemsg/TemplateInfo.java @@ -1,4 +1,4 @@ -package cn.binarywang.wx.miniapp.bean.subscribemsg; +package me.chanjar.weixin.common.bean.subscribemsg; import lombok.Data; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSubscribeService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSubscribeService.java index 5e2e3b23d..1f1248e3a 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSubscribeService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSubscribeService.java @@ -1,10 +1,10 @@ package cn.binarywang.wx.miniapp.api; import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; -import cn.binarywang.wx.miniapp.bean.subscribemsg.CategoryData; -import cn.binarywang.wx.miniapp.bean.subscribemsg.PubTemplateKeyword; -import cn.binarywang.wx.miniapp.bean.subscribemsg.TemplateInfo; -import cn.binarywang.wx.miniapp.bean.template.WxMaPubTemplateTitleListResult; +import me.chanjar.weixin.common.bean.subscribemsg.CategoryData; +import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateKeyword; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; +import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateTitleListResult; import me.chanjar.weixin.common.error.WxErrorException; import java.util.List; @@ -31,7 +31,7 @@ public interface WxMaSubscribeService { * @return . * @throws WxErrorException . */ - WxMaPubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException; + PubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException; /** *
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
index 55847caae..bf37efe1c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImpl.java
@@ -3,10 +3,10 @@ package cn.binarywang.wx.miniapp.api.impl;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.api.WxMaSubscribeService;
 import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.CategoryData;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.PubTemplateKeyword;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.TemplateInfo;
-import cn.binarywang.wx.miniapp.bean.template.WxMaPubTemplateTitleListResult;
+import me.chanjar.weixin.common.bean.subscribemsg.CategoryData;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateKeyword;
+import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateTitleListResult;
 import cn.binarywang.wx.miniapp.constant.WxMaConstants;
 import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
 import com.google.common.base.Joiner;
@@ -34,12 +34,12 @@ public class WxMaSubscribeServiceImpl implements WxMaSubscribeService {
   private final WxMaService service;
 
   @Override
-  public WxMaPubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException {
+  public PubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException {
     ImmutableMap params = ImmutableMap.of("ids", StringUtils.join(ids, ","),
       "start", start, "limit", limit);
     String responseText = this.service.get(GET_PUB_TEMPLATE_TITLE_LIST_URL,
       Joiner.on("&").withKeyValueSeparator("=").join(params));
-    return WxMaPubTemplateTitleListResult.fromJson(responseText);
+    return PubTemplateTitleListResult.fromJson(responseText);
   }
 
   @Override
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImplTest.java
index 2eb657be9..f49d22f26 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSubscribeServiceImplTest.java
@@ -1,10 +1,10 @@
 package cn.binarywang.wx.miniapp.api.impl;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.CategoryData;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.PubTemplateKeyword;
-import cn.binarywang.wx.miniapp.bean.subscribemsg.TemplateInfo;
-import cn.binarywang.wx.miniapp.bean.template.WxMaPubTemplateTitleListResult;
+import me.chanjar.weixin.common.bean.subscribemsg.CategoryData;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateKeyword;
+import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateTitleListResult;
 import cn.binarywang.wx.miniapp.test.ApiTestModule;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
@@ -30,7 +30,7 @@ public class WxMaSubscribeServiceImplTest {
 
   @Test
   public void testGetPubTemplateTitleList() throws WxErrorException {
-    WxMaPubTemplateTitleListResult result = this.wxService.getSubscribeService().getPubTemplateTitleList(new String[]{"2", "616"}, 0, 30);
+    PubTemplateTitleListResult result = this.wxService.getSubscribeService().getPubTemplateTitleList(new String[]{"2", "616"}, 0, 30);
     System.out.println(result);
 
   }
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 fe8d2abf3..1b81bf6e4 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
@@ -259,6 +259,16 @@ public interface WxMpService extends WxService {
    */
   String post(WxMpApiUrl url, String postData) throws WxErrorException;
 
+  /**
+   * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
+   *
+   * @param url      请求接口地址
+   * @param obj 请求参数
+   * @return 接口响应字符串 string
+   * @throws WxErrorException 异常
+   */
+  String post(WxMpApiUrl url, Object obj) throws WxErrorException;
+
   /**
    * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
    *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpSubscribeMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpSubscribeMsgService.java
index 549018e63..897c00e78 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpSubscribeMsgService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpSubscribeMsgService.java
@@ -1,16 +1,21 @@
 package me.chanjar.weixin.mp.api;
 
+import me.chanjar.weixin.common.bean.subscribemsg.CategoryData;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateKeyword;
+import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateTitleListResult;
+import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo;
 import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.bean.subscribe.WxMpSubscribeMessage;
 
+import java.util.List;
+
 /**
  * 
- * 一次性订阅消息接口
- * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB
+ * 订阅消息服务接口
  * 
* * @author Mklaus - * @date 2018-01-22 上午11:07 + * @date 2018 -01-22 上午11:07 */ public interface WxMpSubscribeMsgService { /** @@ -20,9 +25,9 @@ public interface WxMpSubscribeMsgService { *
* * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode - * @param scene 重定向后会带上scene参数,开发者可以填0-10000的整形值,用来标识订阅场景值 - * @param reserved 用于保持请求和回调的状态,授权请后原样带回给第三方 (最多128字节,要求做urlencode) - * @return url + * @param scene 重定向后会带上scene参数,开发者可以填0-10000的整形值,用来标识订阅场景值 + * @param reserved 用于保持请求和回调的状态,授权请后原样带回给第三方 (最多128字节,要求做urlencode) + * @return url string */ String subscribeMsgAuthorizationUrl(String redirectURI, int scene, String reserved); @@ -32,8 +37,106 @@ public interface WxMpSubscribeMsgService { * 详情请见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1500374289_66bvB * * - * @return 消息Id + * @param message the message + * @return 消息Id boolean + * @throws WxErrorException the wx error exception */ - boolean sendSubscribeMessage(WxMpSubscribeMessage message) throws WxErrorException; + boolean sendOnce(WxMpSubscribeMessage message) throws WxErrorException; + + /** + *
+   * 获取帐号所属类目下的公共模板标题
+   *
+   * 详情请见: 获取帐号所属类目下的公共模板标题
+   * 接口url格式: https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatetitles?access_token=ACCESS_TOKEN
+   * 
+ * + * @param ids 类目 id,多个用逗号隔开 + * @param start 用于分页,表示从 start 开始。从 0 开始计数。 + * @param limit 用于分页,表示拉取 limit 条记录。最大为 30。 + * @return . pub template title list + * @throws WxErrorException . + */ + PubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException; + + /** + *
+   * 获取模板库某个模板标题下关键词库
+   *
+   * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * 接口url格式: GET https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token=ACCESS_TOKEN
+   * 
+ * + * @param id 模板标题 id,可通过接口获取 + * @return . pub template key words by id + * @throws WxErrorException . + */ + List getPubTemplateKeyWordsById(String id) throws WxErrorException; + + /** + *
+   * 组合模板并添加至帐号下的个人模板库
+   *
+   * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * 接口url格式: POST https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token=ACCESS_TOKEN
+   * 
+ * + * @param id 模板标题 id,可通过接口获取,也可登录小程序后台查看获取 + * @param keywordIdList 模板关键词列表 + * @param sceneDesc 服务场景描述,15个字以内 + * @return 添加至帐号下的模板id ,发送小程序订阅消息时所需 + * @throws WxErrorException . + */ + String addTemplate(String id, List keywordIdList, String sceneDesc) throws WxErrorException; + + /** + *
+   * 获取当前帐号下的个人模板列表
+   *
+   * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * 接口url格式: GET https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token=ACCESS_TOKEN
+   * 
+ * + * @return . template list + * @throws WxErrorException . + */ + List getTemplateList() throws WxErrorException; + + /** + *
+   * 删除帐号下的某个模板
+   *
+   * 详情请见: https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * 接口url格式: POST https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token=ACCESS_TOKEN
+   * 
+ * + * @param templateId 要删除的模板id + * @return 删除是否成功 boolean + * @throws WxErrorException . + */ + boolean delTemplate(String templateId) throws WxErrorException; + + /** + *
+   * 获取公众号类目
+   * https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * GET https://api.weixin.qq.com/wxaapi/newtmpl/getcategory?access_token=ACCESS_TOKEN
+   * 
+ * + * @return . category + * @throws WxErrorException . + */ + List getCategory() throws WxErrorException; + + /** + *
+   * 发送订阅消息
+   * https://developers.weixin.qq.com/doc/offiaccount/Subscription_Messages/api.html
+   * 
+ * + * @param subscribeMessage 订阅消息 + * @throws WxErrorException . + */ + void send(WxMpSubscribeMessage subscribeMessage) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java index c8782b287..960d20027 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java @@ -287,6 +287,11 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH return this.post(url.getUrl(this.getWxMpConfigStorage()), postData); } + @Override + public String post(WxMpApiUrl url, Object obj) throws WxErrorException { + return this.execute(SimplePostRequestExecutor.create(this), url, WxGsonBuilder.create().toJson(obj)); + } + @Override public String post(WxMpApiUrl url, JsonObject jsonObject) throws WxErrorException { return this.post(url.getUrl(this.getWxMpConfigStorage()), jsonObject.toString()); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImpl.java index ff99b12c8..48cd042e9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImpl.java @@ -1,40 +1,113 @@ package me.chanjar.weixin.mp.api.impl; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.bean.subscribemsg.CategoryData; +import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateKeyword; +import me.chanjar.weixin.common.bean.subscribemsg.PubTemplateTitleListResult; +import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo; +import me.chanjar.weixin.common.enums.WxType; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.util.http.URIUtil; +import me.chanjar.weixin.common.util.json.GsonParser; import me.chanjar.weixin.mp.config.WxMpConfigStorage; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpSubscribeMsgService; import me.chanjar.weixin.mp.bean.subscribe.WxMpSubscribeMessage; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import org.apache.commons.lang3.StringUtils; -import static me.chanjar.weixin.mp.enums.WxMpApiUrl.SubscribeMsg.SEND_MESSAGE_URL; -import static me.chanjar.weixin.mp.enums.WxMpApiUrl.SubscribeMsg.SUBSCRIBE_MESSAGE_AUTHORIZE_URL; +import java.io.Serializable; +import java.util.List; + +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.SubscribeMsg.*; /** - * 一次性订阅消息接口. + * 订阅消息接口. * * @author Mklaus * @date 2018-01-22 上午11:19 */ @RequiredArgsConstructor public class WxMpSubscribeMsgServiceImpl implements WxMpSubscribeMsgService { - private final WxMpService wxMpService; + private static final String ERR_CODE = "errcode"; + private final WxMpService service; @Override - public String subscribeMsgAuthorizationUrl(String redirectURI, int scene, String reserved) { - WxMpConfigStorage storage = this.wxMpService.getWxMpConfigStorage(); + public String subscribeMsgAuthorizationUrl(String redirectUri, int scene, String reserved) { + WxMpConfigStorage storage = this.service.getWxMpConfigStorage(); return String.format(SUBSCRIBE_MESSAGE_AUTHORIZE_URL.getUrl(storage), storage.getAppId(), scene, storage.getTemplateId(), - URIUtil.encodeURIComponent(redirectURI), reserved); + URIUtil.encodeURIComponent(redirectUri), reserved); } @Override - public boolean sendSubscribeMessage(WxMpSubscribeMessage message) throws WxErrorException { + public boolean sendOnce(WxMpSubscribeMessage message) throws WxErrorException { if (message.getTemplateId() == null) { - message.setTemplateId(this.wxMpService.getWxMpConfigStorage().getTemplateId()); + message.setTemplateId(this.service.getWxMpConfigStorage().getTemplateId()); } - String responseContent = this.wxMpService.post(SEND_MESSAGE_URL, message.toJson()); + String responseContent = this.service.post(SEND_MESSAGE_ONCE_URL, message.toJson()); return responseContent != null; } + + @Override + public PubTemplateTitleListResult getPubTemplateTitleList(String[] ids, int start, int limit) throws WxErrorException { + ImmutableMap params = ImmutableMap.of("ids", StringUtils.join(ids, ","), + "start", start, "limit", limit); + String responseText = this.service.get(GET_PUB_TEMPLATE_TITLE_LIST_URL, + Joiner.on("&").withKeyValueSeparator("=").join(params)); + return PubTemplateTitleListResult.fromJson(responseText); + } + + @Override + public List getPubTemplateKeyWordsById(String id) throws WxErrorException { + String responseText = this.service.get(GET_PUB_TEMPLATE_KEY_WORDS_BY_ID_URL, + Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("tid", id))); + return WxMpGsonBuilder.create().fromJson(GsonParser.parse(responseText) + .getAsJsonArray("data"), new TypeToken>() { + }.getType()); + } + + @Override + public String addTemplate(String id, List keywordIdList, String sceneDesc) throws WxErrorException { + String responseText = this.service.post(TEMPLATE_ADD_URL, ImmutableMap.of("tid", id, + "kidList", keywordIdList.toArray(), + "sceneDesc", sceneDesc)); + return GsonParser.parse(responseText).get("priTmplId").getAsString(); + } + + @Override + public List getTemplateList() throws WxErrorException { + String responseText = this.service.get(TEMPLATE_LIST_URL, null); + return WxMpGsonBuilder.create().fromJson(GsonParser.parse(responseText) + .getAsJsonArray("data"), new TypeToken>() { + }.getType()); + } + + @Override + public boolean delTemplate(String templateId) throws WxErrorException { + this.service.post(TEMPLATE_DEL_URL, ImmutableMap.of("priTmplId", templateId)); + return true; + } + + @Override + public List getCategory() throws WxErrorException { + String responseText = this.service.get(GET_CATEGORY_URL, null); + return WxMpGsonBuilder.create().fromJson(GsonParser.parse(responseText) + .getAsJsonArray("data"), new TypeToken>() { + }.getType()); + } + + @Override + public void send(WxMpSubscribeMessage subscribeMessage) throws WxErrorException { + String responseContent = this.service.post(SEND_SUBSCRIBE_MESSAGE_URL, subscribeMessage.toJson()); + JsonObject jsonObject = GsonParser.parse(responseContent); + if (jsonObject.get(ERR_CODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MP)); + } + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/subscribe/WxMpSubscribeMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/subscribe/WxMpSubscribeMessage.java index 51c312d30..30ad3153a 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/subscribe/WxMpSubscribeMessage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/subscribe/WxMpSubscribeMessage.java @@ -1,13 +1,14 @@ package me.chanjar.weixin.mp.bean.subscribe; -import java.io.Serializable; - import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; +import java.io.Serializable; +import java.util.Map; + /** * @author Mklaus * @date 2018-01-22 下午12:18 @@ -64,6 +65,15 @@ public class WxMpSubscribeMessage { */ private String contentColor; + /** + * 跳转网页时填写. + */ + private String page; + + /** + * 订阅通知消息专用 + */ + private Map dataMap; public String toJson() { return WxMpGsonBuilder.create().toJson(this); diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 932ea97fc..5bc828db1 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -280,9 +280,40 @@ public interface WxMpApiUrl { */ SUBSCRIBE_MESSAGE_AUTHORIZE_URL(MP_DEFAULT_HOST_URL, "/mp/subscribemsg?action=get_confirm&appid=%s&scene=%d&template_id=%s&redirect_url=%s&reserved=%s#wechat_redirect"), /** - * subscribe. + * subscribe once. */ - SEND_MESSAGE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/template/subscribe"); + SEND_MESSAGE_ONCE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/template/subscribe"), + /** + * 订阅通知消息发送. + */ + SEND_SUBSCRIBE_MESSAGE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/subscribe/bizsend"), + /** + * 获取模板标题下的关键词列表. + */ + GET_PUB_TEMPLATE_TITLE_LIST_URL (API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/getpubtemplatetitles"), + /** + * 获取模板标题下的关键词列表. + */ + GET_PUB_TEMPLATE_KEY_WORDS_BY_ID_URL (API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/getpubtemplatekeywords"), + /** + * 组合模板并添加至帐号下的个人模板库. + */ + TEMPLATE_ADD_URL(API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/addtemplate"), + /** + * 获取当前帐号下的个人模板列表. + */ + TEMPLATE_LIST_URL(API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/gettemplate"), + /** + * 删除帐号下的某个模板. + */ + TEMPLATE_DEL_URL(API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/deltemplate"), + /** + * 获取小程序账号的类目 + */ + GET_CATEGORY_URL (API_DEFAULT_HOST_URL, "/wxaapi/newtmpl/getcategory"), + UNIFORM_MSG_SEND_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/wxopen/template/uniform_send"), + ACTIVITY_ID_CREATE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/wxopen/activityid/create"), + UPDATABLE_MSG_SEND_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/wxopen/updatablemsg/send"); private final String prefix; private final String path; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSubscribeMessageGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSubscribeMessageGsonAdapter.java index 6f32195a7..01ee3c9a4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSubscribeMessageGsonAdapter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpSubscribeMessageGsonAdapter.java @@ -1,13 +1,13 @@ package me.chanjar.weixin.mp.util.json; -import java.lang.reflect.Type; - import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import me.chanjar.weixin.mp.bean.subscribe.WxMpSubscribeMessage; +import java.lang.reflect.Type; + /** * @author Mklaus * @date 2018-01-22 下午12:31 @@ -24,6 +24,10 @@ public class WxMpSubscribeMessageGsonAdapter implements JsonSerializer { + JsonObject content = new JsonObject(); + content.addProperty("value", value); + data.add(key, content); + }); - if (message.getContentColor() != null) { - content.addProperty("color", message.getContentColor()); } return messageJson; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImplTest.java index 77a661ee5..afcafaa02 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpSubscribeMsgServiceImplTest.java @@ -21,7 +21,7 @@ public class WxMpSubscribeMsgServiceImplTest { protected WxMpService wxService; @Test - public void testSendSubscribeMessage() throws WxErrorException { + public void testSendSubscribeOnceMessage() throws WxErrorException { TestConfigStorage configStorage = (TestConfigStorage) this.wxService .getWxMpConfigStorage(); @@ -34,7 +34,7 @@ public class WxMpSubscribeMsgServiceImplTest { .build(); try { - boolean send = this.wxService.getSubscribeMsgService().sendSubscribeMessage(message); + boolean send = this.wxService.getSubscribeMsgService().sendOnce(message); Assert.assertTrue(send); } catch (WxErrorException e) { // 当用户没有授权,获取之前的授权已使用。微信会返回错误代码 {"errcode":43101,"errmsg":"user refuse to accept the msg hint: [xxxxxxxxxxx]"} @@ -45,4 +45,35 @@ public class WxMpSubscribeMsgServiceImplTest { } + @Test + public void testSubscribeMsgAuthorizationUrl() { + } + + @Test + public void testGetPubTemplateTitleList() { + } + + @Test + public void testGetPubTemplateKeyWordsById() { + } + + @Test + public void testAddTemplate() { + } + + @Test + public void testGetTemplateList() { + } + + @Test + public void testDelTemplate() { + } + + @Test + public void testGetCategory() { + } + + @Test + public void testSend() { + } }