@@ -121,6 +121,12 @@ public interface WxMaService { | |||||
*/ | */ | ||||
WxMaQrcodeService getQrcodeService(); | WxMaQrcodeService getQrcodeService(); | ||||
/** | |||||
* 返回模板配置相关接口方法的实现类对象, 以方便调用其各个接口 | |||||
* @return WxMaTemplateService | |||||
*/ | |||||
WxMaTemplateService getTemplateService(); | |||||
/** | /** | ||||
* 初始化http请求对象 | * 初始化http请求对象 | ||||
*/ | */ | ||||
@@ -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"; | |||||
/** | |||||
* <pre> | |||||
* 获取小程序模板库标题列表 | |||||
* | |||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1500465446_j4CgR&token=&lang=zh_CN">获取小程序模板库标题列表</a> | |||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* @param offset | |||||
* @param count | |||||
* @return | |||||
*/ | |||||
WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException; | |||||
/** | |||||
* <pre> | |||||
* 获取模板库某个模板标题下关键词库 | |||||
* | |||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1500465446_j4CgR&token=&lang=zh_CN">获取小程序模板库标题列表</a> | |||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException; | |||||
/** | |||||
* <pre> | |||||
* 组合模板并添加至帐号下的个人模板库 | |||||
* | |||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1500465446_j4CgR&token=&lang=zh_CN">获取小程序模板库标题列表</a> | |||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* @param id | |||||
* @param keywordIdList | |||||
* @return | |||||
*/ | |||||
WxMaTemplateAddResult addTemplate(String id, List<Integer> keywordIdList) throws WxErrorException; | |||||
/** | |||||
* <pre> | |||||
* 获取帐号下已存在的模板列表 | |||||
* | |||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1500465446_j4CgR&token=&lang=zh_CN">获取小程序模板库标题列表</a> | |||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* @param offset | |||||
* @param count | |||||
* @return | |||||
*/ | |||||
WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException; | |||||
/** | |||||
* <pre> | |||||
* 删除帐号下的某个模板 | |||||
* | |||||
* 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1500465446_j4CgR&token=&lang=zh_CN">获取小程序模板库标题列表</a> | |||||
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* @param templateId | |||||
*/ | |||||
boolean delTemplate(String templateId) throws WxErrorException; | |||||
} |
@@ -38,6 +38,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl | |||||
private WxMaMediaService materialService = new WxMaMediaServiceImpl(this); | private WxMaMediaService materialService = new WxMaMediaServiceImpl(this); | ||||
private WxMaUserService userService = new WxMaUserServiceImpl(this); | private WxMaUserService userService = new WxMaUserServiceImpl(this); | ||||
private WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); | private WxMaQrcodeService qrCodeService = new WxMaQrcodeServiceImpl(this); | ||||
private WxMaTemplateService templateService = new WxMaTemplateServiceImpl(this); | |||||
private int retrySleepMillis = 1000; | private int retrySleepMillis = 1000; | ||||
private int maxRetryTimes = 5; | private int maxRetryTimes = 5; | ||||
@@ -259,4 +260,9 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl | |||||
public WxMaQrcodeService getQrcodeService() { | public WxMaQrcodeService getQrcodeService() { | ||||
return this.qrCodeService; | return this.qrCodeService; | ||||
} | } | ||||
@Override | |||||
public WxMaTemplateService getTemplateService() { | |||||
return this.templateService; | |||||
} | |||||
} | } |
@@ -0,0 +1,101 @@ | |||||
package cn.binarywang.wx.miniapp.api.impl; | |||||
import cn.binarywang.wx.miniapp.api.WxMaService; | |||||
import cn.binarywang.wx.miniapp.api.WxMaTemplateService; | |||||
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.bean.result.WxError; | |||||
import me.chanjar.weixin.common.exception.WxErrorException; | |||||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
public class WxMaTemplateServiceImpl implements WxMaTemplateService { | |||||
private WxMaService wxMaService; | |||||
public WxMaTemplateServiceImpl(WxMaService wxMaService){ | |||||
this.wxMaService = wxMaService; | |||||
} | |||||
@Override | |||||
public WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException { | |||||
Map<String, Integer> 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<String, String> 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<Integer> keywordIdList) throws WxErrorException { | |||||
Map<String, Object> 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<String, Integer> 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<String, String> 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); | |||||
} | |||||
} | |||||
} |
@@ -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); | |||||
} | |||||
} |
@@ -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<KeywordInfo> 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); | |||||
} | |||||
} |
@@ -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<TemplateItem> 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; | |||||
} | |||||
} |
@@ -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<TemplateInfo> 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; | |||||
} | |||||
} |
@@ -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<Integer> 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<Integer> 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()); | |||||
} | |||||
} |