* Add 接收API创建小程序成功的消息推送
实现快速创建小程序的新建、查询接口
增加WxOpenFastMaService(API创建的小程序专用的接口)
* Add 实现小程序名称设置及改名、微信认证名称检测、修改头像、修改功能介绍接口
* Add 实现所有通过API创建的小程序专属接口及相关结果类
* Add 添加三个复杂实体的单体测试
* Update 修复WxFastMaService 8.1接口:因为不同类目含有特定字段,目前没有完整的类目信息数据,为保证兼容性,放弃将response转换为实体
* Update 将快速创建小程序接口返回值更改为WxOpenResult
master
| @@ -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 | |||
| * 第三方平台快速创建小程序 | |||
| * <pre> | |||
| * 注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞 | |||
| * </pre> | |||
| * @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 | |||
| * 查询第三方平台快速创建小程序的任务状态 | |||
| * <pre> | |||
| * 注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。 | |||
| * 小程序的成功状态可在第三方服务器中自行对账、查询。 | |||
| * 不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato | |||
| * </pre> | |||
| * | |||
| * @param name 企业名(需与工商部门登记信息一致) | |||
| * @param legalPersonaWechat 法人微信号 | |||
| * @param legalPersonaName 法人姓名(绑定银行卡) | |||
| * @throws WxErrorException | |||
| */ | |||
| WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException; | |||
| } | |||
| @@ -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; | |||
| /** | |||
| * <pre> | |||
| * 微信开放平台【快速创建小程序】的专用接口 | |||
| * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21528465979XX32V&token=&lang=zh_CN | |||
| * 注意:该类的接口仅限通过快速创建小程序接口的小程序使用 | |||
| * </pre> | |||
| * 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.小程序名称设置及改名 | |||
| * <pre> | |||
| * 若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。 | |||
| * </pre> | |||
| * @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.修改头像 | |||
| * <pre> | |||
| * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M | |||
| * 注:实际头像始终为正方形 | |||
| * </pre> | |||
| * @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 获取账号可以设置的所有类目 | |||
| * <pre> | |||
| * 因为不同类目含有特定字段 | |||
| * 目前没有完整的类目信息数据 | |||
| * 为保证兼容性,放弃将response转换为实体 | |||
| * </pre> | |||
| * @return | |||
| */ | |||
| String getAllCategories() throws WxErrorException; | |||
| /** | |||
| *8.2添加类目 | |||
| * @return | |||
| * @throws WxErrorException | |||
| */ | |||
| WxOpenResult addCategory(List<WxFastMaCategory> 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; | |||
| } | |||
| @@ -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<String, WxOpenMaService> WX_OPEN_MA_SERVICE_MAP = new Hashtable<>(); | |||
| private static final Map<String, WxMpService> WX_OPEN_MP_SERVICE_MAP = new Hashtable<>(); | |||
| private static final Map<String, WxOpenFastMaService> 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); | |||
| } | |||
| } | |||
| @@ -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请求 | |||
| * <pre> | |||
| * 注意:这里不能直接用小程序的access_token | |||
| * </pre> | |||
| * | |||
| * @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. 微信认证名称检测 | |||
| * <pre> | |||
| * 命中关键字策略时返回命中关键字的说明描述 | |||
| * </pre> | |||
| * | |||
| * @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.修改头像 | |||
| * <pre> | |||
| * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M | |||
| * 注:实际头像始终为正方形 | |||
| * </pre> | |||
| * | |||
| * @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<WxFastMaCategory> categoryList) throws WxErrorException { | |||
| Map<String, Object> 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<String> strList) { | |||
| JsonArray jsonArray = new JsonArray (); | |||
| if (strList != null && ! strList.isEmpty ()) { | |||
| for (String str : strList) { | |||
| jsonArray.add (str); | |||
| } | |||
| } | |||
| return jsonArray; | |||
| } | |||
| } | |||
| @@ -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<certicaty> certicates; | |||
| @Data | |||
| public class certicaty { | |||
| private String key; | |||
| private String value; | |||
| } | |||
| } | |||
| @@ -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 <a href="https://github.com/007gzs">007</a> | |||
| @@ -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); | |||
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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<CategoriesBean> 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; | |||
| } | |||
| } | |||
| @@ -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<CategoriesBean> 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<Integer> 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; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -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<WxFastMaAccountBasicInfoResult> { | |||
| @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<WxFastMaAccountBasicInfoResult.WxVerifyInfo> () { | |||
| }.getType()); | |||
| accountBasicInfo.setWxVerifyInfo (verifyInfo); | |||
| WxFastMaAccountBasicInfoResult.SignatureInfo signatureInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("signature_info"), | |||
| new TypeToken<WxFastMaAccountBasicInfoResult.SignatureInfo> () { | |||
| }.getType()); | |||
| accountBasicInfo.setSignatureInfo (signatureInfo); | |||
| WxFastMaAccountBasicInfoResult.HeadImageInfo headImageInfo = WxOpenGsonBuilder.create().fromJson(jsonObject.get("head_image_info"), | |||
| new TypeToken<WxFastMaAccountBasicInfoResult.HeadImageInfo> () { | |||
| }.getType()); | |||
| accountBasicInfo.setHeadImageInfo (headImageInfo); | |||
| return accountBasicInfo; | |||
| } | |||
| } | |||
| @@ -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() { | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -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); | |||
| } | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| <configuration> | |||
| <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | |||
| <encoder> | |||
| <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %replace(%caller{1}){'Caller', ''} - %msg%n</pattern> | |||
| </encoder> | |||
| </appender> | |||
| <root level="debug"> | |||
| <appender-ref ref="STDOUT"/> | |||
| </root> | |||
| </configuration> | |||
| @@ -0,0 +1,7 @@ | |||
| <xml> | |||
| <componentAppId>第三方平台appID</componentAppId> | |||
| <componentSecret>第三方平台appsecret</componentSecret> | |||
| <componentToken>第三方平台Token</componentToken> | |||
| <componentAesKey>第三方平台EncodingAESKey</componentAesKey> | |||
| <appId>测试APPID</appId> | |||
| </xml> | |||
| @@ -0,0 +1,11 @@ | |||
| <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > | |||
| <suite name="Weixin-java-tool-suite" verbose="1"> | |||
| <test name="Result_Test"> | |||
| <classes> | |||
| <class name="me.chanjar.weixin.open.bean.result.WxFastMaAccountBasicInfoResultTest"/> | |||
| <class name="me.chanjar.weixin.open.bean.result.WxFastMaCanSetCategoryResultTest"/> | |||
| <class name="me.chanjar.weixin.open.bean.result.WxFastMaBeenSetCategoryResultTest"/> | |||
| </classes> | |||
| </test> | |||
| </suite> | |||