Browse Source

#932 增加第三方平台快速创建小程序接口及相关的信息设置接口

* Add 接收API创建小程序成功的消息推送
     实现快速创建小程序的新建、查询接口
     增加WxOpenFastMaService(API创建的小程序专用的接口)

* Add 实现小程序名称设置及改名、微信认证名称检测、修改头像、修改功能介绍接口

* Add 实现所有通过API创建的小程序专属接口及相关结果类

* Add 添加三个复杂实体的单体测试

* Update 修复WxFastMaService 8.1接口:因为不同类目含有特定字段,目前没有完整的类目信息数据,为保证兼容性,放弃将response转换为实体

* Update 将快速创建小程序接口返回值更改为WxOpenResult
master
Hipple 6 years ago
committed by Binary Wang
parent
commit
014fb28354
20 changed files with 1247 additions and 12 deletions
  1. +49
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
  2. +188
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
  3. +50
    -5
      weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java
  4. +256
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java
  5. +36
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java
  6. +53
    -7
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
  7. +135
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
  8. +73
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
  9. +58
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
  10. +29
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
  11. +43
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
  12. +29
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
  13. +44
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java
  14. +3
    -0
      weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java
  15. +51
    -0
      weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java
  16. +40
    -0
      weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java
  17. +79
    -0
      weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java
  18. +13
    -0
      weixin-java-open/src/test/resources/logback-test.xml
  19. +7
    -0
      weixin-java-open/src/test/resources/test-config.sample.xml
  20. +11
    -0
      weixin-java-open/src/test/resources/testng.xml

+ 49
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java View File

@@ -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.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult; import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
import me.chanjar.weixin.open.bean.result.WxOpenResult;


import java.util.List; 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 API_SET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option";


String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s"; String 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 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); WxMpService getWxMpServiceByAppid(String appid);


/** /**
@@ -55,6 +64,13 @@ public interface WxOpenComponentService {
*/ */
WxOpenMaService getWxMaServiceByAppid(String appid); WxOpenMaService getWxMaServiceByAppid(String appid);


/**
* 获取指定appid的快速创建的小程序服务
* @param appid
* @return
*/
WxOpenFastMaService getWxFastMaServiceByAppid(String appid);

WxOpenConfigStorage getWxOpenConfigStorage(); WxOpenConfigStorage getWxOpenConfigStorage();


boolean checkSignature(String timestamp, String nonce, String signature); boolean checkSignature(String timestamp, String nonce, String signature);
@@ -182,4 +198,37 @@ public interface WxOpenComponentService {
* @return * @return
*/ */
WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; 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;
} }

+ 188
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java View File

@@ -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;
}

+ 50
- 5
weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java View File

@@ -11,10 +11,7 @@ import me.chanjar.weixin.common.util.http.URIUtil;
import me.chanjar.weixin.common.util.json.WxGsonBuilder; import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; 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.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
import me.chanjar.weixin.open.bean.WxOpenCreateResult; 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.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult; 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 me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -40,6 +38,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
private static final JsonParser JSON_PARSER = new JsonParser(); 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, 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, 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()); protected final Logger log = LoggerFactory.getLogger(this.getClass());
private WxOpenService wxOpenService; private WxOpenService wxOpenService;
@@ -79,6 +78,21 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
return wxOpenMaService; 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() { public WxOpenService getWxOpenService() {
return wxOpenService; return wxOpenService;
} }
@@ -238,7 +252,7 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
getWxOpenConfigStorage().setComponentVerifyTicket(wxMessage.getComponentVerifyTicket()); getWxOpenConfigStorage().setComponentVerifyTicket(wxMessage.getComponentVerifyTicket());
return "success"; return "success";
} }
//新增、新授权
//新增、新授权
if (StringUtils.equalsAnyIgnoreCase(wxMessage.getInfoType(), "authorized", "updateauthorized")) { if (StringUtils.equalsAnyIgnoreCase(wxMessage.getInfoType(), "authorized", "updateauthorized")) {
WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthorizationCode()); WxOpenQueryAuthResult queryAuth = wxOpenService.getWxOpenComponentService().getQueryAuth(wxMessage.getAuthorizationCode());
if (queryAuth == null || queryAuth.getAuthorizationInfo() == null || queryAuth.getAuthorizationInfo().getAuthorizerAppid() == null) { if (queryAuth == null || queryAuth.getAuthorizationInfo() == null || queryAuth.getAuthorizationInfo().getAuthorizerAppid() == null) {
@@ -246,6 +260,14 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
} }
return "success"; 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 ""; return "";
} }


@@ -398,4 +420,27 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {


return WxOpenCreateResult.fromJson(json); 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);
}
} }

+ 256
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenFastMaServiceImpl.java View File

@@ -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;
}
}

+ 36
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java View File

@@ -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;
}
}

+ 53
- 7
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java View File

@@ -1,12 +1,5 @@
package me.chanjar.weixin.open.bean.message; 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.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.Data; 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.api.WxOpenConfigStorage;
import me.chanjar.weixin.open.util.WxOpenCryptUtil; import me.chanjar.weixin.open.util.WxOpenCryptUtil;
import me.chanjar.weixin.open.util.xml.XStreamTransformer; 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> * @author <a href="https://github.com/007gzs">007</a>
@@ -57,6 +56,53 @@ public class WxOpenXmlMessage implements Serializable {
@XStreamConverter(value = XStreamCDataConverter.class) @XStreamConverter(value = XStreamCDataConverter.class)
private String preAuthCode; 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) { public static String wxMpOutXmlMessageToEncryptedXml(WxMpXmlOutMessage message, WxOpenConfigStorage wxOpenConfigStorage) {
String plainXml = message.toXml(); String plainXml = message.toXml();
WxOpenCryptUtil pc = new WxOpenCryptUtil(wxOpenConfigStorage); WxOpenCryptUtil pc = new WxOpenCryptUtil(wxOpenConfigStorage);


+ 135
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java View File

@@ -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;
}
}

+ 73
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java View File

@@ -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;
}
}

+ 58
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java View File

@@ -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;
}

}
}
}

+ 29
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java View File

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

}

+ 43
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java View File

@@ -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;
}

+ 29
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java View File

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

}

+ 44
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxFastMaAccountBasicInfoGsonAdapter.java View File

@@ -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;
}
}

+ 3
- 0
weixin-java-open/src/main/java/me/chanjar/weixin/open/util/json/WxOpenGsonBuilder.java View File

@@ -6,6 +6,7 @@ import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo; import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizerInfo; 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.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerOptionResult;
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult; import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
@@ -27,6 +28,8 @@ public class WxOpenGsonBuilder {
INSTANCE.registerTypeAdapter(WxOpenAuthorizerInfoResult.class, new WxOpenAuthorizerInfoResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxOpenAuthorizerInfoResult.class, new WxOpenAuthorizerInfoResultGsonAdapter());
INSTANCE.registerTypeAdapter(WxOpenAuthorizerOptionResult.class, new WxOpenAuthorizerOptionResultGsonAdapter()); INSTANCE.registerTypeAdapter(WxOpenAuthorizerOptionResult.class, new WxOpenAuthorizerOptionResultGsonAdapter());


INSTANCE.registerTypeAdapter(WxFastMaAccountBasicInfoResult.class, new WxFastMaAccountBasicInfoGsonAdapter ());

} }


public static Gson create() { public static Gson create() {


+ 51
- 0
weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResultTest.java View File

@@ -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);
}

}

+ 40
- 0
weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResultTest.java View File

@@ -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);
}

}

+ 79
- 0
weixin-java-open/src/test/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResultTest.java View File

@@ -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);
}

}

+ 13
- 0
weixin-java-open/src/test/resources/logback-test.xml View File

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

+ 7
- 0
weixin-java-open/src/test/resources/test-config.sample.xml View File

@@ -0,0 +1,7 @@
<xml>
<componentAppId>第三方平台appID</componentAppId>
<componentSecret>第三方平台appsecret</componentSecret>
<componentToken>第三方平台Token</componentToken>
<componentAesKey>第三方平台EncodingAESKey</componentAesKey>
<appId>测试APPID</appId>
</xml>

+ 11
- 0
weixin-java-open/src/test/resources/testng.xml View File

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

Loading…
Cancel
Save