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 0ae803fc..7016bd1b 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
@@ -10,6 +10,7 @@ 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 me.chanjar.weixin.open.bean.result.WxOpenResult;
import java.util.List;
@@ -26,6 +27,7 @@ public interface WxOpenComponentService {
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";
+
/**
* 手机端打开授权链接
*/
@@ -45,6 +47,13 @@ public interface WxOpenComponentService {
String CREATE_OPEN_URL= "https://api.weixin.qq.com/cgi-bin/open/create";
+ /**
+ * 快速创建小程序接口
+ */
+ String FAST_REGISTER_WEAPP_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=create";
+ String FAST_REGISTER_WEAPP_SEARCH_URL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp?action=search";
+
+
WxMpService getWxMpServiceByAppid(String appid);
/**
@@ -55,6 +64,13 @@ public interface WxOpenComponentService {
*/
WxOpenMaService getWxMaServiceByAppid(String appid);
+ /**
+ * 获取指定appid的快速创建的小程序服务
+ * @param appid
+ * @return
+ */
+ WxOpenFastMaService getWxFastMaServiceByAppid(String appid);
+
WxOpenConfigStorage getWxOpenConfigStorage();
boolean checkSignature(String timestamp, String nonce, String signature);
@@ -182,4 +198,37 @@ public interface WxOpenComponentService {
* @return
*/
WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException;
+
+ /**
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
+ * 第三方平台快速创建小程序
+ *
+ * 注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞
+ *
+ * @param name 企业名(需与工商部门登记信息一致)
+ * @param code 企业代码
+ * @param codeType 企业代码类型 1:统一社会信用代码(18位) 2:组织机构代码(9位xxxxxxxx-x) 3:营业执照注册号(15位)
+ * @param legalPersonaWechat 法人微信号
+ * @param legalPersonaName 法人姓名(绑定银行卡)
+ * @param componentPhone 第三方联系电话(方便法人与第三方联系)
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException;
+
+ /**
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
+ * 查询第三方平台快速创建小程序的任务状态
+ *
+ * 注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。
+ * 小程序的成功状态可在第三方服务器中自行对账、查询。
+ * 不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato
+ *
+ *
+ * @param name 企业名(需与工商部门登记信息一致)
+ * @param legalPersonaWechat 法人微信号
+ * @param legalPersonaName 法人姓名(绑定银行卡)
+ * @throws WxErrorException
+ */
+ WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
new file mode 100644
index 00000000..987a6b97
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
@@ -0,0 +1,188 @@
+package me.chanjar.weixin.open.api;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.fastma.WxFastMaCategory;
+import me.chanjar.weixin.open.bean.result.*;
+
+import java.util.List;
+
+/**
+ *
+ * 微信开放平台【快速创建小程序】的专用接口
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21528465979XX32V&token=&lang=zh_CN
+ * 注意:该类的接口仅限通过快速创建小程序接口的小程序使用
+ *
+ * TODO 完善相应API的respons实体
+ *
+ * @author Hipple
+ * @date 2019/01/23
+ */
+public interface WxOpenFastMaService extends WxMaService {
+
+ /**
+ * 1 获取帐号基本信息
+ */
+ String OPEN_GET_ACCOUNT_BASIC_INFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo";
+
+ /**
+ * 2 小程序名称设置及改名
+ */
+ String OPEN_SET_NICKNAME = "https://api.weixin.qq.com/wxa/setnickname";
+
+ /**
+ * 3 小程序改名审核状态查询
+ */
+ String OPEN_API_WXA_QUERYNICKNAME = "https://api.weixin.qq.com/wxa/api_wxa_querynickname";
+
+ /**
+ * 4 微信认证名称检测
+ */
+ String OPEN_CHECK_WX_VERIFY_NICKNAME = "https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname";
+
+ /**
+ * 5 修改头像
+ */
+ String OPEN_MODIFY_HEADIMAGE = "https://api.weixin.qq.com/cgi-bin/account/modifyheadimage";
+
+ /**
+ * 6修改功能介绍
+ */
+ String OPEN_MODIFY_SIGNATURE = "https://api.weixin.qq.com/cgi-bin/account/modifysignature";
+
+ /**
+ * 7 换绑小程序管理员接口
+ */
+ String OPEN_COMPONENT_REBIND_ADMIN = "https://api.weixin.qq.com/cgi- bin/account/componentrebindadmin";
+
+ /**
+ * 8.1 获取账号可以设置的所有类目
+ */
+ String OPEN_GET_ALL_CATEGORIES = "https://api.weixin.qq.com/cgi-bin/wxopen/getallcategories";
+ /**
+ * 8.2 添加类目
+ */
+ String OPEN_ADD_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/addcategory";
+ /**
+ * 8.3 删除类目
+ */
+ String OPEN_DELETE_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/deletecategory";
+ /**
+ * 8.4 获取账号已经设置的所有类目
+ */
+ String OPEN_GET_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/getcategory";
+ /**
+ * 8.5 修改类目
+ */
+ String OPEN_MODIFY_CATEGORY = "https://api.weixin.qq.com/cgi-bin/wxopen/modifycategory";
+
+
+ /**
+ * 1.获取小程序的信息
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException;
+
+ /**
+ * 2.小程序名称设置及改名
+ *
+ * 若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。
+ *
+ * @param nickname 昵称
+ * @param idCard 身份证照片–临时素材mediaid(个人号必填)
+ * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
+ * @param namingOtherStuff1 其他证明材料---临时素材 mediaid
+ * @param namingOtherStuff2 其他证明材料---临时素材 mediaid
+ * @throws WxErrorException
+ */
+ WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException;
+
+ /**
+ * 3 小程序改名审核状态查询
+ * @param auditId 审核单id
+ * @return
+ * @throws WxErrorException
+ */
+ WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException;
+
+ /**
+ * 4. 微信认证名称检测
+ * @param nickname 名称
+ * @throws WxErrorException
+ */
+ WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException;
+
+ /**
+ * 5.修改头像
+ *
+ * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
+ * 注:实际头像始终为正方形
+ *
+ * @param headImgMediaId 头像素材media_id
+ * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
+ * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
+ * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
+ * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
+ * @throws WxErrorException
+ */
+ WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException;
+
+ /**
+ * 6.修改功能介绍
+ * @param signature 简介:4-120字
+ * @throws WxErrorException
+ */
+ WxOpenResult modifySignature(String signature) throws WxErrorException;
+
+ /**
+ * 7.3 管理员换绑
+ * @param taskid 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult componentRebindAdmin(String taskid) throws WxErrorException;
+
+ /**
+ * 8.1 获取账号可以设置的所有类目
+ *
+ * 因为不同类目含有特定字段
+ * 目前没有完整的类目信息数据
+ * 为保证兼容性,放弃将response转换为实体
+ *
+ * @return
+ */
+ String getAllCategories() throws WxErrorException;
+
+ /**
+ *8.2添加类目
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult addCategory(List categoryList) throws WxErrorException;
+
+ /**
+ * 8.3删除类目
+ * @param first 一级类目ID
+ * @param second 二级类目ID
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult deleteCategory(int first, int second) throws WxErrorException;
+
+ /**
+ * 8.4获取账号已经设置的所有类目
+ * @return
+ * @throws WxErrorException
+ */
+ WxFastMaBeenSetCategoryResult getCategory() throws WxErrorException;
+
+ /**
+ * 8.5修改类目
+ * @param category 实体
+ * @return
+ * @throws WxErrorException
+ */
+ WxOpenResult modifyCategory(WxFastMaCategory category) 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 4c2a0ee2..8c4cad00 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
@@ -11,10 +11,7 @@ import me.chanjar.weixin.common.util.http.URIUtil;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
-import me.chanjar.weixin.open.api.WxOpenComponentService;
-import me.chanjar.weixin.open.api.WxOpenConfigStorage;
-import me.chanjar.weixin.open.api.WxOpenMaService;
-import me.chanjar.weixin.open.api.WxOpenService;
+import me.chanjar.weixin.open.api.*;
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
import me.chanjar.weixin.open.bean.WxOpenCreateResult;
@@ -24,6 +21,7 @@ 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 me.chanjar.weixin.open.bean.result.WxOpenResult;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -40,6 +38,7 @@ 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<>();
+ private static final Map WX_OPEN_FAST_MA_SERVICE_MAP = new Hashtable<>();
protected final Logger log = LoggerFactory.getLogger(this.getClass());
private WxOpenService wxOpenService;
@@ -79,6 +78,21 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
return wxOpenMaService;
}
+ @Override
+ public WxOpenFastMaService getWxFastMaServiceByAppid(String appId) {
+ WxOpenFastMaService fastMaService = WX_OPEN_FAST_MA_SERVICE_MAP.get(appId);
+ if (fastMaService == null) {
+ synchronized (WX_OPEN_FAST_MA_SERVICE_MAP) {
+ fastMaService = WX_OPEN_FAST_MA_SERVICE_MAP.get(appId);
+ if (fastMaService == null) {
+ fastMaService = new WxOpenFastMaServiceImpl(this, appId, getWxOpenConfigStorage().getWxMaConfig(appId));
+ WX_OPEN_FAST_MA_SERVICE_MAP.put(appId, fastMaService);
+ }
+ }
+ }
+ return fastMaService;
+ }
+
public WxOpenService getWxOpenService() {
return wxOpenService;
}
@@ -238,7 +252,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
getWxOpenConfigStorage().setComponentVerifyTicket(wxMessage.getComponentVerifyTicket());
return "success";
}
- //新增、跟新授权
+ //新增、更新授权
if (StringUtils.equalsAnyIgnoreCase(wxMessage.getInfoType(), "authorized", "updateauthorized")) {
WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthorizationCode());
if (queryAuth == null || queryAuth.getAuthorizationInfo() == null || queryAuth.getAuthorizationInfo().getAuthorizerAppid() == null) {
@@ -246,6 +260,14 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
}
return "success";
}
+ //快速创建小程序
+ if (StringUtils.equalsIgnoreCase(wxMessage.getInfoType(), "notify_third_fasteregister") && wxMessage.getStatus () == 0) {
+ WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthCode ());
+ if (queryAuth == null || queryAuth.getAuthorizationInfo() == null || queryAuth.getAuthorizationInfo().getAuthorizerAppid() == null) {
+ throw new NullPointerException("getQueryAuth");
+ }
+ return "success";
+ }
return "";
}
@@ -398,4 +420,27 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
return WxOpenCreateResult.fromJson(json);
}
+
+ @Override
+ public WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException{
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("name",name);
+ jsonObject.addProperty("code", code);
+ jsonObject.addProperty("code_type", codeType);
+ jsonObject.addProperty("legal_persona_wechat", legalPersonaWechat);
+ jsonObject.addProperty("legal_persona_name", legalPersonaName);
+ jsonObject.addProperty("component_phone", componentPhone);
+ String response = post(FAST_REGISTER_WEAPP_URL, jsonObject.toString (), "component_access_token");
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ @Override
+ public WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException{
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("name",name);
+ jsonObject.addProperty("legal_persona_wechat", legalPersonaWechat);
+ jsonObject.addProperty("legal_persona_name", legalPersonaName);
+ String response = post(FAST_REGISTER_WEAPP_SEARCH_URL, jsonObject.toString (), "component_access_token");
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
new file mode 100644
index 00000000..1314f37f
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
@@ -0,0 +1,256 @@
+package me.chanjar.weixin.open.api.impl;
+
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.config.WxMaConfig;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenComponentService;
+import me.chanjar.weixin.open.api.WxOpenFastMaService;
+import me.chanjar.weixin.open.bean.fastma.WxFastMaCategory;
+import me.chanjar.weixin.open.bean.result.*;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Hipple
+ * @description
+ * @since 2019/1/23 15:27
+ */
+public class WxOpenFastMaServiceImpl extends WxMaServiceImpl implements WxOpenFastMaService {
+
+ protected final Logger log = LoggerFactory.getLogger (this.getClass ());
+
+ private WxOpenComponentService wxOpenComponentService;
+ private WxMaConfig wxMaConfig;
+ private String appId;
+
+ public WxOpenFastMaServiceImpl (WxOpenComponentService wxOpenComponentService, String appId, WxMaConfig wxMaConfig) {
+ this.wxOpenComponentService = wxOpenComponentService;
+ this.appId = appId;
+ this.wxMaConfig = wxMaConfig;
+ initHttp ();
+ }
+
+ @Override
+ public WxMaConfig getWxMaConfig () {
+ return wxMaConfig;
+ }
+
+ @Override
+ public String getAccessToken (boolean forceRefresh) throws WxErrorException {
+ return wxOpenComponentService.getAuthorizerAccessToken (appId, forceRefresh);
+ }
+
+ /**
+ * 1.获取小程序的信息,GET请求
+ *
+ * 注意:这里不能直接用小程序的access_token
+ *
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxFastMaAccountBasicInfoResult getAccountBasicInfo () throws WxErrorException {
+ String response = get (OPEN_GET_ACCOUNT_BASIC_INFO, "");
+ return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaAccountBasicInfoResult.class);
+ }
+
+ /**
+ * 2.小程序名称设置及改名
+ *
+ * @param nickname 昵称
+ * @param idCard 身份证照片–临时素材mediaid(个人号必填)
+ * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
+ * @param namingOtherStuff1 其他证明材料---临时素材 mediaid
+ * @param namingOtherStuff2 其他证明材料---临时素材 mediaid
+ * @throws WxErrorException
+ */
+ @Override
+ public WxFastMaSetNickameResult setNickname (String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("nick_name", nickname);
+ params.addProperty ("id_card", idCard);
+ params.addProperty ("license", license);
+ params.addProperty ("naming_other_stuff_1", namingOtherStuff1);
+ params.addProperty ("naming_other_stuff_2", namingOtherStuff2);
+ String response = post (OPEN_SET_NICKNAME, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaSetNickameResult.class);
+ }
+
+ /**
+ * 3 小程序改名审核状态查询
+ *
+ * @param auditId 审核单id
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxFastMaQueryNicknameStatusResult querySetNicknameStatus (String auditId) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("audit_id", auditId);
+ String response = post (OPEN_API_WXA_QUERYNICKNAME, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaQueryNicknameStatusResult.class);
+ }
+
+ /**
+ * 4. 微信认证名称检测
+ *
+ * 命中关键字策略时返回命中关键字的说明描述
+ *
+ *
+ * @param nickname 名称
+ * @throws WxErrorException
+ */
+ @Override
+ public WxFastMaCheckNickameResult checkWxVerifyNickname (String nickname) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("nick_name", nickname);
+ String response = post (OPEN_CHECK_WX_VERIFY_NICKNAME, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaCheckNickameResult.class);
+ }
+
+ /**
+ * 5.修改头像
+ *
+ * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
+ * 注:实际头像始终为正方形
+ *
+ *
+ * @param headImgMediaId 头像素材media_id
+ * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
+ * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
+ * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
+ * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult modifyHeadImage (String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("head_img_media_id", headImgMediaId);
+ params.addProperty ("x1", x1);
+ params.addProperty ("y1", y1);
+ params.addProperty ("x2", x2);
+ params.addProperty ("y2", y2);
+ String response = post (OPEN_MODIFY_HEADIMAGE, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 6.修改功能介绍
+ *
+ * @param signature 简介:4-120字
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult modifySignature (String signature) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("signature", signature);
+ String response = post (OPEN_MODIFY_SIGNATURE, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 7.3 管理员换绑
+ *
+ * @param taskid 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult componentRebindAdmin (String taskid) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("taskid", taskid);
+ String response = post (OPEN_COMPONENT_REBIND_ADMIN, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 8.1 获取账号可以设置的所有类目
+ *
+ * @return
+ */
+ @Override
+ public String getAllCategories () throws WxErrorException {
+ return get (OPEN_GET_ALL_CATEGORIES, "");
+ }
+
+ /**
+ * 8.2添加类目
+ *
+ * @param categoryList
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult addCategory (List categoryList) throws WxErrorException {
+ Map map = new HashMap<> ();
+ map.put ("categories", categoryList);
+ String response = post (OPEN_ADD_CATEGORY, WxOpenGsonBuilder.create ().toJson (map));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 8.3删除类目
+ *
+ * @param first 一级类目ID
+ * @param second 二级类目ID
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult deleteCategory (int first, int second) throws WxErrorException {
+ JsonObject params = new JsonObject ();
+ params.addProperty ("first", first);
+ params.addProperty ("Second", second);
+ String response = post (OPEN_DELETE_CATEGORY, GSON.toJson (params));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 8.4获取账号已经设置的所有类目
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxFastMaBeenSetCategoryResult getCategory () throws WxErrorException {
+ String response = get (OPEN_GET_CATEGORY, "");
+ return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaBeenSetCategoryResult.class);
+ }
+
+ /**
+ * 8.5修改类目
+ *
+ * @param category 实体
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult modifyCategory (WxFastMaCategory category) throws WxErrorException {
+ String response = post (OPEN_MODIFY_CATEGORY, GSON.toJson (category));
+ return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class);
+ }
+
+ /**
+ * 将字符串对象转化为GsonArray对象
+ *
+ * @param strList
+ * @return
+ */
+ private JsonArray toJsonArray (List strList) {
+ JsonArray jsonArray = new JsonArray ();
+ if (strList != null && ! strList.isEmpty ()) {
+ for (String str : strList) {
+ jsonArray.add (str);
+ }
+ }
+ return jsonArray;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java
new file mode 100644
index 00000000..b854877a
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java
@@ -0,0 +1,36 @@
+package me.chanjar.weixin.open.bean.fastma;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Hipple
+ * @description 修改更新类目所需实体
+ * @since 2019/1/25 10:49
+ */
+@Data
+public class WxFastMaCategory implements Serializable {
+
+ /**
+ * 一级类目ID
+ */
+ private int first;
+
+ /**
+ * 二级类目ID
+ */
+ private int second;
+
+ /**
+ * 资质信息
+ */
+ private List certicates;
+
+ @Data
+ public class certicaty {
+ private String key;
+ private String value;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
index a6ba9945..0473cc3c 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
@@ -1,12 +1,5 @@
package me.chanjar.weixin.open.bean.message;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.commons.io.IOUtils;
-
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.Data;
@@ -17,6 +10,12 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
import me.chanjar.weixin.open.util.WxOpenCryptUtil;
import me.chanjar.weixin.open.util.xml.XStreamTransformer;
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
/**
* @author 007
@@ -57,6 +56,53 @@ public class WxOpenXmlMessage implements Serializable {
@XStreamConverter(value = XStreamCDataConverter.class)
private String preAuthCode;
+ // 以下为快速创建小程序接口推送的的信息
+
+ @XStreamAlias ("appid")
+ private String registAppId;
+
+ @XStreamAlias ("status")
+ private int status;
+
+ @XStreamAlias ("auth_code")
+ private String authCode;
+
+ @XStreamAlias ("msg")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String msg;
+
+ @XStreamAlias ("info")
+ private Info info = new Info();
+
+ @XStreamAlias ("info")
+ @Data
+ public static class Info implements Serializable {
+ private static final long serialVersionUID = 7706235740094081194L;
+
+ @XStreamAlias ("name")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String name;
+
+ @XStreamAlias ("code")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String code;
+
+ @XStreamAlias ("code_type")
+ private int codeType;
+
+ @XStreamAlias ("legal_persona_wechat")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String legalPersonaWechat;
+
+ @XStreamAlias ("legal_persona_name")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String legalPersonaName;
+
+ @XStreamAlias ("component_phone")
+ @XStreamConverter (value = XStreamCDataConverter.class)
+ private String componentPhone;
+ }
+
public static String wxMpOutXmlMessageToEncryptedXml(WxMpXmlOutMessage message, WxOpenConfigStorage wxOpenConfigStorage) {
String plainXml = message.toXml();
WxOpenCryptUtil pc = new WxOpenCryptUtil(wxOpenConfigStorage);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
new file mode 100644
index 00000000..b8bf8d83
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
@@ -0,0 +1,135 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Hipple
+ * @description 快速创建的小程序的账号基本信息
+ * @since 2019/1/23 14:39
+ */
+@Data
+@EqualsAndHashCode (callSuper = true)
+public class WxFastMaAccountBasicInfoResult extends WxOpenResult{
+ private static final long serialVersionUID = - 8713680081353954208L;
+
+ /**
+ * 小程序ID
+ */
+ @SerializedName ("appid")
+ private String appId;
+
+ /**
+ * 帐号类型(1:订阅号,2:服务号,3:小程序)
+ */
+ @SerializedName ("account_type")
+ private Integer accountType;
+
+ /**
+ * 主体类型(1:企业)
+ */
+ @SerializedName ("principal_type")
+ private Integer principalType;
+
+ /**
+ * 主体名称
+ */
+ @SerializedName ("principal_name")
+ private String principalName;
+
+ /**
+ * 实名验证状态(1:实名验证成功,2:实名验证中,3:实名验证失败)调用接口1.1创建帐号时,realname_status会初始化为2对于注册方式为微信认证的帐号,资质认证成功时,realname_status会更新为1 注意!!!当realname_status不为1时,帐号只允许调用本文档内的以下API:(即无权限调用其他API) 微信认证相关接口(参考2.x) 帐号设置相关接口(参考3.x)
+ */
+ @SerializedName ("realname_status")
+ private Integer realnameStatus;
+
+
+ /**
+ * 微信认证信息
+ */
+ @SerializedName ("wx_verify_info")
+ private WxVerifyInfo wxVerifyInfo;
+ /**
+ * 功能介绍信息
+ */
+ @SerializedName ("signature_info")
+ private SignatureInfo signatureInfo;
+ /**
+ * 头像信息
+ */
+ @SerializedName ("head_image_info")
+ private HeadImageInfo headImageInfo;
+
+ @Data
+ public static class WxVerifyInfo {
+ /**
+ * 是否资质认证(true:是,false:否)若是,拥有微信认证相关的权限
+ */
+ @SerializedName ("qualification_verify")
+ private Boolean qualificationVerify;
+ /**
+ * 是否名称认证(true:是,false:否)对于公众号(订阅号、服务号),是名称认证,微信客户端才会有微信认证打勾的标识。
+ */
+ @SerializedName ("naming_verify")
+ private Boolean namingVerify;
+ /**
+ * 是否需要年审(true:是,false:否)(qualification_verify = true时才有该字段)
+ */
+ @SerializedName ("annual_review")
+ private Boolean annualReview;
+
+ /**
+ * 年审开始时间,时间戳(qualification_verify = true时才有该字段)
+ */
+ @SerializedName ("annual_review_begin_time")
+ private String annualReviewBeginTime;
+
+ /**
+ * 年审截止时间,时间戳(qualification_verify = true时才有该字段)
+ */
+ @SerializedName ("annual_review_end_time")
+ private String annualReviewEndTime;
+ }
+
+
+ @Data
+ public static class SignatureInfo {
+ /**
+ * 功能介绍
+ */
+ @SerializedName ("signature")
+ private String signature;
+ /**
+ * 头像已使用修改次数(本月)
+ */
+ @SerializedName ("modify_used_count")
+ private Integer modifyUsedCount;
+ /**
+ * 头像修改次数总额度(本月)
+ */
+ @SerializedName ("modify_quota")
+ private Integer modifyQuota;
+ }
+
+
+ @Data
+ public static class HeadImageInfo {
+ /**
+ * 头像url
+ */
+ @SerializedName ("head_image_url")
+ private String headImageUrl;
+ /**
+ * 头像已使用修改次数(本月)
+ */
+ @SerializedName ("modify_used_count")
+ private Integer modifyUsedCount;
+
+ /**
+ * 头像修改次数总额度(本月)
+ */
+ @SerializedName ("modify_quota")
+ private Integer modifyQuota;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
new file mode 100644
index 00000000..11d6693c
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
@@ -0,0 +1,73 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author Hipple
+ * @description 获取小程序已经设置的类目结果类
+ * @since 2019/1/26 18:27
+ */
+@Data
+@EqualsAndHashCode (callSuper = true)
+public class WxFastMaBeenSetCategoryResult extends WxOpenResult {
+ private static final long serialVersionUID = - 7662344448437700644L;
+
+ /**
+ * 一个更改周期内可以设置类目的次数
+ */
+ @SerializedName ("limit")
+ private int limit;
+ /**
+ * 本更改周期内还可以设置类目的次数
+ */
+ @SerializedName ("quota")
+ private int quota;
+ /**
+ * 最多可以设置的类目数量
+ */
+ @SerializedName ("category_limit")
+ private int categoryLimit;
+ /**
+ * 类目
+ */
+ @SerializedName ("categories")
+ private List categories;
+
+ @Data
+ public static class CategoriesBean {
+ /**
+ * 一级类目ID
+ */
+ @SerializedName ("first")
+ private int first;
+ /**
+ * 一级类目名称
+ */
+ @SerializedName ("first_name")
+ private String firstName;
+ /**
+ * 二级类目ID
+ */
+ @SerializedName ("second")
+ private int second;
+ /**
+ * 二级类目名称
+ */
+ @SerializedName ("second_name")
+ private String secondName;
+ /**
+ * 审核状态(1审核中 2审核不通过 3审核通过)
+ */
+ @SerializedName ("audit_status")
+ private int auditStatus;
+ /**
+ * 审核不通过原因
+ */
+ @SerializedName ("audit_reason")
+ private String auditReason;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
new file mode 100644
index 00000000..59d1f456
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
@@ -0,0 +1,58 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Hipple
+ * @description 获取账号所有可以设置的类目
+ * @since 2019/1/26 18:43
+ */
+@Data
+public class WxFastMaCanSetCategoryResult extends WxOpenResult {
+ private static final long serialVersionUID = - 2469386233538980102L;
+ @SerializedName ("errcode")
+ private int errcodeX;
+ @SerializedName ("categories_list")
+ private CategoriesListBean categoriesList;
+
+ @Data
+ public static class CategoriesListBean {
+ private List categories;
+ @Data
+ public static class CategoriesBean {
+ private int id;
+ private QualifyBean qualify;
+ private String name;
+ private int level;
+ private int father;
+ @SerializedName ("sensitive_type")
+ private int sensitiveType;
+ @SerializedName ("available_for_plugin")
+ private boolean availableForPlugin;
+ @SerializedName ("is_hidden")
+ private boolean isHidden;
+ private String type;
+ @SerializedName ("need_report")
+ private int needReport;
+ @SerializedName ("can_use_cityserivce")
+ private int canUseCityserivce;
+ private List children;
+ @SerializedName ("type_list")
+ private List> typeList;
+ @SerializedName ("available_api_list")
+ private List> availableApiList;
+ private List> apis;
+
+ @Data
+ public static class QualifyBean {
+ private String remark;
+ @SerializedName ("exter_list")
+ private List> exterList;
+ }
+
+ }
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
new file mode 100644
index 00000000..943645e3
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Hipple
+ * @description 微信认证名称检测结果类
+ * @since 2019/1/26 17:39
+ */
+@Data
+@EqualsAndHashCode (callSuper = true)
+public class WxFastMaCheckNickameResult extends WxOpenResult {
+ private static final long serialVersionUID = 8022192589710319473L;
+
+ /**
+ * 审核编号.
+ */
+ @SerializedName ("hit_condition")
+ boolean hitCondition;
+
+ /**
+ * 材料说明
+ */
+ @SerializedName ("wording")
+ String wording;
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
new file mode 100644
index 00000000..6594c483
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
@@ -0,0 +1,43 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Hipple
+ * @description 查询改名状态实体类
+ * @since 2019/1/26 17:52
+ */
+@EqualsAndHashCode (callSuper = true)
+@Data
+public class WxFastMaQueryNicknameStatusResult extends WxOpenResult {
+
+ private static final long serialVersionUID = 8492116046290791757L;
+
+ /**
+ * 审核昵称
+ */
+ @SerializedName ("nickname")
+ private String nickname;
+ /**
+ * 审核状态,1:审核中,2:审核失败,3:审核成功
+ */
+ @SerializedName ("audit_stat")
+ private int auditStat;
+ /**
+ * 失败原因
+ */
+ @SerializedName ("fail_reason")
+ private String failReason;
+ /**
+ * 审核提交时间
+ */
+ @SerializedName ("create_time")
+ private String createTime;
+ /**
+ * 审核提交时间
+ */
+ @SerializedName ("audit_time")
+ private String auditTime;
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
new file mode 100644
index 00000000..7a2cab23
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Hipple
+ * @description 设置小程序名称结果类
+ * @since 2019/1/26 17:39
+ */
+@Data
+@EqualsAndHashCode (callSuper = true)
+public class WxFastMaSetNickameResult extends WxOpenResult {
+ private static final long serialVersionUID = 8022192589710319473L;
+
+ /**
+ * 审核编号.
+ */
+ @SerializedName ("audit_id")
+ Long auditId;
+
+ /**
+ * 材料说明
+ */
+ @SerializedName ("wording")
+ String wording;
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java
new file mode 100644
index 00000000..a21d334e
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.open.util.json;
+
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.open.bean.result.WxFastMaAccountBasicInfoResult;
+
+import java.lang.reflect.Type;
+
+/**
+ * @author Hipple
+ * @description
+ * @since 2019/1/23 15:02
+ */
+public class WxFastMaAccountBasicInfoGsonAdapter implements JsonDeserializer {
+ @Override
+ public WxFastMaAccountBasicInfoResult deserialize (JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+ WxFastMaAccountBasicInfoResult accountBasicInfo = new WxFastMaAccountBasicInfoResult ();
+ JsonObject jsonObject = jsonElement.getAsJsonObject();
+
+ accountBasicInfo.setAppId (GsonHelper.getString(jsonObject, "appid"));
+ accountBasicInfo.setAccountType (GsonHelper.getInteger (jsonObject, "account_type"));
+ accountBasicInfo.setPrincipalType (GsonHelper.getInteger (jsonObject, "principal_type"));
+ accountBasicInfo.setPrincipalName (GsonHelper.getString(jsonObject, "principal_name"));
+ accountBasicInfo.setRealnameStatus (GsonHelper.getInteger (jsonObject, "realname_status"));
+
+ WxFastMaAccountBasicInfoResult.WxVerifyInfo verifyInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("wx_verify_info"),
+ new TypeToken () {
+ }.getType());
+ accountBasicInfo.setWxVerifyInfo (verifyInfo);
+
+ WxFastMaAccountBasicInfoResult.SignatureInfo signatureInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("signature_info"),
+ new TypeToken () {
+ }.getType());
+ accountBasicInfo.setSignatureInfo (signatureInfo);
+
+ WxFastMaAccountBasicInfoResult.HeadImageInfo headImageInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("head_image_info"),
+ new TypeToken () {
+ }.getType());
+ accountBasicInfo.setHeadImageInfo (headImageInfo);
+
+ return accountBasicInfo;
+ }
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java
index 703aff12..10c2911d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java
@@ -6,6 +6,7 @@ import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizerInfo;
+import me.chanjar.weixin.open.bean.result.WxFastMaAccountBasicInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
@@ -27,6 +28,8 @@ public class WxOpenGsonBuilder {
INSTANCE.registerTypeAdapter(WxOpenAuthorizerInfoResult.class, new WxOpenAuthorizerInfoResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxOpenAuthorizerOptionResult.class, new WxOpenAuthorizerOptionResultGsonAdapter());
+ INSTANCE.registerTypeAdapter(WxFastMaAccountBasicInfoResult.class, new WxFastMaAccountBasicInfoGsonAdapter ());
+
}
public static Gson create() {
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java
new file mode 100644
index 00000000..5232881c
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.open.bean.result;
+
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+
+public class WxFastMaAccountBasicInfoResultTest {
+ @Test
+ public void testFromJson() throws Exception {
+ String json = "{\n" +
+ " \"errcode\": 0,\n" +
+ " \"errmsg\": \"ok\",\n" +
+ "\t\"appid\": \"wxdc685123d955453\",\n" +
+ " \"account_type\": 2,\n" +
+ "\t\"principal_type\": 1,\n" +
+ "\t\"principal_name\": \"深圳市腾讯计算机系统有限公司\",\n" +
+ " \"realname_status\": 1,\n" +
+ " \"wx_verify_info\": {\n" +
+ " \"qualification_verify\": true,\n" +
+ " \"naming_verify\": true,\n" +
+ " \"annual_review\": true,\n" +
+ " \"annual_review_begin_time\": 1550490981,\n" +
+ " \"annual_review_end_time\": 1558266981\n" +
+ " },\n" +
+ " \"signature_info\": {\n" +
+ " \"signature\": \"功能介绍\",\n" +
+ " \"modify_used_count\": 1,\n" +
+ " \"modify_quota\": 5\n" +
+ " },\n" +
+ "\t\"head_image_info\": {\n" +
+ " \"head_image_url\": \"http://mmbiz.qpic.cn/mmbiz/a5icZrUmbV8p5jb6RZ8aYfjfS2AVle8URwBt8QIu6XbGewB9wiaWYWkPwq4R7pfdsFibuLkic16UcxDSNYtB8HnC1Q/0\",\n" +
+ " \"modify_used_count\": 3,\n" +
+ " \"modify_quota\": 5\n" +
+ " }\n" +
+ "}";
+
+ WxFastMaAccountBasicInfoResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaAccountBasicInfoResult.class);
+
+ assertNotNull(res);
+ assertNotNull(res.getAppId ());
+ assertNotNull(res.getSignatureInfo ().getModifyQuota ());
+ assertNotNull(res.getHeadImageInfo ().getHeadImageUrl ());
+ assertNotNull(res.getWxVerifyInfo ().getNamingVerify ());
+ assertTrue(res.getWxVerifyInfo ().getNamingVerify ());
+ System.out.println(res);
+ }
+
+}
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java
new file mode 100644
index 00000000..3cd95254
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java
@@ -0,0 +1,40 @@
+package me.chanjar.weixin.open.bean.result;
+
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+
+public class WxFastMaBeenSetCategoryResultTest {
+ @Test
+ public void testFromJson() throws Exception {
+ String json = "{\n" +
+ " \"errcode\": 0,\n" +
+ " \"errmsg\":\"ok\",\n" +
+ " \"categories\": [\n" +
+ " {\n" +
+ " \"first\": 8,\n" +
+ " \"first_name\": \"教育\",\n" +
+ " \"second\": 39,\n" +
+ " \"second_name\": \"出国移民\",\n" +
+ " \"audit_status\": 1,\n" +
+ " \"audit_reason\": \"不通过啊啊\"\n" +
+ " }\n" +
+ " ],\n" +
+ "\t\"limit\": 5,\n" +
+ " \"quota\": 4,\n" +
+ " \"category_limit\": 20\n" +
+ "}";
+
+ WxFastMaBeenSetCategoryResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaBeenSetCategoryResult.class);
+
+ assertNotNull(res);
+ assertTrue(res.getCategories ().size ()> 0);
+ assertNotNull(res.getCategories ().get (0));
+ assertNotNull(res.getCategories ().get (0).getFirstName ());
+ System.out.println(res);
+ }
+
+}
diff --git a/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java
new file mode 100644
index 00000000..7e7d220a
--- /dev/null
+++ b/weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java
@@ -0,0 +1,79 @@
+package me.chanjar.weixin.open.bean.result;
+
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertNotNull;
+
+
+public class WxFastMaCanSetCategoryResultTest {
+ @Test
+ public void testFromJson() throws Exception {
+ String json = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"categories_list\": {\n" +
+ " \"categories\": [\n" +
+ " {\n" +
+ " \"id\": 1, \n" +
+ " \"name\": \"快递业与邮政\", \n" +
+ " \"level\": 1, \n" +
+ " \"father\": 0, \n" +
+ " \"children\": [\n" +
+ " 2, \n" +
+ " 5, \n" +
+ " 556, \n" +
+ " 558, \n" +
+ " 1033\n" +
+ " ], \n" +
+ " \"sensitive_type\": 0, \n" +
+ " \"type_list\": [ ], \n" +
+ " \"qualify\": {\n" +
+ " \"exter_list\": [ ], \n" +
+ " \"remark\": \"\"\n" +
+ " }, \n" +
+ " \"available_api_list\": [ ], \n" +
+ " \"apis\": [ ], \n" +
+ " \"available_for_plugin\": true\n" +
+ " }, \n" +
+ " {\n" +
+ " \"id\": 8, \n" +
+ " \"name\": \"教育\", \n" +
+ " \"level\": 1, \n" +
+ " \"father\": 0, \n" +
+ " \"children\": [\n" +
+ " 9, \n" +
+ " 590, \n" +
+ " 592, \n" +
+ " 27, \n" +
+ " 32, \n" +
+ " 37, \n" +
+ " 39, \n" +
+ " 578, \n" +
+ " 580, \n" +
+ " 582, \n" +
+ " 1043\n" +
+ " ], \n" +
+ " \"sensitive_type\": 0, \n" +
+ " \"type_list\": [ ], \n" +
+ " \"qualify\": {\n" +
+ " \"exter_list\": [ ], \n" +
+ " \"remark\": \"\"\n" +
+ " }, \n" +
+ " \"is_hidden\": false, \n" +
+ " \"available_api_list\": [ ], \n" +
+ " \"type\": \"NORMAL\", \n" +
+ " \"apis\": [ ], \n" +
+ " \"available_for_plugin\": true\n" +
+ " }\n" +
+ " ]\n" +
+ " }\n" +
+ "}";
+ WxFastMaCanSetCategoryResult res = WxOpenGsonBuilder.create ().fromJson (json, WxFastMaCanSetCategoryResult.class);
+
+ assertNotNull(res);
+ assertNotNull(res.getCategoriesList ());
+ System.out.println(res);
+ }
+
+}
diff --git a/weixin-java-open/src/test/resources/logback-test.xml b/weixin-java-open/src/test/resources/logback-test.xml
new file mode 100644
index 00000000..e4a33acd
--- /dev/null
+++ b/weixin-java-open/src/test/resources/logback-test.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %replace(%caller{1}){'Caller', ''} - %msg%n
+
+
+
+
+
+
+
+
diff --git a/weixin-java-open/src/test/resources/test-config.sample.xml b/weixin-java-open/src/test/resources/test-config.sample.xml
new file mode 100644
index 00000000..896969e4
--- /dev/null
+++ b/weixin-java-open/src/test/resources/test-config.sample.xml
@@ -0,0 +1,7 @@
+
+ 第三方平台appID
+ 第三方平台appsecret
+ 第三方平台Token
+ 第三方平台EncodingAESKey
+ 测试APPID
+
diff --git a/weixin-java-open/src/test/resources/testng.xml b/weixin-java-open/src/test/resources/testng.xml
new file mode 100644
index 00000000..8ade76f3
--- /dev/null
+++ b/weixin-java-open/src/test/resources/testng.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+