pageList = wxService.getCodeService().getPage();
+ System.out.println(String.valueOf(pageList));
+ }
+
+ @Test
+ public void testSubmitAudit() throws Exception {
+ WxMaCodeSubmitAuditRequest auditRequest = WxMaCodeSubmitAuditRequest
+ .builder()
+ .itemList(Arrays.asList(
+ WxMaCategory
+ .builder()
+ .address("pages/logs/logs")
+ .tag("工具 效率")
+ .firstClass("工具")
+ .firstId(287L)
+ .secondClass("效率")
+ .secondId(616L)
+ .title("日志")
+ .build()
+ )).build();
+ long auditId = wxService.getCodeService().submitAudit(auditRequest);
+ assertTrue(auditId > 0);
+ // 421937937
+ System.out.println(auditId);
+ }
+
+ @Test
+ public void testGetAuditStatus() throws Exception {
+ WxMaCodeAuditStatus auditStatus = wxService.getCodeService().getAuditStatus(421937937L);
+ System.out.println(auditStatus);
+ assertNotNull(auditStatus);
+ }
+
+ @Test
+ public void testGetLatestAuditStatus() throws Exception {
+ WxMaCodeAuditStatus auditStatus = wxService.getCodeService().getLatestAuditStatus();
+ System.out.println(auditStatus);
+ assertNotNull(auditStatus);
+ }
+
+ @Test
+ public void testRelease() throws Exception {
+ wxService.getCodeService().release();
+ }
+
+ @Test
+ public void testChangeVisitStatus() throws Exception {
+ wxService.getCodeService().changeVisitStatus("open");
+ }
+
+ @Test
+ public void testRevertCodeRelease() throws Exception {
+ wxService.getCodeService().revertCodeRelease();
+ }
+
+ @Test
+ public void testGetSupportVersion() throws Exception {
+ WxMaCodeVersionDistribution distribution = wxService.getCodeService().getSupportVersion();
+ System.out.println(distribution);
+ }
+
+ @Test
+ public void testSetSupportVersion() throws Exception {
+ wxService.getCodeService().setSupportVersion("1.2.0");
+ }
+
+ @Test
+ public void testUndoCodeAudit() throws Exception {
+
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequestTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequestTest.java
new file mode 100644
index 0000000000..36cf1c4840
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeCommitRequestTest.java
@@ -0,0 +1,25 @@
+package cn.binarywang.wx.miniapp.bean.code;
+
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * @author Charming
+ * @since 2018-04-26 19:54
+ */
+public class WxMaCodeCommitRequestTest {
+ @Test
+ public void testToJson() {
+ WxMaCodeCommitRequest commitRequest = WxMaCodeCommitRequest.builder()
+ .templateId(1L)
+ .userVersion("v0.1.0")
+ .userDesc("init")
+ .extConfig(WxMaCodeExtConfig.builder()
+ .extAppid("app123")
+ .extEnable(true)
+ .build())
+ .build();
+ assertEquals(commitRequest.toJson(), "{\"template_id\":1,\"user_version\":\"v0.1.0\",\"user_desc\":\"init\",\"ext_json\":\"{\\\"extEnable\\\":true,\\\"extAppid\\\":\\\"app123\\\"}\"}");
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequestTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequestTest.java
new file mode 100644
index 0000000000..1f962087dc
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeSubmitAuditRequestTest.java
@@ -0,0 +1,30 @@
+package cn.binarywang.wx.miniapp.bean.code;
+
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+
+/**
+ * @author Charming
+ * @since 2018-04-26 19:55
+ */
+public class WxMaCodeSubmitAuditRequestTest {
+ @Test
+ public void testToJson() {
+ WxMaCodeSubmitAuditRequest request = WxMaCodeSubmitAuditRequest
+ .builder()
+ .itemList(Arrays.asList(
+ WxMaCategory
+ .builder()
+ .address("pages/logs/logs")
+ .tag("工具 效率")
+ .firstClass("工具")
+ .firstId(287L)
+ .secondClass("效率")
+ .secondId(616L)
+ .title("日志")
+ .build()
+ )).build();
+ System.out.println(request.toJson());
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistributionTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistributionTest.java
new file mode 100644
index 0000000000..da02972e04
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/bean/code/WxMaCodeVersionDistributionTest.java
@@ -0,0 +1,15 @@
+package cn.binarywang.wx.miniapp.bean.code;
+
+import org.testng.annotations.Test;
+
+/**
+ * @author Charming
+ * @since 2018-04-26 19:58
+ */
+public class WxMaCodeVersionDistributionTest {
+ @Test
+ public void testFromJson() {
+ String json = "{\"errcode\":0,\"errmsg\":\"ok\",\"now_version\":\"1.2.0\",\"uv_info\":{\"items\":[{\"version\":\"0.0.0\",\"percentage\":0},{\"version\":\"1.0.0\",\"percentage\":0},{\"version\":\"1.0.1\",\"percentage\":0},{\"version\":\"1.1.0\",\"percentage\":0},{\"version\":\"1.1.1\",\"percentage\":0},{\"version\":\"1.2.0\",\"percentage\":0},{\"version\":\"1.2.1\",\"percentage\":0},{\"version\":\"1.2.2\",\"percentage\":0},{\"version\":\"1.2.3\",\"percentage\":0},{\"version\":\"1.2.4\",\"percentage\":0},{\"version\":\"1.2.5\",\"percentage\":0},{\"version\":\"1.2.6\",\"percentage\":0},{\"version\":\"1.3.0\",\"percentage\":0},{\"version\":\"1.4.0\",\"percentage\":0},{\"version\":\"1.4.1\",\"percentage\":0},{\"version\":\"1.4.2\",\"percentage\":0},{\"version\":\"1.4.3\",\"percentage\":0},{\"version\":\"1.4.4\",\"percentage\":0},{\"version\":\"1.5.0\",\"percentage\":0},{\"version\":\"1.5.1\",\"percentage\":0},{\"version\":\"1.5.2\",\"percentage\":0},{\"version\":\"1.5.3\",\"percentage\":0},{\"version\":\"1.5.4\",\"percentage\":0},{\"version\":\"1.5.5\",\"percentage\":0},{\"version\":\"1.5.6\",\"percentage\":0},{\"version\":\"1.5.7\",\"percentage\":0},{\"version\":\"1.5.8\",\"percentage\":0},{\"version\":\"1.6.0\",\"percentage\":0.0132},{\"version\":\"1.6.1\",\"percentage\":0.0132},{\"version\":\"1.6.2\",\"percentage\":0.0132},{\"version\":\"1.6.3\",\"percentage\":0.0132},{\"version\":\"1.6.4\",\"percentage\":0.0132},{\"version\":\"1.6.5\",\"percentage\":0.0132},{\"version\":\"1.6.6\",\"percentage\":0.0132},{\"version\":\"1.6.7\",\"percentage\":0.1711},{\"version\":\"1.6.8\",\"percentage\":0.1711},{\"version\":\"1.7.0\",\"percentage\":0.1842},{\"version\":\"1.7.1\",\"percentage\":0.25},{\"version\":\"1.7.2\",\"percentage\":0.5263},{\"version\":\"1.7.3\",\"percentage\":0.5263},{\"version\":\"1.7.4\",\"percentage\":0.6711}]}}\n";
+ System.out.println(WxMaCodeVersionDistribution.fromJson(json));
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 9b07759051..35a438c0a2 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -5,16 +5,18 @@
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
+import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
+import java.util.List;
+
/**
* @author 007
*/
public interface WxOpenComponentService {
-
String API_COMPONENT_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
String API_CREATE_PREAUTHCODE_URL = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode";
String API_QUERY_AUTH_URL = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth";
@@ -23,7 +25,6 @@ public interface WxOpenComponentService {
String API_GET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option";
String API_SET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option";
-
String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s";
String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&component_appid=%s#wechat_redirect";
@@ -87,4 +88,48 @@ public interface WxOpenComponentService {
WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCode) throws WxErrorException;
+ /**
+ * 代小程序实现业务
+ *
+ * 小程序代码模版库管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1506504150_nMMh6&token=&lang=zh_CN
+ * access_token 为 component_access_token
+ */
+ String GET_TEMPLATE_DRAFT_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatedraftlist";
+ String GET_TEMPLATE_LIST_URL = "https://api.weixin.qq.com/wxa/gettemplatelist";
+ String ADD_TO_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/addtotemplate";
+ String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate";
+
+ /**
+ * 获取草稿箱内的所有临时代码草稿
+ *
+ * @return 草稿箱代码模板列表(draftId)
+ * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
+ */
+ List getTemplateDraftList() throws WxErrorException;
+
+ /**
+ * 获取代码模版库中的所有小程序代码模版
+ *
+ * @return 小程序代码模版列表(templateId)
+ * @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
+ */
+ List getTemplateList() throws WxErrorException;
+
+ /**
+ * 将草稿箱的草稿选为小程序代码模版
+ *
+ * @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
+ * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
+ * @see #getTemplateDraftList
+ */
+ void addToTemplate(long draftId) throws WxErrorException;
+
+ /**
+ * 删除指定小程序代码模版
+ *
+ * @param templateId 要删除的模版ID
+ * @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
+ * @see #getTemplateList
+ */
+ void deleteTemplate(long templateId) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
index 36dd286505..cb9062c7e3 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
@@ -3,6 +3,8 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.crypto.SHA1;
@@ -15,6 +17,7 @@
import me.chanjar.weixin.open.api.WxOpenService;
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
+import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
@@ -26,13 +29,14 @@
import org.slf4j.LoggerFactory;
import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
/**
* @author 007
*/
public class WxOpenComponentServiceImpl implements WxOpenComponentService {
-
+ private static final JsonParser JSON_PARSER = new JsonParser();
private static final Map WX_OPEN_MA_SERVICE_MAP = new Hashtable<>();
private static final Map WX_OPEN_MP_SERVICE_MAP = new Hashtable<>();
@@ -288,4 +292,45 @@ public WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCod
return WxMaJscode2SessionResult.fromJson(responseContent);
}
+ @Override
+ public List getTemplateDraftList() throws WxErrorException {
+ String responseContent = get(GET_TEMPLATE_DRAFT_LIST_URL);
+ JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+ boolean hasDraftList = response.has("draft_list");
+ if (hasDraftList) {
+ return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("draft_list"),
+ new TypeToken>() {
+ }.getType());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public List getTemplateList() throws WxErrorException {
+ String responseContent = get(GET_TEMPLATE_LIST_URL);
+ JsonObject response = JSON_PARSER.parse(StringUtils.defaultString(responseContent, "{}")).getAsJsonObject();
+ boolean hasDraftList = response.has("template_list");
+ if (hasDraftList) {
+ return WxOpenGsonBuilder.create().fromJson(response.getAsJsonArray("template_list"),
+ new TypeToken>() {
+ }.getType());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void addToTemplate(long draftId) throws WxErrorException {
+ JsonObject param = new JsonObject();
+ param.addProperty("draft_id", draftId);
+ post(ADD_TO_TEMPLATE_URL, param.toString());
+ }
+
+ @Override
+ public void deleteTemplate(long templateId) throws WxErrorException {
+ JsonObject param = new JsonObject();
+ param.addProperty("template_id", templateId);
+ post(DELETE_TEMPLATE_URL, param.toString());
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
new file mode 100644
index 0000000000..be1bb9b138
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenMaCodeTemplate.java
@@ -0,0 +1,40 @@
+package me.chanjar.weixin.open.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Charming
+ * @since 2018-04-26 17:10
+ */
+@Data
+public class WxOpenMaCodeTemplate implements Serializable {
+ private static final long serialVersionUID = -3278116984473619010L;
+ /**
+ * 草稿id
+ */
+ @SerializedName(value = "draftId", alternate = "draft_id")
+ private Long draftId;
+ /**
+ * 模版id
+ */
+ @SerializedName(value = "templateId", alternate = "template_id")
+ private Long templateId;
+ /**
+ * 模版版本号,开发者自定义字段
+ */
+ @SerializedName(value = "userVersion", alternate = "user_version")
+ private String userVersion;
+ /**
+ * 模版描述 开发者自定义字段
+ */
+ @SerializedName(value = "userDesc", alternate = "user_desc")
+ private String userDesc;
+ /**
+ * 开发者上传草稿时间 / 被添加为模版的时间
+ */
+ @SerializedName(value = "createTime", alternate = "create_time")
+ private Long createTime;
+}