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 @@ + + + + + + + + + + +