diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
index 9098d4ac..beaa96a8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java
@@ -121,6 +121,12 @@ public interface WxMaService {
*/
WxMaQrcodeService getQrcodeService();
+ /**
+ * 返回模板配置相关接口方法的实现类对象, 以方便调用其各个接口
+ * @return WxMaTemplateService
+ */
+ WxMaTemplateService getTemplateService();
+
/**
* 初始化http请求对象
*/
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
new file mode 100644
index 00000000..62be40ed
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
@@ -0,0 +1,89 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
+import me.chanjar.weixin.common.exception.WxErrorException;
+
+import java.util.List;
+
+public interface WxMaTemplateService {
+
+ //获取小程序模板库标题列表
+ String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list";
+
+ //获取模板库某个模板标题下关键词库
+ String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get";
+
+ //组合模板并添加至帐号下的个人模板库
+ String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add";
+
+ //获取帐号下已存在的模板列表
+ String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list";
+
+ //删除帐号下的某个模板
+ String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del";
+
+ /**
+ *
+ * 获取小程序模板库标题列表
+ *
+ * 详情请见: 获取小程序模板库标题列表
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN
+ *
+ * @param offset
+ * @param count
+ * @return
+ */
+ WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException;
+
+ /**
+ *
+ * 获取模板库某个模板标题下关键词库
+ *
+ * 详情请见: 获取小程序模板库标题列表
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN
+ *
+ * @param id
+ * @return
+ */
+ WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException;
+
+ /**
+ *
+ * 组合模板并添加至帐号下的个人模板库
+ *
+ * 详情请见: 获取小程序模板库标题列表
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN
+ *
+ * @param id
+ * @param keywordIdList
+ * @return
+ */
+ WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException;
+
+ /**
+ *
+ * 获取帐号下已存在的模板列表
+ *
+ * 详情请见: 获取小程序模板库标题列表
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
+ *
+ * @param offset
+ * @param count
+ * @return
+ */
+ WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException;
+
+ /**
+ *
+ * 删除帐号下的某个模板
+ *
+ * 详情请见: 获取小程序模板库标题列表
+ * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
+ *
+ * @param templateId
+ */
+ boolean delTemplate(String templateId) throws WxErrorException;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
index df3fad8e..380a15a1 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
@@ -38,6 +38,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp params = new HashMap<>();
+ params.put("offset", offset);
+ params.put("count", count);
+
+ String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params));
+ WxError wxError = WxError.fromJson(responseText);
+ if(wxError.getErrorCode() == 0){
+ return WxMaTemplateLibraryListResult.fromJson(responseText);
+ }else {
+ throw new WxErrorException(wxError);
+ }
+ }
+
+ @Override
+ public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException {
+
+ Map params = new HashMap<>();
+ params.put("id", id);
+
+ String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL, WxGsonBuilder.create().toJson(params));
+ WxError wxError = WxError.fromJson(responseText);
+ if(wxError.getErrorCode() == 0){
+ return WxMaTemplateLibraryGetResult.fromJson(responseText);
+ }else {
+ throw new WxErrorException(wxError);
+ }
+ }
+
+ @Override
+ public WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException {
+
+ Map params = new HashMap<>();
+ params.put("id", id);
+ params.put("keyword_id_list", keywordIdList.toArray());
+
+ String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, WxGsonBuilder.create().toJson(params));
+ WxError wxError = WxError.fromJson(responseText);
+ if(wxError.getErrorCode() == 0){
+ return WxMaTemplateAddResult.fromJson(responseText);
+ }else {
+ throw new WxErrorException(wxError);
+ }
+ }
+
+ @Override
+ public WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException {
+
+ Map params = new HashMap<>();
+ params.put("offset", offset);
+ params.put("count", count);
+
+ String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params));
+ WxError wxError = WxError.fromJson(responseText);
+ if(wxError.getErrorCode() == 0){
+ return WxMaTemplateListResult.fromJson(responseText);
+ }else {
+ throw new WxErrorException(wxError);
+ }
+ }
+
+ @Override
+ public boolean delTemplate(String templateId) throws WxErrorException {
+ Map params = new HashMap<>();
+ params.put("template_id", templateId);
+
+ String responseText = this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params));
+ WxError wxError = WxError.fromJson(responseText);
+ if(wxError.getErrorCode() == 0){
+ return true;
+ }else {
+ throw new WxErrorException(wxError);
+ }
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
new file mode 100644
index 00000000..4b30870d
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java
@@ -0,0 +1,20 @@
+package cn.binarywang.wx.miniapp.bean.template;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+@Data
+public class WxMaTemplateAddResult implements Serializable{
+
+ private static final long serialVersionUID = 872250961973834465L;
+
+ @SerializedName("template_id")
+ private String templateId;
+
+ public static WxMaTemplateAddResult fromJson(String json){
+ return WxGsonBuilder.create().fromJson(json, WxMaTemplateAddResult.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java
new file mode 100644
index 00000000..e55ed0d5
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java
@@ -0,0 +1,31 @@
+package cn.binarywang.wx.miniapp.bean.template;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class WxMaTemplateLibraryGetResult implements Serializable{
+
+ private static final long serialVersionUID = -190847592776636744L;
+ private String id;
+ private String title;
+ @SerializedName("keyword_list")
+ private List keywordList;
+
+ @Data
+ public static class KeywordInfo{
+
+ @SerializedName("keyword_id")
+ private int keywordId;
+ private String name;
+ private String example;
+ }
+
+ public static WxMaTemplateLibraryGetResult fromJson(String json){
+ return WxGsonBuilder.create().fromJson(json, WxMaTemplateLibraryGetResult.class);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
new file mode 100644
index 00000000..1926971b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java
@@ -0,0 +1,28 @@
+package cn.binarywang.wx.miniapp.bean.template;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class WxMaTemplateLibraryListResult implements Serializable{
+ private static final long serialVersionUID = -2780782521447602209L;
+
+ @SerializedName("total_count")
+ private int totalCount;
+ private List list;
+
+ public static WxMaTemplateLibraryListResult fromJson(String json){
+ return WxGsonBuilder.create().fromJson(json, WxMaTemplateLibraryListResult.class);
+ }
+
+ @Data
+ public static class TemplateItem{
+
+ private String id;
+ private String title;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java
new file mode 100644
index 00000000..0537fefc
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java
@@ -0,0 +1,29 @@
+package cn.binarywang.wx.miniapp.bean.template;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class WxMaTemplateListResult implements Serializable{
+
+ private static final long serialVersionUID = -7430535579782184537L;
+ private List list;
+
+ public static WxMaTemplateListResult fromJson(String json){
+ return WxGsonBuilder.create().fromJson(json, WxMaTemplateListResult.class);
+ }
+
+ @Data
+ public static class TemplateInfo{
+
+ @SerializedName("template_id")
+ private String templateId;
+ private String title;
+ private String content;
+ private String example;
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java
new file mode 100644
index 00000000..5dfa86a8
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java
@@ -0,0 +1,70 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import org.assertj.core.util.Lists;
+import org.testng.Assert;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaTemplateServiceImplTest {
+
+ @Inject
+ protected WxMaService wxService;
+
+ @Test
+ public void testFindTemplateLibraryList() throws Exception {
+ WxMaTemplateLibraryListResult result = this.wxService.getTemplateService().findTemplateLibraryList(0, 20);
+ Assert.assertEquals(20, result.getList().size());
+ }
+
+ @Test
+ public void testFindTemplateLibraryKeywordList() throws Exception {
+ WxMaTemplateLibraryGetResult result = this.wxService.getTemplateService().findTemplateLibraryKeywordList("AT0004");
+ Assert.assertEquals("AT0004", result.getId());
+ Assert.assertEquals("交易提醒", result.getTitle());
+ Assert.assertEquals(100, result.getKeywordList().size());
+ }
+
+ @Test
+ public void testAddTemplate() throws Exception{
+ List list = Lists.newArrayList();
+ list.add(1);
+ list.add(20);
+ list.add(84);
+
+ WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list);
+ Assert.assertNotNull(result.getTemplateId());
+ System.out.println(result);
+ }
+
+ @Test
+ public void testFindTemplateList() throws Exception{
+ WxMaTemplateListResult result = this.wxService.getTemplateService().findTemplateList(0, 20);
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDelTemplate() throws Exception {
+
+ //add
+ List list = Lists.newArrayList();
+ list.add(1);
+ list.add(20);
+ list.add(84);
+
+ WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list);
+
+ //delete
+ this.wxService.getTemplateService().delTemplate(result.getTemplateId());
+ }
+}
diff --git a/weixin-java-miniapp/src/test/resources/test-config.sample.xml b/weixin-java-miniapp/src/test/resources/test-config-sample.xml
similarity index 100%
rename from weixin-java-miniapp/src/test/resources/test-config.sample.xml
rename to weixin-java-miniapp/src/test/resources/test-config-sample.xml