diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java index 5193b3ca..3a175373 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinException.java @@ -1,6 +1,7 @@ package com.foxinmy.weixin4j.exception; import com.foxinmy.weixin4j.util.StringUtil; +import com.foxinmy.weixin4j.util.WeixinErrorUtil; /** * 调用微信接口抛出的异常 @@ -15,17 +16,17 @@ public class WeixinException extends Exception { private static final long serialVersionUID = 7148145661883468514L; - private String errorCode; - private String errorMsg; + private String code; + private String desc; - public WeixinException(String errorCode, String errorMsg) { - this.errorCode = errorCode; - this.errorMsg = errorMsg; + public WeixinException(String code, String desc) { + this.code = code; + this.desc = desc; } - public WeixinException(String errorMsg) { - this.errorCode = "-1"; - this.errorMsg = errorMsg; + public WeixinException(String desc) { + this.code = "-1"; + this.desc = desc; } public WeixinException(Throwable e) { @@ -37,25 +38,27 @@ public class WeixinException extends Exception { } public String getErrorCode() { - return errorCode; + return code; } public String getErrorMsg() { - return errorMsg; + return desc; } @Override public String getMessage() { StringBuilder buf = new StringBuilder(); - if (StringUtil.isNotBlank(errorCode)) { - buf.append(errorCode); + if (StringUtil.isNotBlank(code)) { + buf.append(code); } - if (StringUtil.isNotBlank(errorMsg)) { - buf.append(" ").append(errorMsg); + if (StringUtil.isNotBlank(desc)) { + buf.append(" >> ").append(desc); } - if (buf.length() == 0) { + if (buf.length() > 0) { + buf.append(" >> ").append(WeixinErrorUtil.getText(code)); + return buf.toString(); + } else { return super.getMessage(); } - return buf.toString(); } } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java index 5e52cdec..b66f40b0 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/exception/WeixinPayException.java @@ -12,14 +12,14 @@ package com.foxinmy.weixin4j.exception; public class WeixinPayException extends WeixinException { private static final long serialVersionUID = 7148145661883468514L; - public WeixinPayException(String errorMsg) { - super(errorMsg); + public WeixinPayException(String desc) { + super(desc); } - public WeixinPayException(String errorCode, String errorMsg) { - super(errorCode, errorMsg); + public WeixinPayException(String code, String desc) { + super(code, desc); } - + public WeixinPayException(Throwable e) { super(e); } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java index 78867682..a446df0a 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/WeixinRequestExecutor.java @@ -22,8 +22,6 @@ import com.foxinmy.weixin4j.http.factory.HttpClientFactory; import com.foxinmy.weixin4j.logging.InternalLogger; import com.foxinmy.weixin4j.logging.InternalLoggerFactory; import com.foxinmy.weixin4j.model.Consts; -import com.foxinmy.weixin4j.util.StringUtil; -import com.foxinmy.weixin4j.util.WeixinErrorUtil; import com.foxinmy.weixin4j.xml.XmlStream; /** @@ -95,7 +93,8 @@ public class WeixinRequestExecutor { return doRequest(request); } - protected WeixinResponse doRequest(HttpRequest request) throws WeixinException { + protected WeixinResponse doRequest(HttpRequest request) + throws WeixinException { request.setParams(params); try { logger.info("weixin request >> " + request.getMethod() + " " @@ -144,10 +143,6 @@ public class WeixinRequestExecutor { JsonResult jsonResult = response.getAsJsonResult(); response.setJsonResult(true); if (jsonResult.getCode() != 0) { - if (StringUtil.isBlank(jsonResult.getDesc())) { - jsonResult.setDesc(WeixinErrorUtil.getText(Integer - .toString(jsonResult.getCode()))); - } throw new WeixinException(Integer.toString(jsonResult.getCode()), jsonResult.getDesc()); } diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml index aa4ed292..410cac0f 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml @@ -1,41 +1,34 @@ - - - + + + + + -1 + 系统繁忙,请稍后再试 + 0 - OK 请求成功 - - -1 - system error - 系统繁忙 - - 40001 - invalid credential - 不合法的调用凭证 + 获取access_token时AppSecret错误,或者access_token无效 40002 - invalid grant_type - 不合法的grant_type + 不合法的凭证类型 40003 - invalid openid - 不合法的OpenID + 非法的openid 40004 - invalid media type 不合法的媒体文件类型 40005 - 不合法的文件类型 + 不支持的媒体类型 40006 @@ -43,73 +36,60 @@ 40007 - invalid media_id - 不合法的media_id + 无效的media_id 40008 - invalid message type - 不合法的message_type + 不合法的消息类型 40009 - invalid image size - 不合法的图片大小 + 媒体文件长度不合法 40010 - invalid voice size - 不合法的语音大小 + 不合法的语音文件大小 40011 - invalid video size - 不合法的视频大小 + 不合法的视频文件大小 40012 - invalid thumb size - 不合法的缩略图大小 + 不合法的缩略图文件大小 40013 - invalid appid - 不合法的AppID + 不合法的Appid,请开发者检查AppID的正确性,避免异常字符,注意大小写。 40014 - invalid access_token - 不合法的access_token + 不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 + 40015 - invalid menu type 不合法的菜单类型 40016 - invalid button size - 不合法的菜单按钮个数 + 不合法的按钮个数 40017 - invalid button type - 不合法的按钮类型 + 不合法的按钮个数 40018 - invalid button name size - 不合法的按钮名称长度 + 不合法的按钮名字长度 40019 - invalid button key size 不合法的按钮KEY长度 40020 - invalid button url size - 不合法的url长度 + 不合法的按钮URL长度 40021 @@ -121,50 +101,43 @@ 40023 - invalid sub button size 不合法的子菜单按钮个数 40024 - invalid sub button type - 不合法的子菜单类型 + 不合法的子菜单按钮类型 40025 - invalid sub button name size - 不合法的子菜单按钮名称长度 + 不合法的子菜单按钮名字长度 40026 - invalid sub button key size 不合法的子菜单按钮KEY长度 40027 - invalid sub button url size - 不合法的子菜单按钮url长度 + 不合法的子菜单按钮URL长度 40028 - 不合法的自定义菜单使用员工 + 不合法的自定义菜单使用用户 40029 - invalid code - 不合法或已过期的code + 不合法的oauth_code 40030 - invalid refresh_token 不合法的refresh_token 40031 - 不合法的UserID列表 + 不合法的openid列表 40032 - 不合法的UserID列表长度 + 每次传入的openid列表个数不能超过50个 40033 @@ -172,17 +145,7 @@ 40035 - 不合法的参数 - - - 40036 - invalid template_id size - 不合法的template_id长度 - - - 40037 - invalid template_id - 不合法的template_id + 不符合的图片大小 40038 @@ -190,8 +153,7 @@ 40039 - invalid url size - 不合法的url长度 + 不合法的URL长度 40040 @@ -207,26 +169,35 @@ 40048 - invalid url domain - 不合法的url域名 + url中包含不合法domain + + + 40050 + 不合法的分组id + + + 40051 + 分组名字不合法 + + + 40053 + 不合法的actioninfo,请开发者确认参数正确。 40054 - invalid sub button url domain - 不合法的子菜单按钮url域名 + 不合法的子菜单url域名 40055 - invalid button url domain - 不合法的菜单按钮url域名 + 不合法的按钮url域名 40056 - 不合法的agentid + 不合法的Code码。 40057 - 不合法的callbackurl + 不合法的callbackurl或者callbackurl验证失败 40058 @@ -262,8 +233,7 @@ 40066 - invalid url/department - 不合法的url/不合法的部门列表 + 不合法的部门列表 40067 @@ -279,15 +249,15 @@ 40070 - 列表中所有标签(用户)ID都不合法 + 基本信息base info中填写的库存信息SKU不合法,参考CreateCard创建卡券接口 40071 - 不合法的标签名字,标签名字已经存在 + 不合法的卡券类型。 40072 - 不合法的标签名字长度 + 不合法的编码方式。 40073 @@ -297,21 +267,25 @@ 40074 news消息不支持指定为高保密消息 + + 40075 + 错误的encrypt码 + 40077 不合法的预授权码 40078 - 不合法的临时授权码 + 不合法的卡券状态。 40079 - 不合法的授权信息 + 不合法的时间。 40080 - 不合法的suitesecret + 不合法的CardExt。 40082 @@ -343,7 +317,23 @@ 40094 - 不合法的URL + invalid args + + + 40099 + 卡券已被核销。 + + + 40100 + 不合法的时间区间。 + + + 40104 + 创建子商户时填的类目id不对 + + + 40116 + 不合法的Code码。 40117 @@ -365,67 +355,85 @@ 40121 不合法的media_id类型 + + 40122 + 不合法的库存数量。 + + + 40124 + 会员卡设置查过限制的 custom_field字段。 + + + 40127 + 卡券被用户删除或转赠中。 + + + 40132 + 微信号不合法 + 40137 不支持的图片格式 + + 40139 + 子商户id不正确 + + + 40140 + 子商户状态不对,创建卡券时要求已审核,更新子商户信息时要求已驳回 + + + 40141 + 图片url错误 + 41001 - access_token missing - 缺失access_token参数 + 缺少access_token参数 41002 - appid missing - 缺失appid参数 + 缺少appid参数 41003 - refresh_token missing - 缺失refresh_token参数 + 缺少refresh_token参数 41004 - appsecret missing - 缺失secret参数 + appid为空 41005 - media data missing - 缺失二进制媒体文件 + 缺少多媒体文件数据 41006 - media_id missing - 缺失media_id参数 + 缺少media_id参数 41007 - sub_menu data missing - 缺失子菜单数据 + 缺少子菜单数据 41008 - missing code - 缺失code参数 + 缺少oauth code 41009 - missing openid - 缺失openid参数 + 缺少openid 41010 - missing url - 缺失url参数 + 缺少url 41011 - 缺少agentid + 缺少必填字段。 41012 - 缺少应用头像mediaid + 缺少cardid参数。 41013 @@ -469,7 +477,7 @@ 41025 - 缺少永久授权码 + 缺少location_list 41034 @@ -481,18 +489,15 @@ 42001 - access_token expired - access_token超时 + token过期 42002 - refresh_token expired refresh_token超时 42003 - code expired - code超时 + oauth_code超时 42004 @@ -502,25 +507,29 @@ 42007 用户修改微信密码,accesstoken和refreshtoken失效,需要重新授权 + + 42008 + 临时授权码失效 + + + 42009 + suitetoken失效 + 43001 - require GET method - 需要使用GET方法请求 + 需要GET请求 43002 - require POST method - 需要使用POST方法请求 + 需要POST请求 43003 - require https - 需要使用HTTPS + 需要HTTPS请求 43004 - require subscribe - 需要订阅关系 + 需要接收者关注 43005 @@ -536,15 +545,15 @@ 43008 - 需要支付授权 + 当前账号未开通支付权限或未开通支付后送券接口权限,无法设置支付后送朋友的券功能 43009 - 需要员工已关注 + 自定义SN权限,请前往公众平台申请。 43010 - 需要处于回调模式 + 无储值权限,请前往公众平台申请。 43011 @@ -554,90 +563,69 @@ 43013 应用对成员不可见 + + 43014 + 母商户资料未提交、未审核或审核未通过(母商户资料提交并审核通过后,才能提交子商户资料) + + + 43016 + 第三方平台账号需要完成认证 + 44001 - empty media data 多媒体文件为空 44002 - empty post data - 空白的POST数据 + POST的数据包为空 44003 - empty news data - 空白的news数据 + 图文消息内容为空 44004 - empty content - 空白的内容 - - - 44005 - empty list size - 空白的列表 + 文本消息内容为空 45001 - media size out of limit - 二进制文件超过限制 + 多媒体文件大小超过限制 45002 - content size out of limit - content参数超过限制 + 消息内容超过限制 45003 - title size out of limit - title参数超过限制 + 标题字段超过限制 45004 - description size out of limit - description参数超过限制 + 描述字段超过限制 45005 - url size out of limit - url参数长度超过限制 + 链接字段超过限制 45006 - picurl size out of limit - picurl参数超过限制 + 图片链接字段超过限制 45007 - playtime out of limit - 播放时间超过限制(语音为60s最大) + 语音播放时间超过限制 45008 - article size out of limit - 图文消息的文章数量不能超过10条 + 图文消息超过限制 45009 - api freq out of limit - 接口调动频率超过限制 + 接口调用超过限制 45010 - create menu limit - 建立菜单被限制 - - - 45011 - api limit - 频率限制 - - - 45012 - template size out of limit - 模板大小超过限制 + 创建菜单个数超过限制 45015 @@ -645,27 +633,24 @@ 45016 - can't modify sys group - 不能修改默认组 + 系统分组,不允许修改 45017 - can't set group name too long sys group - 修改组名过长 + 分组名字过长 45018 - too many group now, no need to add new - 组数量过多 + 分组数量超过上限 + + + 45021 + 字段超过长度限制,请参考相应接口的字段说明。 45022 应用名字长度不合法,合法长度为2-16个字 - - 45047 - 客服接口下行条数超过上限 - 45024 账号数量超过上限 @@ -682,10 +667,62 @@ 45027 mpnews每天只能发送100次 + + 45028 + 素材数量超过上限 + + + 45029 + media_id对该应用不可见 + + + 45030 + 该cardid无接口权限。 + + + 45031 + 库存为0。 + 45032 作者名字长度超过限制 + + 45033 + 用户领取次数超过限制get_limit + + + 45047 + 客服接口下行条数超过上限 + + + 45056 + 创建的标签数过多,请注意不能超过100个 + + + 45057 + 该标签下粉丝数超过10w,不允许直接删除 + + + 45058 + 不能修改0/1/2这三个系统默认保留的标签 + + + 45059 + 有粉丝身上的标签数已经超过限制 + + + 45157 + 标签名非法,请注意不能和其他标签重名 + + + 45158 + 标签名长度超过30个字节 + + + 45159 + 非法的标签 + 46001 不存在媒体数据 @@ -700,74 +737,47 @@ 46004 - 不存在的员工 + 不存在的用户 47001 解析JSON/XML内容错误 + + 48001 + 接口功能未授权,请确认公众号已获得该权限 + 48002 - Api禁用 - - - - 61450 - 系统错误(system error) + Api禁用(一般是管理组类型与Api不匹配,例如普通管理组调用会话服务的Api) - 61451 - 参数错误(invalid parameter) + 48003 + suitetoken无效 - 61452 - 无效客服账号(invalid kf_account) + 48004 + api接口被封禁,请登录mp.weixin.qq.com查看详情 - 61453 - 账号已存在(kf_account exsited) + 48005 + api禁止删除被自动回复和自定义菜单引用的素材 - 61454 - 账号名长度超过限制(前缀10个英文字符)(invalid kf_acount length) + 48006 + api禁止清零调用次数,因为清零次数达到上限 - 61455 - 账号名包含非法字符(英文+数字)(illegal character in kf_account) - - - 61456 - 账号个数超过限制(10个客服账号)(kf_account count exceeded) - - - 61457 - 无效头像文件类型(invalid file type) - - - 61458 - 客户正在被其他客服接待(customer accepted by xxx@xxxx) - - - 61459 - 客服不在线(kf offline) - - - 61500 - 日期格式错误 - - - 61501 - 日期范围错误 + 49003 + 传入的openid不属于此AppID 50001 - api/redirect_uri unauthorized - 接口未授权 + 用户未授权该api - 50002 - 员工不在权限范围 + 用户受限,可能是违规后接口被封禁 50003 @@ -775,7 +785,7 @@ 50004 - 员工状态不正确(未关注状态) + 成员状态不正确,需要成员为企业验证中状态 50005 @@ -823,7 +833,7 @@ 60011 - 管理员权限不足(user/department/agent)无权限 + 管理组权限不足,(user/department/agent)无权限 60012 @@ -907,7 +917,7 @@ 60110 - 部门个数超出限制 + 用户同时归属部门超过20个 60111 @@ -935,7 +945,7 @@ 60118 - 成员无有效邀请字段(微信,邮箱,手机号) + 成员无有效邀请字段,详情参考(邀请成员关注)的接口说明 60119 @@ -977,9 +987,449 @@ 60128 字段不合法,可能存在主键冲突或者格式错误 + + 60129 + 用户设置了拒绝邀请 + + + 61017 + 子商户未发起授权,不能进行授权确认 + + + 61018 + 已经confirm确认,无需重复确认 + + + 61019 + 非强授权,不能用confirm确认 + + + 61020 + 提交的参数错误,即不包含在接口字段范围内 + + + 61021 + 尚未进行资料提交,不可confirm + + + 61022 + 审核中和审核通过的商户资料均不能重提。仅审核驳回可重提 + + + 61300 + 不合法的基本信息(base_info) + + + 61301 + 不合法的详情信息(detail_info) + + + 61302 + 不合法的商品推广区信息(action_info) + + + 61303 + 商品信息不存在 + + + 61304 + 推广服务区(action_info)中的product不合法 + + + 61305 + 不合法的keystand或keystr。ean13标准下,编码内容必须满足商户号段。 + + + 61306 + 推广服务区(action_info)中的appid不合法 + + + 61307 + 推广服务区(action_info)中的cardid不合法 + + + 61308 + 基本信息(base_info)不存在 + + + 61309 + 详情信息(detail_info)不存在 + + + 61310 + 推广服务区(action_info)不存在 + + + 61311 + 推广服务区(action_info)中的media不合法 + + + 61312 + 图片大小超出限制 + + + 61313 + 图片内容不合法或没经过Base64编码 + + + 61314 + 不合法的ExtInfo + + + 61316 + 条码冲突,创建了其他正在使用的条码 + + + 61317 + 无效的ticket + + + 61319 + 商户类目ID无效 + + + 61320 + 商户全局信息不存在 + + + 61322 + 商户无此商品类目权限 + + + 61323 + 商户无此条码权限 + + + 61324 + 推广服务区服务栏数量超过限制 + + + 61334 + 商品信息不存在 + + + 61337 + 商品信息已存在 + + + 61341 + 白名单人数超过限制 + + + 61342 + Keystandard与创建时填写的不匹配 + + + 61343 + Keystandard不合法 + + + 61345 + 推广服务区(action_info)中的code不合法 + + + 61346 + 推广服务区(action_info)中的store不合法 + + + 61347 + 推广服务区(action_info)中的media不合法 + + + 61348 + 推广服务区(action_info)中的text不合法 + + + 61450 + 系统错误(system error) + + + 61451 + 参数错误(invalid parameter) + + + 61452 + 无效客服账号(invalid kf_account) + + + 61453 + 账号已存在(kf_account exsited) + + + 61454 + 账号名长度超过限制(前缀10个英文字符)(invalid kf_acount length) + + + 61455 + 账号名包含非法字符(英文+数字)(illegal character in kf_account) + + + 61456 + 账号个数超过限制(100个客服账号)(kf_account count exceeded) + + + 61457 + 无效头像文件类型(invalid file type) + + + 61458 + 客户正在被其他客服接待(customer accepted by xxx@xxxx) + + + 61459 + 客服不在线(kf offline) + + + 61500 + 日期格式错误 + + + 63154 + 不合法的商品状态 + + + 63155 + 不合法的主页颜色 + + + 63156 + 不合法的品牌标签 + + + 63157 + 不合法的推荐商品设置,被推荐的商品也必须来自该账号,并处于发布状态。 + + + 63158 + 商品总数超过限制,上限10万条。 + + + 63159 + 商品建议零售价为空。未设置购买渠道(包括微信小店、电商链接)时,建议零售价必填。 + + + 63160 + 价格信息不合法。retail_price和sale_price参数内容应为数字。 + + + 63161 + 组件区组件数量超过限制,相同组件仅能设置一个。 + + + 63162 + 防伪组件中native_show设置不合法 + + + 63163 + 防伪组件中anti_fake_url不存在 + + + 63164 + 组件区组件类型设置不合法 + + + 63166 + 商品审核中,不可进行更新、取消发布和删除商品等操作 + + + 63167 + 商品未发布,��可进行取消发布操作 + + + 63168 + 商品审核未通过,不可进行取消发布操作 + + + 63169 + 商品处于发布状态,不可再次发布 + + + 65104 + invalid category + + + 65105 + invalid photo url + + + 65106 + poi audit state must be approved + + + 65107 + not allow modify + + + 65109 + invalid business + + + 65110 + invalid address + + + 65111 + invalid telephone + + + 65112 + invalid city + + + 65113 + invalid province + + + 65114 + empty photo list + + + 65115 + invalid poi id + + + 65301 + 不存在此menuid对应的个性化菜单 + + + 65302 + 没有相应的用户 + + + 65303 + 没有默认菜单,不能创建个性化菜单 + + + 65304 + MatchRule信息为空 + + + 65305 + 个性化菜单数量受限 + + + 65306 + 不支持个性化菜单的帐号 + + + 65307 + 个性化菜单信息为空 + + + 65308 + 包含没有响应类型的button + + + 65309 + 个性化菜单开关处于关闭状态 + + + 65310 + 填写了省份或城市信息,国家信息不能为空 + + + 65311 + 填写了城市信息,省份信息不能为空 + + + 65312 + 不合法的国家信息 + + + 65313 + 不合法的省份信息 + + + 65314 + 不合法的城市信息 + + + 65316 + 该公众号的菜单设置了过多的域名外跳(最多跳转到3个域名的链接) + + + 65317 + 不合法的URL + + + 65400 + API不可用,即没有开通或升级到新版客服功能 + + + 65401 + 无效客服帐号 + + + 65402 + 客服帐号尚未绑定微信号,不能投入使用 + + + 65403 + 客服昵称不合法 + + + 65404 + 客服帐号不合法 + + + 65405 + 帐号数目已达到上限,不能继续添加 + + + 65406 + 已经存在的客服帐号 + + + 65407 + 邀请对象已经是该公众号客服 + + + 65408 + 本公众号已经有一个邀请给该微信 + + + 65409 + 无效的微信号 + + + 65410 + 邀请对象绑定公众号客服数达到上限(目前每个微信号可以绑定5个公众号客服帐号) + + + 65411 + 该帐号已经有一个等待确认的邀请,不能重复邀请 + + + 65412 + 该帐号已经绑定微信号,不能进行邀请 + + + 65413 + 不存在对应用户的会话信息 + + + 65414 + 粉丝正在被其他客服接待 + + + 65415 + 指定的客服不在线 + + + 65416 + 查询参数不合法 + + + 65417 + 查询时间段超出限制 + 80001 - 可信域名没有IPC备案,后续将不能在该域名下正常使用jssdk + 可信域名不匹配,或者可信域名没有IPC备案(后续将不能在该域名下正常使用jssdk) + + + 81003 + 邀请额度已用完 82001 @@ -1001,7 +1451,6 @@ 85002 包含不合法的词语 - 86001 不合法的会话ID @@ -1178,159 +1627,29 @@ 86319 不合法的客服,kf不在客服列表中 + + 86320 + 不合法的客服类型 + 90001 - 未开通摇一摇周边 + 未认证摇一摇周边 90002 - 缺少ticket参数 + 缺少摇一摇周边ticket参数 90003 - ticket参数不合法 + 摇一摇周边ticket参数不合法 90004 - ticket过期 - - - - 7000000 - 请求正常,无语义结果 + 摇一摇周边ticket过期 - 7000001 - 缺失请求参数 - - - 7000002 - signature 参数无效 - - - 7000003 - 地理位置相关配置 1 无效 - - - 7000004 - 地理位置相关配置 2 无效 - - - 7000005 - 请求地理位置信息失败 - - - 7000006 - 地理位置结果解析失败 - - - 7000007 - 内部初始化失败 - - - 7000008 - 非法 appid(获取密钥失败) - - - 7000009 - 请求语义服务失败 - - - 7000010 - 非法 post 请求 - - - 7000011 - post 请求 json 字段无效 - - - 7000030 - 查询 query 太短 - - - 7000031 - 查询 query 太长 - - - 7000032 - 城市、经纬度信息缺失 - - - 7000033 - query 请求语义处理失败 - - - 7000034 - 获取天气信息失败 - - - 7000035 - 获取股票信息失败 - - - 7000036 - utf8 编码转换失败 - - - - SYSTEMERROR - SYSTEMERROR - 接口后台错误 - - - INVALID_TRANSACTIONID - INVALID_TRANSACTIONID - 无效 transaction_id - - - PARAM_ERROR - PARAM_ERROR - 提交参数错误 - - - ORDERPAID - ORDERPAID - 订单已支付 - - - OUT_TRADE_NO_USED - OUT_TRADE_NO_USED - 商户订单号重复 - - - NOAUTH - NOAUTH - 商户无权限 - - - NOTENOUGH - NOTENOUGH - 余额不足 - - - NOTSUPORTCARD - NOTSUPORTCARD - 不支持卡类型 - - - ORDERCLOSED - ORDERCLOSED - 订单已关闭 - - - BANKERROR - BANKERROR - 银行系统异常 - - - REFUND_FEE_INVALID - REFUND_FEE_INVALID - 退款金额大于支付金额 - - - ORDERNOTEXIST - ORDERNOTEXIST - 订单不存在 + 90005 + 未开启摇一摇周边服务 9001001 @@ -1440,4 +1759,773 @@ 9001036 查询起始值begin不合法 + + 9001037 + 单个设备绑定页面不能超过30个 + + + 9001038 + 设备总数超过了限额 + + + 9001039 + 不合法的联系人名字 + + + 9001040 + 不合法的联系人电话 + + + 9001041 + 不合法的联系人邮箱 + + + 9001042 + 不合法的行业id + + + 9001043 + 不合法的资质证明文件url,文件需通过“素材管理”接口上传 + + + 9001044 + 缺少资质证明文件 + + + 9001045 + 申请理由不能超过500字 + + + 9001046 + 公众账号未认证 + + + 9001047 + 不合法的设备申请批次id + + + 9001048 + 审核状态为审核中或审核已通过,不能再提交申请请求 + + + 9001049 + 获取分组元数据失败 + + + 9001050 + 账号下分组数达到上限,最多为100个 + + + 9001051 + 分组包含的设备数达到上限,最多为10000个 + + + 9001052 + 每次添加到分组的设备数达到上限,每次最多操作1000个设备 + + + 9001053 + 每次从分组删除的设备数达到上限,每次最多操作1000个设备 + + + 9001054 + 待删除的分组仍存在设备 + + + 9001055 + 分组名称过长,上限为100个字符 + + + 9001056 + 分组待添加或删除的设备列表中包含有不属于该分组的设备id + + + 9001057 + 分组相关信息操作失败 + + + 9001058 + 分组id不存在 + + + 9001059 + 模板页面logo_url为空 + + + 9001060 + 创建红包活动失败 + + + 9001061 + 获得红包活动ID失败 + + + 9001062 + 创建模板页面失败 + + + 9001063 + 红包提供商户公众号ID和红包发放商户公众号ID不一致 + + + 9001064 + 红包权限审核失败 + + + 9001065 + 红包权限正在审核 + + + 9001066 + 红包权限被取消 + + + 9001067 + 没有红包权限 + + + 9001068 + 红包活动时间不在红包权限有效时间内 + + + 9001069 + 设置红包活动开关失败 + + + 9001070 + 获得红包活动信息失败 + + + 9001071 + 查询红包ticket失败 + + + 9001072 + 红包ticket数量超过限制 + + + 9001073 + sponsor_appid与预下单时的wxappid不一致 + + + 9001074 + 获得红包发送ID失败 + + + 9001075 + 录入活动的红包总数超过创建活动时预设的total + + + 9001076 + 添加红包发送ID失败 + + + 9001077 + 解码红包发送ID失败 + + + 9001078 + 获取公众号uin失败 + + + 9001079 + 接口调用appid与调用创建活动接口的appid不一致 + + + 9001090 + 录入的所有ticket都是无效ticket,可能原因为ticket重复使用,过期或金额不在1-1000元之间 + + + 9001091 + 活动已过期 + + + 9002001 + 不合法的请求方式 + + + 9002002 + 系统异常 + + + 9002003 + 网络异常,后台服务超时,请稍后再试 + + + 9002004 + 后台服务调用异常 + + + 9002005 + 签权失败 + + + 9002006 + 未开通微信连Wi-Fi连插件 + + + 9002007 + 缺少参数 + + + 9002008 + 不合法的参数 + + + 9002009 + 门店ID不存在 + + + 9002010 + ssid和密码均未以大写字母“WX”开头,两者中至少有一个以“WX”开头才可添加设备成功 + + + 9002011 + ssid不能包含中文字符 + + + 9002012 + password不能包含中文字符 + + + 9002013 + password必需大于8个字符 + + + 9002014 + 门店下设备的密码不一样 + + + 9002015 + 门店下设备不属于同一SSID + + + 9002016 + 设备已添加过 + + + 9002017 + 设备不存在,无法删除 + + + 9002018 + 门店下有专业设备,不能设置顶部常驻入口 + + + 9002019 + 门店下没有设备 + + + 9002020 + 未认证的账号不能设置商家主页 + + + 9002022 + 门店下已添加非密码型设备,无法再添加密码型设备 + + + 9002023 + 未认证公众账号不能获取 + + + 9002024 + 该账号下没有密码型设备 + + + 9002025 + 该账号下的所有设备,只有全为密码型设备才能获取 + + + 9002026 + 查询列表超过最大限制 + + + 9002027 + 门店下是非密码型设备,不能下载二维码 + + + 9002028 + 门店下已添加非portal改造型设备 + + + 9002029 + 非第三方授权不能获取 + + + 9002030 + 未开通注册portal型设备 + + + 9002031 + 保留现有连网方式的门店,不支持扫二维码方式连网,无法下载二维码 + + + 9002032 + 必需全部设备均为使用微信方式连网才可以获取 + + + 9002033 + 该账号下无设备,至少有一台设备才能获取 + + + 9002034 + 该账号下有专业设备,无法获取 + + + 9002035 + 保留现有连网方式的门店,无法清除门店网络及设备 + + + 9002037 + portal型设备只能修改ssid + + + 9002038 + ssid必须以大写字母“WX”开头 + + + 9002039 + 门店下无网络信息,无法进行修改 + + + 9002040 + 专业型设备的门店,不支持修改网络信息 + + + 9002041 + 未认证的账号不能设置 + + + 9002042 + 保留现有连网方式的门店,不支持设置连网完成页 + + + 9007001 + 门店下的ssid重复 + + + 9007003 + 与门店下的设备类型不一致 + + + 9007004 + 找不到门店ssid信息 + + + 9007005 + 门店下不同的ssid门店信息数量已超过最大限制 + + + 9007006 + 无协议设备的门店,不支持下载二维码 + + + 9007007 + 专业型设备的门店,不支持下载二维码 + + + 9008001 + 找不到卡券 + + + 9008002 + 投放时间超过卡券有效期 + + + -1 + 系统错误。 + + + -1000 + 系统错误 + + + + 132011004 + 参数错误,报关时仅传入订单号,不传入子订单号(sub_order_no)时,不能填费用信息,须以支付系统中的值为准,请检查参数是否都正确 + + + + 132021028 + 交易币种与商户结算币种不一致】,报关时传入子订单号(sub_order_no)时,币种参数(fee_type)必填,请检查所传币种参数(fee_type)是否为空 + + + + AL_STOCK_OVER + 活动已结束,活动已结束,属于正常逻辑错误 + + + AMOUNT_LIMIT + 付款金额不能小于最低限额,付款金额不能小于最低限额,每次付款金额必须大于1元 + + + APPID_MCHID_NOT_MATCH + appid和mch_id不匹配,appid和mch_id不匹配,请确认appid和mch_id是否匹配 + + + APPID_NOT_EXIST + AppId未设置(sub_order_no),appid为必传字段,请检查appid是否正确 + + + AUTHCODEEXPIRE + 二维码已过期,请用户在微信上刷新后再试,支付确认失败,用户的条码已经过期,请收银员提示用户,请用户在微信上刷新条码,然后请收银员重新扫码。 + 直接将错误展示给收银员 + + + + AUTHORITY_NOT_FOUND + 未开通自助清关功能,须先开通自助清关功能才可成功调用接口,请检查是否已开通自助清关功能,开通路径:微信支付商户平台-产品中心-自助清关中申请开通。 + + + + AUTH_CODE_ERROR + 授权码参数错误,支付确认失败,请求参数未按指引进行填写,每个二维码仅限使用一次,请刷新再试 + + + AUTH_CODE_INVALID + 授权码检验错误,支付确认失败,收银员扫描的不是微信支付的条码,请扫描微信支付被扫条码/二维码 + + + BANKERROR + 银行系统异常,支付结果未知,银行端超时,请立即调用被扫订单结果查询API,查询当前订单的不同状态,决定下一步的操作。 + + + + BUYER_MISMATCH + 支付帐号错误,支付确认失败,暂不支持同一笔订单更换支付方,请确认支付方是否相同 + + + CA_ERROR + 请求未携带证书,或请求携带的证书出错,到商户平台下载证书,请求带上证书后重试。 + + + CA_VERIFY_FAILED + 证书验证失败,检查证书是否正确 + + + CHCUSTOMSNO_NOT_SET + 海关备案号未设置,海关备案号为必传字段,请检查备案号是否为空 + + + CODE_2_ID_ERR + 商户id有误,确认商户id是否正确并合法 + + + COUPON_NOT_FOUND + 券没有查找成功,确认券id、用户openid的正确性 + + + COUPON_STOCK_ID_EMPTY + 批次id为空,确认批次id正确传入 + + + COUPON_STOCK_ID_NOT_VALID + 批次id不正确,确认批次id正确性以及和商户id的所属关系是否正确 + + + COUPON_STOCK_NOT_FOUND + 批次信息不存在,确认批次id信息正确 + + + CUSTOMSCONFIG_NOT_SET + 海关配置未设置,报关接口需要商户已配置过海关信息才可以访问,请参照上文中的海关备案指引,进行海关信息报备 + + + CUSTOMS_NOT_SET + 海关信息未设置,海关信息为必传字段,请检查海关信息是否为空 + + + DAY_ OVER_LIMITED + 企业红包的按天日发放受限,单个商户日发送红包数量不大于10000个;(可联系微信支付wxhongbao@tencent.com调高额度) + + + + ERR_VERIFY_SSL_SERIAL + 获取客户端证书序列号失败!,检查证书是否正确 + + + ERR_VERIFY_SSL_SN + 获取客户端证书特征名称(DN)域失败!,检查证书是否正确 + + + FATAL_ERROR + 两次请求参数不一致,两次请求商户单号一样,但是参数不一致,如果想重试前一次的请求,请用原参数重试,如果重新发送,请更换单号。 + + + + FEETYPE_NOT_SET + 币种类型未设置,拆单情况下,币种为必填参数,请检查fee_type是否为空 + + + FREQ_LIMIT + 受频率限制,请对请求做频率控制 + + + FREQ_OVER_LIMIT + 超过发放频率限制,请稍后再试,请求对发放请求做频率控制 + + + GET_COUPON_STOCK_FAIL + 获取批次信息失败,确认批次id信息正确 + + + ILLEGAL_APPID + 错误传入了app的appid,接口传入的所有appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。 + + + + INVALID_MCHCUSTOMSNO + 无效的海关备案号长度,海关备案号一般为6位字符串,请检查海关备案号是否正确 + + + INVALID_SUBORDER_NO + 无效的子订单号长度(sub_order_no),子订单号要求是32位以内的字符串,请检查子订单号长度是否正确 + + + INVALID_TRANSACTIONID + 无效transaction_id,请求参数未按指引进行填写,参数错误,请重新检查 + + + INVALID_TRANSACTION_ID + 无效的微信订单号长度,微信订单号为28位数字,请确保长度一致,请检查微信订单号(transaction_id)是否正确 + + + + LACK_PARAMS + 缺少参数,缺少必要的请求参数,请检查参数是否齐全 + + + MCHID_INVALID_LENGTH + 无效的商户号长度,报关接口只支持12开头10位数字的商户号,请检查商户号长度是否为10位 + + + MCHID_NOT_EXIST + ��户号(mch_id)未设置,MCH_ID为必传字段,请检查mch_id是否正确 + + + MCHID_NOT_SET + 商户号未设置,商户号为必传参数,请求时必传,请检查商户号是否为空 + + + MCH_ID_EMPTY + 商户id为空,确认商户id正确传入 + + + MONEY_LIMIT + 红包金额发放限制,每个红包金额必须大于1元,小于1000元(可联系微信支付wxhongbao@tencent.com调高额度至4999元) + + + + NAME_MISMATCH + 姓名校验出错,请求参数里填写了需要检验姓名,但是输入了错误的姓名,填写正确的用户姓名 + + + NETWORK ERROR + 网络环境不佳,请重试,请重试 + + + NETWORKERROR + 网络环境不佳,请重试,请重试 + + + NOAUTH + 没有权限,没有授权请求此api,请联系微信支付开通api权限 + + + NOTENOUGH + 余额不足,帐号余额不足,请用户充值或更换支付卡后再支付 + + + NOTSUPORTCARD + 不支持卡类型,支付确认失败,用户使用卡种不支持当前支付形式,请用户重新选择卡种 + 建议:商户系统返回给收银台的提示为“该卡不支持当前支付,提示用户换卡支付或绑新卡支付” + + + + NOT_FOUND + 指定单号数据不存在,查询单号对应的数据不存在,请使用正确的商户订单号查询 + + + NOT_UTF8 + 编码格式错误,未使用指定编码格式,请使用NOT_UTF8编码格式 + + + NO_AUTH + 无权限,未获得此接口的调用权限,请检查当前商户号是否已获得此接口的调用权限 + + + OPENID_ERROR + Openid错误,Openid格式错误或者不属于商家公众账号,请核对商户自身公众号appid和用户在此公众号下的openid。 + + + + OPEN_ID_EMPTY + 用户openid为空,检查用户openid是否正确并合法 + + + ORDERCLOSED + 订单已关闭,订单已关闭,无法重复关闭,订单已关闭,无需继续调用 + + + ORDERNOTEXIST + 订单不存在,订单系统不存在此订单,不需要关单,当作未提交的支付的订单 + + + ORDERPAID + 订单已支付,订单已支付,不能发起关单,订单已支付,不能发起关单,请当作已支付的正常交易 + + + ORDERREVERSED + 订单已撤销,支付确认失败,当前订单已经被撤销,当前订单状态为“订单已撤销”,请提示用户重新支付 + + + OUTTRADENO_NOT_SET + 商户订单号(out_trade_no)未设置,商户订单号为必传参数,请检查商户订单号(out_trade_no)是否为空 + + + + OUT_TRADE_NO_USED + 商户订单号重复,同一笔交易不能多次提交,请核实商户订单号是否重复提交 + + + PARAM_ERROR + 参数错误,请查看err_code_des,修改设置错误的参数 + + + PAYFEE_NOT_MATCH + 金额不匹配,报关的订单金额必须和支付的金额一致,请检查报关订单的金额是否正确 + + + POST_DATA_EMPTY + post数据为空,post数据不能为空,请检查post数据是否为空 + + + REQUIRE_POST_METHOD + 请使用post方法,未使用post传递参数 ,请检查请求参数是否通过post方法提交 + + + REQ_PARAM_XML_ERR + 输入的参数xml格式有误,检查输入的xml格式是否正确 + + + SECOND_OVER_LIMITED + 企业红包的按分钟发放受限,每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度) + + + + SENDNUM_LIMIT + 该用户今日领取红包个数超过限制,如有需要、请在微信支付商户平台【api安全】中重新配置 + 【每日同一用户领取本商户红包不允许超过的个数】。 + + + + SEND_FAILED + 红包发放失败,请更换单号再重试,原商户单号已经失败,如果还要对同一个用户发放红包, 需要更换新的商户单号再试。 + + + SIGNERROR + 签名错误,参数签名结果不正确,请检查签名参数和方法是否都符合签名算法要求 + + + SIGN_ERROR + 商户签名错误,按文档要求重新生成签名后再重试。 + + + STOCK_IS_NOT_VALID + 抱歉,该代金券已失效,  + + + SYSTEMERROR + 系统繁忙,请再试。,系统繁忙。 + + + TRANSACTION_ID_NOT_SET + 微信订单号(transaction_id)未设置,微信订单号(transaction_id)为必传参数,请检查微信订单号(transaction_id)是否为空 + + + + USERPAYING + 用户支付中,需要输入密码,支付结果未知,该笔交易因为业务规则要求,需要用户输入支付密码。,等待5秒,然后调用被扫订单结果查询API,查询当前订单的不同状态,决定下一步的操作。 + + + + USER_ACCOUNT_ABNORMAL + 退款请求失败,用户帐号异常或注销,此状态代表退款申请失败,商户可自行处理退款。 + + + USER_AL_GET_COUPON + 你已领取过该代金券,用户已领过,正常逻辑报错 + + + XML_ERROR + 请求的xml格式错误,或者post的数据为空,检查请求串,确认无误后重试 + + + XML_FORMAT_ERROR + XML格式错误,XML格式错误,请检查XML参数格式是否正确 + + + appid字段必填,最长为32个字符 + 请求的appid字段填写错误,填写正确的appid后重试 + + + client_ip必须是合法的IP字符串 + 请求的client_ip填写不正确,填写正确的IP后重试 + + + nick_name字段必填,并且少于16字符 + 请求的nick_name字段错误,按文档填写正确的nick_name后重试 + + + nonce_str字段必填,并且少于32字符 + 请求的nonce_str字段填写不正确,按文档要求填写正确的nonce_str值后重试 + + + re_openid字段为必填并且少于32个字符 + 请求的re_openid字段非法,填写对re_openid后重试 + + + remark字段为必填,并且少于256字符 + 请求的remark字段填写错误,填写正确的remark后重试 + + + send_name字段为必填并且少于32字符 + 请求的send_name字段填写不正确,按文档填写正确的send_name字段后重试 + + + total_num必须为1 + total_num字段值不为1,修改total_num值为1后重试 + + + wishing字段为必填,并且少于128个字符 + 缺少wishing字段,填写wishing字段再重试 + + + 发放金额、最小金额、最大金额必须相等 + 请求的金额相关字段填写错误,按文档要求填写正确的金额后重试 + + + 商户号和wxappid不匹配 + 商户号和wxappid不匹配,请修改Mchid或wxappid参数 + + + 找不到对应的商户号 + 请求的mchid字段填写错误,填写正确的mchid字段后重试 + + + 红包金额参数错误 + 红包金额过大,修改金额重试 + + + 订单号字段必填,最长为28个字符 + 请求的mch_billno字段填写错误,填写正确的billno后重试 + + + 输入的商户号有误 + 请求的mchid字段非法(或者没填),填写对应的商户���再重试 + + + 金额和原始单参数不一致 + 更换了金额,但商户单号未更新,请商户检查代码实现逻辑,请检查金额、商户订单号是否正确 + \ No newline at end of file diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKConfigurator.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKConfigurator.java index 205b905a..285821fc 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKConfigurator.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/jssdk/JSSDKConfigurator.java @@ -97,9 +97,11 @@ public class JSSDKConfigurator { * * @param url * 当前网页的URL,不包含#及其后面部分 - * @return + * @return jssdk配置JSON字符串 * @see 通过config接口注入权限验证配置 + * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN">公众号JSSDK + * @see 企业号JSSDK * @throws WeixinException */ public String toJSONConfig(String url) throws WeixinException { diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenCreator.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenCreator.java index c9c77771..9aa39bb2 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenCreator.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/AbstractTokenCreator.java @@ -19,7 +19,7 @@ public abstract class AbstractTokenCreator implements TokenCreator { } /** - * 缓存key:附加weixin4j前缀 + * 缓存key:附加weixin4j_前缀 * * @return */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java index 99c049e7..61de6eac 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/token/TokenStorager.java @@ -16,9 +16,9 @@ import com.foxinmy.weixin4j.model.Token; */ public interface TokenStorager extends CacheStorager { /** - * 考虑到程序的临界值,实际有效时间应该减去下面这个数 + * 考虑到临界情况,在实际有效时间上减去60秒 */ - final long CUTMS = 1 * 60 * 1000l; + final long CUTMS = 60 * 1000l; /** * 缓存key的前缀 */ diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil.java index f27390cf..e2471a75 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/util/WeixinErrorUtil.java @@ -74,11 +74,14 @@ public final class WeixinErrorUtil { } public String getText() { - return StringUtil.isBlank(text) ? "未知错误" : text; + return StringUtil.isBlank(text) ? "" : text; } } public static String getText(String code) throws RuntimeException { + if (StringUtil.isBlank(code)) { + return ""; + } String text = errorCacheMap.get(code); if (StringUtil.isBlank(text)) { ErrorTextHandler textHandler = new ErrorTextHandler(code); diff --git a/weixin4j-example/pom.xml b/weixin4j-example/pom.xml index 9024a17f..975f1e45 100644 --- a/weixin4j-example/pom.xml +++ b/weixin4j-example/pom.xml @@ -36,16 +36,19 @@ + com.foxinmy weixin4j-mp 1.6.8 + com.foxinmy weixin4j-qy 1.6.8 + com.foxinmy weixin4j-server @@ -63,5 +66,12 @@ spring-context 4.2.1.RELEASE + + + org.jsoup + jsoup + 1.9.1 + test + \ No newline at end of file diff --git a/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/ErrorBuilder.java b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/ErrorBuilder.java new file mode 100644 index 00000000..9b095225 --- /dev/null +++ b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/ErrorBuilder.java @@ -0,0 +1,36 @@ +package com.foxinmy.weixin4j.test; + +import java.util.Map; +import java.util.TreeMap; +import java.util.Map.Entry; + +public class ErrorBuilder { + + public static void main(String[] args) throws Exception { + Map error = new TreeMap(); + error.putAll(QyErrorBuilder.build()); + error.putAll(MpErrorBuilder.build()); + StringBuilder xml = new StringBuilder(); + xml.append(""); + xml.append(""); + xml.append(""); + xml.append(""); + for (Entry entry : error.entrySet()) { + xml.append(""); + xml.append("").append(entry.getKey()).append(""); + xml.append("").append(entry.getValue()).append(""); + xml.append(""); + } + xml.append(""); + error = PayErrorBuilder.builder(); + for (Entry entry : error.entrySet()) { + xml.append(""); + xml.append("").append(entry.getKey()).append(""); + xml.append("").append(entry.getValue()).append(""); + xml.append(""); + } + xml.append(""); + System.err.println("\n"); + System.err.println(xml.toString()); + } +} diff --git a/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/MpErrorBuilder.java b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/MpErrorBuilder.java new file mode 100644 index 00000000..a5b6eec6 --- /dev/null +++ b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/MpErrorBuilder.java @@ -0,0 +1,110 @@ +package com.foxinmy.weixin4j.test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import sun.org.mozilla.javascript.internal.NativeArray; +import sun.org.mozilla.javascript.internal.NativeObject; + +/** + * 收集微信公众平台错误码 + * + * @className MpErrorBuilder + * @author jy + * @date 2016年5月5日 + * @since JDK 1.7 + * @see + */ +public class MpErrorBuilder { + + private static final String HOME = "https://mp.weixin.qq.com/wiki"; + + private static final String RESOURCE = "https://mp.weixin.qq.com/wiki?action=doc&id=%s"; + + private static List collectUrl() throws Exception { + Document root = Jsoup.connect(HOME).get(); + List resources = null; + Elements eles = root.getElementById("resMenu").getElementsByTag("a"); + if (eles.isEmpty()) { + Element ele = root.getElementsByTag("script").last(); + StringBuilder script = new StringBuilder(); + script.append("window = {};"); + script.append("seajs = {};"); + script.append("seajs.use = function(arg1,arg2){return window.cgiData.list};"); + script.append("wx_main = {};"); + script.append(ele.html()); + ScriptEngine engine = new ScriptEngineManager() + .getEngineByName("javascript"); + NativeArray na = (NativeArray) ((NativeObject) engine.eval(script + .toString())).get("list"); + resources = new ArrayList(); + for (int i = 0; i < na.getLength(); i++) { + recurrenceMenu(resources, (NativeObject) na.get(i)); + } + } else { + resources = new ArrayList(eles.size()); + for (Element ele : eles) { + resources.add(String.format(RESOURCE, + ele.getElementsByAttribute("data-id"))); + } + } + return resources; + } + + private static void recurrenceMenu(List resources, + NativeObject rootObject) { + NativeArray children = (NativeArray) rootObject.get("children"); + if (children.getLength() == 0l) { + resources.add(String.format(RESOURCE, rootObject.get("id") + .toString())); + return; + } + for (int i = 0; i < children.getLength(); i++) { + recurrenceMenu(resources, (NativeObject) children.get(i)); + } + } + + private static Map analyCode(String resource) + throws Exception { + Document root = Jsoup.connect(resource).get(); + Elements tables = root.getElementsByTag("table"); + Map error = new HashMap(); + for (Element table : tables) { + Elements trs = table.getElementsByTag("tr"); + String text = trs.first().child(0).text().trim(); + if (text.equals("返回码") || text.equals("错误码")) { + for (int i = 1; i < trs.size(); i++) { + error.put(trs.get(i).child(0).text().trim(), trs.get(i) + .child(1).text().trim()); + } + } + } + return error; + } + + public static Map build() throws Exception { + System.err.println("0.开始收集URI资源..."); + List resources = collectUrl(); + System.err.println("共收集到URI资源:" + resources.size()); + System.err.println("1.开始解析URI资源..."); + Map error = new HashMap(); + for (int i = 0; i < resources.size(); i++) { + System.err + .println("开始解析第" + (i + 1) + "个URI资源:" + resources.get(i)); + Map result = analyCode(resources.get(i)); + System.err.println(resources.get(i) + ":" + result.size()); + error.putAll(result); + } + return error; + } +} diff --git a/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/PayErrorBuilder.java b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/PayErrorBuilder.java new file mode 100644 index 00000000..5739afe0 --- /dev/null +++ b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/PayErrorBuilder.java @@ -0,0 +1,129 @@ +package com.foxinmy.weixin4j.test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +/** + * 手机微信商户平台错误码 + * + * @className PayErrorBuilder + * @author jy + * @date 2016年5月5日 + * @since JDK 1.7 + * @see + */ +public class PayErrorBuilder { + + private static final String HOME = "https://pay.weixin.qq.com/wiki/doc/api/index.html"; + + private static final List EXTRA_RESOURCES; + static { + EXTRA_RESOURCES = new ArrayList(); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_3#"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_4"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_5"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_7&index=6"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=16_5"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=16_6"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/external/declarecustom.php?chapter=18_1"); + EXTRA_RESOURCES + .add("https://pay.weixin.qq.com/wiki/doc/api/external/declarecustom.php?chapter=18_2"); + } + + private static List collectUrl() throws Exception { + Document root = Jsoup.connect(HOME).get(); + List resources = new ArrayList(); + Elements eles = root.getElementsByClass("guide-main"); + for (Element ele : eles) { + for (Element li : ele.children()) { + System.err.println(li.child(0).child(1).text() + "资源列表:"); + root = Jsoup.connect(li.child(0).absUrl("href")).get(); + Elements dls = root.getElementsByClass("menu").first() + .getElementsByTag("dl"); + for (Element dl : dls) { + if (dl.child(0).text().equalsIgnoreCase("api列表")) { + for (int i = 1; i < dl.children().size(); i++) { + System.err.println(dl.children().get(i).child(0) + .text()); + resources.add(dl.children().get(i).child(0) + .absUrl("href")); + } + break; + } + } + } + } + resources.addAll(EXTRA_RESOURCES); + return resources; + } + + private static Map analyCode(String resource) + throws Exception { + Document root = Jsoup.connect(resource).get(); + Elements eles = root.getElementsByClass("data-box"); + Map error = new HashMap(); + String text = ""; + StringBuilder desc = new StringBuilder(); + for (Element box : eles) { + Elements trs = box.getElementsByTag("tr"); + if (trs.isEmpty()) { + continue; + } + text = box.child(0).text().trim(); + boolean b1 = text.equals("错误码") || text.equals("返回码"); + text = trs.first().text().trim(); + boolean b2 = text.equals("错误码") || text.equals("返回码"); + if (b1 || b2) { + for (int i = 1; i < trs.size(); i++) { + desc.append(trs.get(i).child(1).text().trim()); + for (int j = 2; j < trs.get(i).children().size(); j++) { + desc.append(",").append( + trs.get(i).child(j).text().trim()); + } + error.put(trs.get(i).child(0).text().trim(), + desc.toString()); + desc.delete(0, desc.length()); + } + } + } + return error; + } + + public static Map builder() throws Exception { + System.err.println("0.开始收集URI资源..."); + List resources = collectUrl(); + System.err.println("共收集到URI资源:" + resources.size()); + System.err.println("1.开始解析URI资源..."); + Map error = new TreeMap(); + for (int i = 0; i < resources.size(); i++) { + System.err + .println("开始解析第" + (i + 1) + "个URI资源:" + resources.get(i)); + Map result = analyCode(resources.get(i)); + System.err.println(resources.get(i) + ":" + result.size()); + error.putAll(result); + } + System.err.println("共收集到状态码:" + error.size()); + return error; + } +} diff --git a/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/QyErrorBuilder.java b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/QyErrorBuilder.java new file mode 100644 index 00000000..b1149d87 --- /dev/null +++ b/weixin4j-example/src/test/java/com/foxinmy/weixin4j/test/QyErrorBuilder.java @@ -0,0 +1,40 @@ +package com.foxinmy.weixin4j.test; + +import java.util.Map; +import java.util.TreeMap; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.select.Elements; + +/** + * 收集微信企业号错误码 + * + * @className QyErrorBuilder + * @author jy + * @date 2016年5月5日 + * @since JDK 1.7 + * @see + */ +public class QyErrorBuilder { + + private static final String HOME = "http://qydev.weixin.qq.com/wiki/index.php?title=%E5%85%A8%E5%B1%80%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E"; + + private static Map analyCode() throws Exception { + Document root = Jsoup.connect(HOME).get(); + Elements trs = root.getElementsByTag("tr"); + Map error = new TreeMap(); + for (int i = 1; i < trs.size(); i++) { + error.put(trs.get(i).child(0).text().trim(), trs.get(i).child(1) + .text().trim()); + } + return error; + } + + public static Map build() throws Exception { + System.err.println("开始解析URI资源:" + HOME); + Map error = analyCode(); + System.err.println("共收集到状态码:" + error.size()); + return error; + } +} diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java index c501870f..b8cca58c 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MediaApi.java @@ -44,7 +44,6 @@ import com.foxinmy.weixin4j.util.IOUtil; import com.foxinmy.weixin4j.util.ObjectId; import com.foxinmy.weixin4j.util.RegexUtil; import com.foxinmy.weixin4j.util.StringUtil; -import com.foxinmy.weixin4j.util.WeixinErrorUtil; /** * 素材相关API @@ -265,8 +264,8 @@ public class MediaApi extends MpApi { String disposition = headers .getFirst(HttpHeaders.CONTENT_DISPOSITION); logger.info("weixin response << " + response.getProtocol() - + response.getStatus().toString() + "[" + contentType + "]->" - + disposition); + + response.getStatus().toString() + "[" + contentType + + "]->" + disposition); if (contentType.contains(ContentType.TEXT_PLAIN.getMimeType()) || contentType.contains(ContentType.APPLICATION_JSON .getMimeType()) @@ -275,10 +274,6 @@ public class MediaApi extends MpApi { content.length, Consts.UTF_8.newDecoder(), JsonResult.class); if (jsonResult.getCode() != 0) { - if (StringUtil.isBlank(jsonResult.getDesc())) { - jsonResult.setDesc(WeixinErrorUtil.getText(Integer - .toString(jsonResult.getCode()))); - } throw new WeixinException(Integer.toString(jsonResult .getCode()), jsonResult.getDesc()); } diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java index 97a177f5..c6b0a390 100644 --- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java +++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/MediaApi.java @@ -47,7 +47,6 @@ import com.foxinmy.weixin4j.util.IOUtil; import com.foxinmy.weixin4j.util.ObjectId; import com.foxinmy.weixin4j.util.RegexUtil; import com.foxinmy.weixin4j.util.StringUtil; -import com.foxinmy.weixin4j.util.WeixinErrorUtil; /** * 媒体相关API @@ -236,10 +235,6 @@ public class MediaApi extends QyApi { content.length, Consts.UTF_8.newDecoder(), JsonResult.class); if (jsonResult.getCode() != 0) { - if (StringUtil.isBlank(jsonResult.getDesc())) { - jsonResult.setDesc(WeixinErrorUtil.getText(Integer - .toString(jsonResult.getCode()))); - } throw new WeixinException(Integer.toString(jsonResult .getCode()), jsonResult.getDesc()); }