* 通过错误代码查找其中文含义.
*/
public static String findMsgByCode(int code) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
index 7e478606..c75f7596 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
@@ -14,621 +14,635 @@ import lombok.Getter;
@Getter
public enum WxMpErrorMsgEnum {
/**
- * 系统繁忙,此时请开发者稍候再试
+ * 系统繁忙,此时请开发者稍候再试.
*/
CODE_1(-1, "系统繁忙,此时请开发者稍候再试"),
/**
- * 请求成功
+ * 请求成功.
*/
CODE_0(0, "请求成功"),
/**
- * 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口
+ * 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口.
*/
CODE_40001(40001, "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"),
/**
- * 不合法的凭证类型
+ * 不合法的凭证类型.
*/
CODE_40002(40002, "不合法的凭证类型"),
/**
- * 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID
+ * 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID.
*/
CODE_40003(40003, "不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID"),
/**
- * 不合法的媒体文件类型
+ * 不合法的媒体文件类型.
*/
CODE_40004(40004, "不合法的媒体文件类型"),
/**
- * 不合法的文件类型
+ * 不合法的文件类型.
*/
CODE_40005(40005, "不合法的文件类型"),
/**
- * 不合法的文件大小
+ * 不合法的文件大小.
*/
CODE_40006(40006, "不合法的文件大小"),
/**
- * 不合法的媒体文件 id
+ * 不合法的媒体文件 id.
*/
CODE_40007(40007, "不合法的媒体文件 id"),
/**
- * 不合法的消息类型
+ * 不合法的消息类型.
*/
CODE_40008(40008, "不合法的消息类型"),
/**
- * 不合法的图片文件大小
+ * 不合法的图片文件大小.
*/
CODE_40009(40009, "不合法的图片文件大小"),
/**
- * 不合法的语音文件大小
+ * 不合法的语音文件大小.
*/
CODE_40010(40010, "不合法的语音文件大小"),
/**
- * 不合法的视频文件大小
+ * 不合法的视频文件大小.
*/
CODE_40011(40011, "不合法的视频文件大小"),
/**
- * 不合法的缩略图文件大小
+ * 不合法的缩略图文件大小.
*/
CODE_40012(40012, "不合法的缩略图文件大小"),
/**
- * 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写
+ * 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写.
*/
CODE_40013(40013, "不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写"),
/**
- * 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口
+ * 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口.
*/
CODE_40014(40014, "不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口"),
/**
- * 不合法的菜单类型
+ * 不合法的菜单类型.
*/
CODE_40015(40015, "不合法的菜单类型"),
/**
- * 不合法的按钮个数
+ * 不合法的按钮个数.
*/
CODE_40016(40016, "不合法的按钮个数"),
/**
- * 不合法的按钮个数
+ * 不合法的按钮个数.
*/
CODE_40017(40017, "不合法的按钮个数"),
/**
- * 不合法的按钮名字长度
+ * 不合法的按钮名字长度.
*/
CODE_40018(40018, "不合法的按钮名字长度"),
/**
- * 不合法的按钮 KEY 长度
+ * 不合法的按钮 KEY 长度.
*/
CODE_40019(40019, "不合法的按钮 KEY 长度"),
/**
- * 不合法的按钮 URL 长度
+ * 不合法的按钮 URL 长度.
*/
CODE_40020(40020, "不合法的按钮 URL 长度"),
/**
- * 不合法的菜单版本号
+ * 不合法的菜单版本号.
*/
CODE_40021(40021, "不合法的菜单版本号"),
/**
- * 不合法的子菜单级数
+ * 不合法的子菜单级数.
*/
CODE_40022(40022, "不合法的子菜单级数"),
/**
- * 不合法的子菜单按钮个数
+ * 不合法的子菜单按钮个数.
*/
CODE_40023(40023, "不合法的子菜单按钮个数"),
/**
- * 不合法的子菜单按钮类型
+ * 不合法的子菜单按钮类型.
*/
CODE_40024(40024, "不合法的子菜单按钮类型"),
/**
- * 不合法的子菜单按钮名字长度
+ * 不合法的子菜单按钮名字长度.
*/
CODE_40025(40025, "不合法的子菜单按钮名字长度"),
/**
- * 不合法的子菜单按钮 KEY 长度
+ * 不合法的子菜单按钮 KEY 长度.
*/
CODE_40026(40026, "不合法的子菜单按钮 KEY 长度"),
/**
- * 不合法的子菜单按钮 URL 长度
+ * 不合法的子菜单按钮 URL 长度.
*/
CODE_40027(40027, "不合法的子菜单按钮 URL 长度"),
/**
- * 不合法的自定义菜单使用用户
+ * 不合法的自定义菜单使用用户.
*/
CODE_40028(40028, "不合法的自定义菜单使用用户"),
/**
- * 不合法的 oauth_code
+ * 不合法的 oauth_code.
*/
CODE_40029(40029, "不合法的 oauth_code"),
/**
- * 不合法的 refresh_token
+ * 不合法的 refresh_token.
*/
CODE_40030(40030, "不合法的 refresh_token"),
/**
- * 不合法的 openid 列表
+ * 不合法的 openid 列表.
*/
CODE_40031(40031, "不合法的 openid 列表"),
/**
- * 不合法的 openid 列表长度
+ * 不合法的 openid 列表长度.
*/
CODE_40032(40032, "不合法的 openid 列表长度"),
/**
- * 不合法的请求字符,不能包含\\uxxxx 格式的字符
+ * 不合法的请求字符,不能包含\\uxxxx 格式的字符.
*/
CODE_40033(40033, "不合法的请求字符,不能包含\\uxxxx 格式的字符"),
/**
- * 不合法的参数
+ * 不合法的参数.
*/
CODE_40035(40035, "不合法的参数"),
/**
- * 不合法的请求格式
+ * 不合法的请求格式.
*/
CODE_40038(40038, "不合法的请求格式"),
/**
- * 不合法的 URL 长度
+ * 不合法的 URL 长度.
*/
CODE_40039(40039, "不合法的 URL 长度"),
/**
- * 不合法的分组 id
+ * 不合法的分组 id.
*/
CODE_40050(40050, "不合法的分组 id"),
/**
- * 分组名字不合法
+ * 分组名字不合法.
*/
CODE_40051(40051, "分组名字不合法"),
/**
- * 删除单篇图文时,指定的 article_idx 不合法
+ * 删除单篇图文时,指定的 article_idx 不合法.
*/
CODE_40060(40060, "删除单篇图文时,指定的 article_idx 不合法"),
/**
- * 分组名字不合法
+ * 分组名字不合法.
*/
CODE_40117(40117, "分组名字不合法"),
/**
- * media_id 大小不合法
+ * media_id 大小不合法.
*/
CODE_40118(40118, "media_id 大小不合法"),
/**
- * button 类型错误
+ * button 类型错误.
*/
CODE_40119(40119, "button 类型错误"),
/**
- * button 类型错误
+ * button 类型错误.
*/
CODE_40120(40120, "button 类型错误"),
/**
- * 不合法的 media_id 类型
+ * 不合法的 media_id 类型.
*/
CODE_40121(40121, "不合法的 media_id 类型"),
/**
- * 微信号不合法
+ * 微信号不合法.
*/
CODE_40132(40132, "微信号不合法"),
/**
- * 不支持的图片格式
+ * 不支持的图片格式.
*/
CODE_40137(40137, "不支持的图片格式"),
/**
- * 请勿添加其他公众号的主页链接
+ * 请勿添加其他公众号的主页链接.
*/
CODE_40155(40155, "请勿添加其他公众号的主页链接"),
/**
- * 缺少 access_token 参数
+ * 缺少 access_token 参数.
*/
CODE_41001(41001, "缺少 access_token 参数"),
/**
- * 缺少 appid 参数
+ * 缺少 appid 参数.
*/
CODE_41002(41002, "缺少 appid 参数"),
/**
- * 缺少 refresh_token 参数
+ * 缺少 refresh_token 参数.
*/
CODE_41003(41003, "缺少 refresh_token 参数"),
/**
- * 缺少 secret 参数
+ * 缺少 secret 参数.
*/
CODE_41004(41004, "缺少 secret 参数"),
/**
- * 缺少多媒体文件数据
+ * 缺少多媒体文件数据.
*/
CODE_41005(41005, "缺少多媒体文件数据"),
/**
- * 缺少 media_id 参数
+ * 缺少 media_id 参数.
*/
CODE_41006(41006, "缺少 media_id 参数"),
/**
- * 缺少子菜单数据
+ * 缺少子菜单数据.
*/
CODE_41007(41007, "缺少子菜单数据"),
/**
- * 缺少 oauth code
+ * 缺少 oauth code.
*/
CODE_41008(41008, "缺少 oauth code"),
/**
- * 缺少 openid
+ * 缺少 openid.
*/
CODE_41009(41009, "缺少 openid"),
/**
- * access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明
+ * access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明.
*/
CODE_42001(42001, "access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明"),
/**
- * refresh_token 超时
+ * refresh_token 超时.
*/
CODE_42002(42002, "refresh_token 超时"),
/**
- * oauth_code 超时
+ * oauth_code 超时.
*/
CODE_42003(42003, "oauth_code 超时"),
/**
- * 用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权
+ * 用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权.
*/
CODE_42007(42007, "用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权"),
/**
- * 需要 GET 请求
+ * 需要 GET 请求.
*/
CODE_43001(43001, "需要 GET 请求"),
/**
- * 需要 POST 请求
+ * 需要 POST 请求.
*/
CODE_43002(43002, "需要 POST 请求"),
/**
- * 需要 HTTPS 请求
+ * 需要 HTTPS 请求.
*/
CODE_43003(43003, "需要 HTTPS 请求"),
/**
- * 需要接收者关注
+ * 需要接收者关注.
*/
CODE_43004(43004, "需要接收者关注"),
/**
- * 需要好友关系
+ * 需要好友关系.
*/
CODE_43005(43005, "需要好友关系"),
/**
- * 需要将接收者从黑名单中移除
+ * 需要将接收者从黑名单中移除.
*/
CODE_43019(43019, "需要将接收者从黑名单中移除"),
/**
- * 多媒体文件为空
+ * 多媒体文件为空.
*/
CODE_44001(44001, "多媒体文件为空"),
/**
- * POST 的数据包为空
+ * POST 的数据包为空.
*/
CODE_44002(44002, "POST 的数据包为空"),
/**
- * 图文消息内容为空
+ * 图文消息内容为空.
*/
CODE_44003(44003, "图文消息内容为空"),
/**
- * 文本消息内容为空
+ * 文本消息内容为空.
*/
CODE_44004(44004, "文本消息内容为空"),
/**
- * 多媒体文件大小超过限制
+ * 多媒体文件大小超过限制.
*/
CODE_45001(45001, "多媒体文件大小超过限制"),
/**
- * 消息内容超过限制
+ * 消息内容超过限制.
*/
CODE_45002(45002, "消息内容超过限制"),
/**
- * 标题字段超过限制
+ * 标题字段超过限制.
*/
CODE_45003(45003, "标题字段超过限制"),
/**
- * 描述字段超过限制
+ * 描述字段超过限制.
*/
CODE_45004(45004, "描述字段超过限制"),
/**
- * 链接字段超过限制
+ * 链接字段超过限制.
*/
CODE_45005(45005, "链接字段超过限制"),
/**
- * 图片链接字段超过限制
+ * 图片链接字段超过限制.
*/
CODE_45006(45006, "图片链接字段超过限制"),
/**
- * 语音播放时间超过限制
+ * 语音播放时间超过限制.
*/
CODE_45007(45007, "语音播放时间超过限制"),
/**
- * 图文消息超过限制
+ * 图文消息超过限制.
*/
CODE_45008(45008, "图文消息超过限制"),
/**
- * 接口调用超过限制
+ * 接口调用超过限制.
*/
CODE_45009(45009, "接口调用超过限制"),
/**
- * 创建菜单个数超过限制
+ * 创建菜单个数超过限制.
*/
CODE_45010(45010, "创建菜单个数超过限制"),
/**
- * API 调用太频繁,请稍候再试
+ * API 调用太频繁,请稍候再试.
*/
CODE_45011(45011, "API 调用太频繁,请稍候再试"),
/**
- * 回复时间超过限制
+ * 回复时间超过限制.
*/
CODE_45015(45015, "回复时间超过限制"),
/**
- * 系统分组,不允许修改
+ * 系统分组,不允许修改.
*/
CODE_45016(45016, "系统分组,不允许修改"),
/**
- * 分组名字过长
+ * 分组名字过长.
*/
CODE_45017(45017, "分组名字过长"),
/**
- * 分组数量超过上限
+ * 分组数量超过上限.
*/
CODE_45018(45018, "分组数量超过上限"),
/**
- * 客服接口下行条数超过上限
+ * 客服接口下行条数超过上限.
*/
CODE_45047(45047, "客服接口下行条数超过上限"),
/**
- * 不存在媒体数据
+ * 非法的tag_id.
+ */
+ CODE_45159(45159, "非法的tag_id"),
+ /**
+ * 不存在媒体数据.
*/
CODE_46001(46001, "不存在媒体数据"),
/**
- * 不存在的菜单版本
+ * 不存在的菜单版本.
*/
CODE_46002(46002, "不存在的菜单版本"),
/**
- * 不存在的菜单数据
+ * 不存在的菜单数据.
*/
CODE_46003(46003, "不存在的菜单数据"),
/**
- * 不存在的用户
+ * 不存在的用户.
*/
CODE_46004(46004, "不存在的用户"),
/**
- * 解析 JSON/XML 内容错误
+ * 解析 JSON/XML 内容错误.
*/
CODE_47001(47001, "解析 JSON/XML 内容错误"),
/**
- * api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限
+ * api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限.
*/
CODE_48001(48001, "api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限"),
/**
- * 粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )
+ * 粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” ).
*/
CODE_48002(48002, "粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )"),
/**
- * api 接口被封禁,请登录 mp.weixin.qq.com 查看详情
+ * api 接口被封禁,请登录 mp.weixin.qq.com 查看详情.
*/
CODE_48004(48004, "api 接口被封禁,请登录 mp.weixin.qq.com 查看详情"),
/**
- * api 禁止删除被自动回复和自定义菜单引用的素材
+ * api 禁止删除被自动回复和自定义菜单引用的素材.
*/
CODE_48005(48005, "api 禁止删除被自动回复和自定义菜单引用的素材"),
/**
- * api 禁止清零调用次数,因为清零次数达到上限
+ * api 禁止清零调用次数,因为清零次数达到上限.
*/
CODE_48006(48006, "api 禁止清零调用次数,因为清零次数达到上限"),
/**
- * 没有该类型消息的发送权限
+ * 没有该类型消息的发送权限.
*/
CODE_48008(48008, "没有该类型消息的发送权限"),
/**
- * 用户未授权该 api
+ * 用户未授权该 api.
*/
CODE_50001(50001, "用户未授权该 api"),
/**
- * 用户受限,可能是违规后接口被封禁
+ * 用户受限,可能是违规后接口被封禁.
*/
CODE_50002(50002, "用户受限,可能是违规后接口被封禁"),
/**
- * 用户未关注公众号
+ * 用户未关注公众号.
*/
CODE_50005(50005, "用户未关注公众号"),
/**
- * 参数错误 (invalid parameter)
+ * 参数错误 (invalid parameter).
*/
CODE_61451(61451, "参数错误 (invalid parameter)"),
/**
- * 无效客服账号 (invalid kf_account)
+ * 无效客服账号 (invalid kf_account).
*/
CODE_61452(61452, "无效客服账号 (invalid kf_account)"),
/**
- * 客服帐号已存在 (kf_account exsited)
+ * 客服帐号已存在 (kf_account exsited).
*/
CODE_61453(61453, "客服帐号已存在 (kf_account exsited)"),
/**
- * 客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)
+ * 客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length).
*/
CODE_61454(61454, "客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)"),
/**
- * 客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)
+ * 客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account).
*/
CODE_61455(61455, "客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)"),
/**
- * 客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)
+ * 客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded).
*/
CODE_61456(61456, "客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)"),
/**
- * 无效头像文件类型 (invalid file type)
+ * 无效头像文件类型 (invalid file type).
*/
CODE_61457(61457, "无效头像文件类型 (invalid file type)"),
/**
- * 系统错误 (system error)
+ * 系统错误 (system error).
*/
CODE_61450(61450, "系统错误 (system error)"),
/**
- * 日期格式错误
+ * 日期格式错误.
*/
CODE_61500(61500, "日期格式错误"),
/**
- * 不存在此 menuid 对应的个性化菜单
+ * 不存在此 menuid 对应的个性化菜单.
*/
CODE_65301(65301, "不存在此 menuid 对应的个性化菜单"),
/**
- * 没有相应的用户
+ * 没有相应的用户.
*/
CODE_65302(65302, "没有相应的用户"),
/**
- * 没有默认菜单,不能创建个性化菜单
+ * 没有默认菜单,不能创建个性化菜单.
*/
CODE_65303(65303, "没有默认菜单,不能创建个性化菜单"),
/**
- * MatchRule 信息为空
+ * MatchRule 信息为空.
*/
CODE_65304(65304, "MatchRule 信息为空"),
/**
- * 个性化菜单数量受限
+ * 个性化菜单数量受限.
*/
CODE_65305(65305, "个性化菜单数量受限"),
/**
- * 不支持个性化菜单的帐号
+ * 不支持个性化菜单的帐号.
*/
CODE_65306(65306, "不支持个性化菜单的帐号"),
/**
- * 个性化菜单信息为空
+ * 个性化菜单信息为空.
*/
CODE_65307(65307, "个性化菜单信息为空"),
/**
- * 包含没有响应类型的 button
+ * 包含没有响应类型的 button.
*/
CODE_65308(65308, "包含没有响应类型的 button"),
/**
- * 个性化菜单开关处于关闭状态
+ * 个性化菜单开关处于关闭状态.
*/
CODE_65309(65309, "个性化菜单开关处于关闭状态"),
/**
- * 填写了省份或城市信息,国家信息不能为空
+ * 填写了省份或城市信息,国家信息不能为空.
*/
CODE_65310(65310, "填写了省份或城市信息,国家信息不能为空"),
/**
- * 填写了城市信息,省份信息不能为空
+ * 填写了城市信息,省份信息不能为空.
*/
CODE_65311(65311, "填写了城市信息,省份信息不能为空"),
/**
- * 不合法的国家信息
+ * 不合法的国家信息.
*/
CODE_65312(65312, "不合法的国家信息"),
/**
- * 不合法的省份信息
+ * 不合法的省份信息.
*/
CODE_65313(65313, "不合法的省份信息"),
/**
- * 不合法的城市信息
+ * 不合法的城市信息.
*/
CODE_65314(65314, "不合法的城市信息"),
/**
- * 该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接)
+ * 该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接).
*/
CODE_65316(65316, "该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接)"),
/**
- * 不合法的 URL
+ * 不合法的 URL.
*/
CODE_65317(65317, "不合法的 URL"),
/**
- * POST 数据参数不合法
+ * POST 数据参数不合法.
*/
CODE_9001001(9001001, "POST 数据参数不合法"),
/**
- * 远端服务不可用
+ * 远端服务不可用.
*/
CODE_9001002(9001002, "远端服务不可用"),
/**
- * Ticket 不合法
+ * Ticket 不合法.
*/
CODE_9001003(9001003, "Ticket 不合法"),
/**
- * 获取摇周边用户信息失败
+ * 获取摇周边用户信息失败.
*/
CODE_9001004(9001004, "获取摇周边用户信息失败"),
/**
- * 获取商户信息失败
+ * 获取商户信息失败.
*/
CODE_9001005(9001005, "获取商户信息失败"),
/**
- * 获取 OpenID 失败
+ * 获取 OpenID 失败.
*/
CODE_9001006(9001006, "获取 OpenID 失败"),
/**
- * 上传文件缺失
+ * 上传文件缺失.
*/
CODE_9001007(9001007, "上传文件缺失"),
/**
- * 上传素材的文件类型不合法
+ * 上传素材的文件类型不合法.
*/
CODE_9001008(9001008, "上传素材的文件类型不合法"),
/**
- * 上传素材的文件尺寸不合法
+ * 上传素材的文件尺寸不合法.
*/
CODE_9001009(9001009, "上传素材的文件尺寸不合法"),
/**
- * 上传失败
+ * 上传失败.
*/
CODE_9001010(9001010, "上传失败"),
/**
- * 帐号不合法
+ * 帐号不合法.
*/
CODE_9001020(9001020, "帐号不合法"),
/**
- * 已有设备激活率低于 50% ,不能新增设备
+ * 已有设备激活率低于 50% ,不能新增设备.
*/
CODE_9001021(9001021, "已有设备激活率低于 50% ,不能新增设备"),
/**
- * 设备申请数不合法,必须为大于 0 的数字
+ * 设备申请数不合法,必须为大于 0 的数字.
*/
CODE_9001022(9001022, "设备申请数不合法,必须为大于 0 的数字"),
/**
- * 已存在审核中的设备 ID 申请
+ * 已存在审核中的设备 ID 申请.
*/
CODE_9001023(9001023, "已存在审核中的设备 ID 申请"),
/**
- * 一次查询设备 ID 数量不能超过 50
+ * 一次查询设备 ID 数量不能超过 50.
*/
CODE_9001024(9001024, "一次查询设备 ID 数量不能超过 50"),
/**
- * 设备 ID 不合法
+ * 设备 ID 不合法.
*/
CODE_9001025(9001025, "设备 ID 不合法"),
/**
- * 页面 ID 不合法
+ * 页面 ID 不合法.
*/
CODE_9001026(9001026, "页面 ID 不合法"),
/**
- * 页面参数不合法
+ * 页面参数不合法.
*/
CODE_9001027(9001027, "页面参数不合法"),
/**
- * 一次删除页面 ID 数量不能超过 10
+ * 一次删除页面 ID 数量不能超过 10.
*/
CODE_9001028(9001028, "一次删除页面 ID 数量不能超过 10"),
/**
- * 页面已应用在设备中,请先解除应用关系再删除
+ * 页面已应用在设备中,请先解除应用关系再删除.
*/
CODE_9001029(9001029, "页面已应用在设备中,请先解除应用关系再删除"),
/**
- * 一次查询页面 ID 数量不能超过 50
+ * 一次查询页面 ID 数量不能超过 50.
*/
CODE_9001030(9001030, "一次查询页面 ID 数量不能超过 50"),
/**
- * 时间区间不合法
+ * 时间区间不合法.
*/
CODE_9001031(9001031, "时间区间不合法"),
/**
- * 保存设备与页面的绑定关系参数错误
+ * 保存设备与页面的绑定关系参数错误.
*/
CODE_9001032(9001032, "保存设备与页面的绑定关系参数错误"),
/**
- * 门店 ID 不合法
+ * 门店 ID 不合法.
*/
CODE_9001033(9001033, "门店 ID 不合法"),
/**
- * 设备备注信息过长
+ * 设备备注信息过长.
*/
CODE_9001034(9001034, "设备备注信息过长"),
/**
- * 设备申请参数不合法
+ * 设备申请参数不合法.
*/
CODE_9001035(9001035, "设备申请参数不合法"),
/**
- * 查询起始值 begin 不合法
+ * 查询起始值 begin 不合法.
+ */
+ CODE_9001036(9001036, "查询起始值 begin 不合法"),
+
+ /**
+ * 设置的 speed 参数不在0到4的范围内
+ */
+ CODE_45083(45083, "设置的 speed 参数不在0到4的范围内"),
+
+ /**
+ * 没有设置 speed 参数
*/
- CODE_9001036(9001036, "查询起始值 begin 不合法");
+ CODE_45084(45084, "没有设置 speed 参数");
private int code;
private String msg;
@@ -639,7 +653,7 @@ public enum WxMpErrorMsgEnum {
}
/**
- * 通过错误代码查找其中文含义.
+ * 通过错误代码查找其中文含义..
*/
public static String findMsgByCode(int code) {
for (WxMpErrorMsgEnum value : WxMpErrorMsgEnum.values()) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
index 3c5750e6..5c16e71c 100755
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/crypto/WxCryptUtil.java
@@ -270,10 +270,10 @@ public class WxCryptUtil {
throw new RuntimeException(e);
}
- // appid不相同的情况
- if (!fromAppid.equals(this.appidOrCorpid)) {
- throw new RuntimeException("AppID不正确,请核实!");
- }
+ // appid不相同的情况 暂时忽略这段判断
+// if (!fromAppid.equals(this.appidOrCorpid)) {
+// throw new RuntimeException("AppID不正确,请核实!");
+// }
return xmlContent;
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
index 5e344acf..5c49c0f7 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/BaseMediaDownloadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.http;
import java.io.File;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.apache.ApacheMediaDownloadRequestExecutor;
import me.chanjar.weixin.common.util.http.jodd.JoddHttpMediaDownloadRequestExecutor;
@@ -25,8 +26,8 @@ public abstract class BaseMediaDownloadRequestExecutor implements RequestE
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp, File tmpDirFile) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
index 10ef3602..df1444cc 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MediaUploadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.http;
import java.io.File;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.apache.ApacheMediaUploadRequestExecutor;
@@ -23,8 +24,8 @@ public abstract class MediaUploadRequestExecutor implements RequestExecuto
}
@Override
- public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
index feef02de..3d0b772f 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/RequestExecutor.java
@@ -1,9 +1,10 @@
package me.chanjar.weixin.common.util.http;
-import java.io.IOException;
-
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
+import java.io.IOException;
+
/**
* http请求执行器.
*
@@ -16,23 +17,24 @@ public interface RequestExecutor {
/**
* 执行http请求.
*
- * @param uri uri
- * @param data 数据
+ * @param uri uri
+ * @param data 数据
+ * @param wxType 微信模块类型
* @return 响应结果
* @throws WxErrorException 自定义异常
* @throws IOException io异常
*/
- T execute(String uri, E data) throws WxErrorException, IOException;
-
+ T execute(String uri, E data, WxType wxType) throws WxErrorException, IOException;
/**
* 执行http请求.
*
- * @param uri uri
- * @param data 数据
+ * @param uri uri
+ * @param data 数据
* @param handler http响应处理器
+ * @param wxType 微信模块类型
* @throws WxErrorException 自定义异常
* @throws IOException io异常
*/
- void execute(String uri, E data, ResponseHandler handler) throws WxErrorException, IOException;
+ void execute(String uri, E data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
index 6d8b52a8..05c396e0 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimpleGetRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientSimpleGetRequestExecutor;
import me.chanjar.weixin.common.util.http.jodd.JoddHttpSimpleGetRequestExecutor;
@@ -21,8 +22,8 @@ public abstract class SimpleGetRequestExecutor implements RequestExecutor<
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
index 97a368ea..692387f9 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/SimplePostRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.common.util.http;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.apache.ApacheSimplePostRequestExecutor;
import me.chanjar.weixin.common.util.http.jodd.JoddHttpSimplePostRequestExecutor;
@@ -21,8 +22,9 @@ public abstract class SimplePostRequestExecutor implements RequestExecutor
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType)
+ throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
@@ -34,7 +36,7 @@ public abstract class SimplePostRequestExecutor implements RequestExecutor
case OK_HTTP:
return new OkHttpSimplePostRequestExecutor(requestHttp);
default:
- return null;
+ throw new IllegalArgumentException("非法请求参数");
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java
index 3951758d..cc830013 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpClientSimpleGetRequestExecutor.java
@@ -1,29 +1,31 @@
package me.chanjar.weixin.common.util.http.apache;
-import java.io.IOException;
-
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
-import me.chanjar.weixin.common.error.WxError;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/4.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/4
*/
public class ApacheHttpClientSimpleGetRequestExecutor extends SimpleGetRequestExecutor {
-
public ApacheHttpClientSimpleGetRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String queryParam) throws WxErrorException, IOException {
+ public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -38,7 +40,7 @@ public class ApacheHttpClientSimpleGetRequestExecutor extends SimpleGetRequestEx
try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpGet)) {
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
index da8f435c..51c37f59 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaDownloadRequestExecutor.java
@@ -1,9 +1,12 @@
package me.chanjar.weixin.common.util.http.apache;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
+import me.chanjar.weixin.common.util.http.HttpResponseProxy;
+import me.chanjar.weixin.common.util.http.RequestHttp;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
@@ -14,15 +17,15 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.CloseableHttpClient;
-import me.chanjar.weixin.common.error.WxError;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.fs.FileUtils;
-import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
-import me.chanjar.weixin.common.util.http.HttpResponseProxy;
-import me.chanjar.weixin.common.util.http.RequestHttp;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
/**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
*/
public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequestExecutor {
public ApacheMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
@@ -30,7 +33,7 @@ public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequest
}
@Override
- public File execute(String uri, String queryParam) throws WxErrorException, IOException {
+ public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -51,7 +54,7 @@ public class ApacheMediaDownloadRequestExecutor extends BaseMediaDownloadRequest
if (contentTypeHeader[0].getValue().startsWith(ContentType.APPLICATION_JSON.getMimeType())) {
// application/json; encoding=utf-8 下载媒体文件出错
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
- throw new WxErrorException(WxError.fromJson(responseContent));
+ throw new WxErrorException(WxError.fromJson(responseContent, wxType));
}
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
index 6684bb93..3c1b15dc 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMediaUploadRequestExecutor.java
@@ -1,7 +1,8 @@
package me.chanjar.weixin.common.util.http.apache;
-import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -26,7 +27,7 @@ public class ApacheMediaUploadRequestExecutor extends MediaUploadRequestExecutor
}
@Override
- public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException {
+ public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
@@ -42,7 +43,7 @@ public class ApacheMediaUploadRequestExecutor extends MediaUploadRequestExecutor
}
try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
index 2517dbcd..3405aaab 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheSimplePostRequestExecutor.java
@@ -1,5 +1,6 @@
package me.chanjar.weixin.common.util.http.apache;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -15,16 +16,18 @@ import org.apache.http.impl.client.CloseableHttpClient;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/4.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/4
*/
public class ApacheSimplePostRequestExecutor extends SimplePostRequestExecutor {
-
public ApacheSimplePostRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String postEntity) throws WxErrorException, IOException {
+ public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
@@ -47,7 +50,7 @@ public class ApacheSimplePostRequestExecutor extends SimplePostRequestExecutor {
-
public JoddHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
super(requestHttp, tmpDirFile);
}
@Override
- public File execute(String uri, String queryParam) throws WxErrorException, IOException {
+ public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -50,7 +52,7 @@ public class JoddHttpMediaDownloadRequestExecutor extends BaseMediaDownloadReque
String contentType = response.header("Content-Type");
if (contentType != null && contentType.startsWith("application/json")) {
// application/json; encoding=utf-8 下载媒体文件出错
- throw new WxErrorException(WxError.fromJson(response.bodyText()));
+ throw new WxErrorException(WxError.fromJson(response.bodyText(), wxType));
}
String fileName = new HttpResponseProxy(response).getFileName();
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
index 8ef4ddec..3c7122a1 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMediaUploadRequestExecutor.java
@@ -5,9 +5,9 @@ import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
import jodd.http.ProxyInfo;
import jodd.util.StringPool;
-
-import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -16,7 +16,10 @@ import java.io.File;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
*/
public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor {
public JoddHttpMediaUploadRequestExecutor(RequestHttp requestHttp) {
@@ -24,7 +27,7 @@ public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecut
}
@Override
- public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException {
+ public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
@@ -35,7 +38,7 @@ public class JoddHttpMediaUploadRequestExecutor extends MediaUploadRequestExecut
response.charset(StringPool.UTF_8);
String responseContent = response.bodyText();
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
index bee1d174..c93bd4b1 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpSimpleGetRequestExecutor.java
@@ -1,8 +1,11 @@
package me.chanjar.weixin.common.util.http.jodd;
-import jodd.http.*;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
import jodd.util.StringPool;
-
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -11,16 +14,18 @@ import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/4.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/4
*/
public class JoddHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor {
-
public JoddHttpSimpleGetRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String queryParam) throws WxErrorException, IOException {
+ public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -38,7 +43,7 @@ public class JoddHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor {
-
public JoddHttpSimplePostRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String postEntity) throws WxErrorException, IOException {
+ public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException {
HttpConnectionProvider provider = requestHttp.getRequestHttpClient();
ProxyInfo proxyInfo = requestHttp.getRequestHttpProxy();
@@ -39,8 +42,7 @@ public class JoddHttpSimplePostRequestExecutor extends SimplePostRequestExecutor
String responseContent = response.bodyText();
if (responseContent.isEmpty()) {
- throw new WxErrorException(WxError.builder().errorCode(9999).errorMsg("无响应内容")
- .build());
+ throw new WxErrorException(WxError.builder().errorCode(9999).errorMsg("无响应内容").build());
}
if (responseContent.startsWith("")) {
@@ -48,7 +50,7 @@ public class JoddHttpSimplePostRequestExecutor extends SimplePostRequestExecutor
return responseContent;
}
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
index 6f0a535f..729f1e18 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaDownloadRequestExecutor.java
@@ -1,5 +1,7 @@
package me.chanjar.weixin.common.util.http.okhttp;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
@@ -19,18 +21,18 @@ import java.io.File;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/5.
+ *.
+ * @author ecoolper
+ * @date 2017/5/5
*/
+@Slf4j
public class OkHttpMediaDownloadRequestExecutor extends BaseMediaDownloadRequestExecutor {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
public OkHttpMediaDownloadRequestExecutor(RequestHttp requestHttp, File tmpDirFile) {
super(requestHttp, tmpDirFile);
}
@Override
- public File execute(String uri, String queryParam) throws WxErrorException, IOException {
- logger.debug("OkHttpMediaDownloadRequestExecutor is running");
+ public File execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -48,7 +50,7 @@ public class OkHttpMediaDownloadRequestExecutor extends BaseMediaDownloadRequest
String contentType = response.header("Content-Type");
if (contentType != null && contentType.startsWith("application/json")) {
// application/json; encoding=utf-8 下载媒体文件出错
- throw new WxErrorException(WxError.fromJson(response.body().string()));
+ throw new WxErrorException(WxError.fromJson(response.body().string(), wxType));
}
String fileName = new HttpResponseProxy(response).getFileName();
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
index 02fffb1b..2fef1f93 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMediaUploadRequestExecutor.java
@@ -1,32 +1,29 @@
package me.chanjar.weixin.common.util.http.okhttp;
-import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
import okhttp3.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
*/
public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
public OkHttpMediaUploadRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public WxMediaUploadResult execute(String uri, File file) throws WxErrorException, IOException {
- logger.debug("OkHttpMediaUploadRequestExecutor is running");
- //得到httpClient
- OkHttpClient client = requestHttp.getRequestHttpClient();
+ public WxMediaUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
RequestBody body = new MultipartBody.Builder()
.setType(MediaType.parse("multipart/form-data"))
@@ -36,9 +33,9 @@ public class OkHttpMediaUploadRequestExecutor extends MediaUploadRequestExecutor
.build();
Request request = new Request.Builder().url(uri).post(body).build();
- Response response = client.newCall(request).execute();
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
String responseContent = response.body().string();
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
index 380014d0..dbaa27c5 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpSimpleGetRequestExecutor.java
@@ -1,28 +1,29 @@
package me.chanjar.weixin.common.util.http.okhttp;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
-import okhttp3.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/4.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/4
*/
public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
public OkHttpSimpleGetRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String queryParam) throws WxErrorException, IOException {
- logger.debug("OkHttpSimpleGetRequestExecutor is running");
+ public String execute(String uri, String queryParam, WxType wxType) throws WxErrorException, IOException {
if (queryParam != null) {
if (uri.indexOf('?') == -1) {
uri += '?';
@@ -35,7 +36,7 @@ public class OkHttpSimpleGetRequestExecutor extends SimpleGetRequestExecutor {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
public OkHttpSimplePostRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public String execute(String uri, String postEntity) throws WxErrorException, IOException {
- logger.debug("OkHttpSimplePostRequestExecutor running");
- //得到httpClient
- OkHttpClient client = requestHttp.getRequestHttpClient();
-
- MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
- RequestBody body = RequestBody.create(mediaType, postEntity);
-
+ public String execute(String uri, String postEntity, WxType wxType) throws WxErrorException, IOException {
+ RequestBody body = RequestBody.create(MediaType.parse("text/plain; charset=utf-8"), postEntity);
Request request = new Request.Builder().url(uri).post(body).build();
-
- Response response = client.newCall(request).execute();
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
String responseContent = response.body().string();
- WxError error = WxError.fromJson(responseContent);
+ WxError error = WxError.fromJson(responseContent, wxType);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}
+
return responseContent;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
index 97740efb..b52bad95 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxGsonBuilder.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.common.util.json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import me.chanjar.weixin.common.bean.WxAccessToken;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
import me.chanjar.weixin.common.bean.menu.WxMenu;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
@@ -21,6 +22,8 @@ public class WxGsonBuilder {
INSTANCE.registerTypeAdapter(WxError.class, new WxErrorAdapter());
INSTANCE.registerTypeAdapter(WxMenu.class, new WxMenuGsonAdapter());
INSTANCE.registerTypeAdapter(WxMediaUploadResult.class, new WxMediaUploadResultAdapter());
+ INSTANCE.registerTypeAdapter(WxNetCheckResult.class, new WxNetCheckResultGsonAdapter());
+
}
public static Gson create() {
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java
new file mode 100644
index 00000000..65c15fbc
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/json/WxNetCheckResultGsonAdapter.java
@@ -0,0 +1,51 @@
+package me.chanjar.weixin.common.util.json;
+
+import com.google.gson.*;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author billytomato
+ */
+public class WxNetCheckResultGsonAdapter implements JsonDeserializer {
+
+
+ @Override
+ public WxNetCheckResult deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ WxNetCheckResult result = new WxNetCheckResult();
+
+ JsonArray dnssJson = json.getAsJsonObject().get("dns").getAsJsonArray();
+ List dnsInfoList = new ArrayList<>();
+ if (dnssJson != null && dnssJson.size() > 0) {
+ for (int i = 0; i < dnssJson.size(); i++) {
+ JsonObject buttonJson = dnssJson.get(i).getAsJsonObject();
+ WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo();
+ dnsInfo.setIp(GsonHelper.getString(buttonJson, "ip"));
+ dnsInfo.setRealOperator(GsonHelper.getString(buttonJson, "real_operator"));
+ dnsInfoList.add(dnsInfo);
+ }
+ }
+
+ JsonArray pingsJson = json.getAsJsonObject().get("ping").getAsJsonArray();
+ List pingInfoList = new ArrayList<>();
+ if (pingsJson != null && pingsJson.size() > 0) {
+ for (int i = 0; i < pingsJson.size(); i++) {
+ JsonObject pingJson = pingsJson.get(i).getAsJsonObject();
+ WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo();
+ pingInfo.setIp(GsonHelper.getString(pingJson, "ip"));
+ pingInfo.setFromOperator(GsonHelper.getString(pingJson, "from_operator"));
+ pingInfo.setPackageLoss(GsonHelper.getString(pingJson, "package_loss"));
+ pingInfo.setTime(GsonHelper.getString(pingJson, "time"));
+ pingInfoList.add(pingInfo);
+ }
+ }
+ result.setDnsInfos(dnsInfoList);
+ result.setPingInfos(pingInfoList);
+ return result;
+ }
+
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java
new file mode 100644
index 00000000..3a82b213
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/IntegerArrayConverter.java
@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.xml;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.thoughtworks.xstream.converters.basic.StringConverter;
+
+/**
+ * Integer型数组转换器.
+ *
+ * @author Binary Wang
+ * @date 2019-08-22
+ */
+public class IntegerArrayConverter extends StringConverter {
+ @Override
+ public boolean canConvert(Class type) {
+ return type == Integer[].class;
+ }
+
+ @Override
+ public String toString(Object obj) {
+ return "";
+ }
+
+ @Override
+ public Object fromString(String str) {
+ final Iterable iterable = Splitter.on(",").split(str);
+ final String[] strings = Iterables.toArray(iterable, String.class);
+ Integer[] result = new Integer[strings.length];
+ int index = 0;
+ for (String string : strings) {
+ result[index++] = Integer.parseInt(string);
+ }
+
+ return result;
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java
new file mode 100644
index 00000000..a383c596
--- /dev/null
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/LongArrayConverter.java
@@ -0,0 +1,37 @@
+package me.chanjar.weixin.common.util.xml;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.thoughtworks.xstream.converters.basic.StringConverter;
+
+/**
+ * Long型数组转换器.
+ *
+ * @author Binary Wang
+ * @date 2019-08-22
+ */
+public class LongArrayConverter extends StringConverter {
+ @Override
+ public boolean canConvert(Class type) {
+ return type == Long[].class;
+ }
+
+ @Override
+ public String toString(Object obj) {
+ return "";
+ }
+
+ @Override
+ public Object fromString(String str) {
+ final Iterable iterable = Splitter.on(",").split(str);
+ final String[] strings = Iterables.toArray(iterable, String.class);
+ Long[] result = new Long[strings.length];
+ int index = 0;
+ for (String string : strings) {
+ result[index++] = Long.parseLong(string);
+ }
+
+ return result;
+ }
+}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java
index aa948b34..ab1b1688 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/xml/XStreamCDataConverter.java
@@ -2,6 +2,11 @@ package me.chanjar.weixin.common.util.xml;
import com.thoughtworks.xstream.converters.basic.StringConverter;
+/**
+ * CDATA 内容转换器,加上CDATA标签.
+ *
+ * @author Daniel Qian
+ */
public class XStreamCDataConverter extends StringConverter {
@Override
diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
index bbefd487..79b80e63 100644
--- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
+++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/error/WxErrorTest.java
@@ -1,34 +1,34 @@
package me.chanjar.weixin.common.error;
-import org.testng.Assert;
+import me.chanjar.weixin.common.WxType;
import org.testng.annotations.Test;
-import static org.testng.Assert.*;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
@Test
public class WxErrorTest {
-
public void testFromJson() {
String json = "{ \"errcode\": 40003, \"errmsg\": \"invalid openid\" }";
- WxError wxError = WxError.fromJson(json);
+ WxError wxError = WxError.fromJson(json, WxType.MP);
assertEquals(40003, wxError.getErrorCode());
- assertEquals(wxError.getErrorMsg(), "invalid openid");
+ assertEquals(wxError.getErrorMsgEn(), "invalid openid");
}
public void testFromBadJson1() {
String json = "{ \"errcode\": 40003, \"errmsg\": \"invalid openid\", \"media_id\": \"12323423dsfafsf232f\" }";
- WxError wxError = WxError.fromJson(json);
+ WxError wxError = WxError.fromJson(json, WxType.MP);
assertEquals(40003, wxError.getErrorCode());
- assertEquals(wxError.getErrorMsg(), "invalid openid");
+ assertEquals(wxError.getErrorMsgEn(), "invalid openid");
}
public void testFromBadJson2() {
String json = "{\"access_token\":\"ACCESS_TOKEN\",\"expires_in\":7200}";
- WxError wxError = WxError.fromJson(json);
+ WxError wxError = WxError.fromJson(json, WxType.MP);
assertEquals(0, wxError.getErrorCode());
- assertEquals(wxError.getErrorMsg(), null);
+ assertNull(wxError.getErrorMsg());
}
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 10269ebd..2dc09480 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 3.5.0
+ 3.6.0
weixin-java-cp
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
index e25fd63c..73776228 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
@@ -10,10 +10,12 @@ import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpMessage;
import me.chanjar.weixin.cp.bean.WxCpMessageSendResult;
+import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
/**
* 微信API的Service.
+ *
* @author chanjaster
*/
public interface WxCpService {
@@ -72,9 +74,10 @@ public interface WxCpService {
/**
* 获得jsapi_ticket,不强制刷新jsapi_ticket
* 应用的jsapi_ticket用于计算agentConfig(参见“通过agentConfig注入应用的权限”)的签名,签名计算方法与上述介绍的config的签名算法完全相同,但需要注意以下区别:
- *
+ *
* 签名的jsapi_ticket必须使用以下接口获取。且必须用wx.agentConfig中的agentid对应的应用secret去获取access_token。
* 签名用的noncestr和timestamp必须与wx.agentConfig中的nonceStr和timestamp相同。
+ *
* @see #getJsapiTicket(boolean)
*/
String getAgentJsapiTicket() throws WxErrorException;
@@ -134,6 +137,26 @@ public interface WxCpService {
*/
String[] getCallbackIp() throws WxErrorException;
+ /**
+ *
+ * 获取服务商凭证
+ * 文档地址:https://work.weixin.qq.com/api/doc#90001/90143/91200
+ * 请求方式:POST(HTTPS)
+ * 请求地址: https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token
+ *
+ *
+ * @param corpId 服务商的corpid
+ * @param providerSecret 服务商的secret,在服务商管理后台可见
+ * @return {
+ * "errcode":0 ,
+ * "errmsg":"ok" ,
+ * "provider_access_token":"enLSZ5xxxxxxJRL",
+ * "expires_in":7200
+ * }
+ * @throws WxErrorException .
+ */
+ WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException;
+
/**
* 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求
*
@@ -206,7 +229,7 @@ public interface WxCpService {
* @return WxSessionManager
*/
WxSessionManager getSessionManager();
-
+
/**
*
* 设置WxSessionManager,只有当需要使用个性化的WxSessionManager的时候才需要调用此方法,
@@ -289,7 +312,7 @@ public interface WxCpService {
/**
* 获取群聊服务
- *
+ *
* @return 群聊服务
*/
WxCpChatService getChatService();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java
index 78f1d791..52bf9323 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTagService.java
@@ -18,11 +18,29 @@ import java.util.List;
*/
public interface WxCpTagService {
+ /**
+ * 创建标签.
+ *
+ * 请求地址:https://qyapi.weixin.qq.com/cgi-bin/tag/create?access_token=ACCESS_TOKEN
+ * 文档地址:https://work.weixin.qq.com/api/doc#90000/90135/90210
+ *
+ *
+ * @param name 标签名称,长度限制为32个字以内(汉字或英文字母),标签名不可与其他标签重名。
+ * @param id 标签id,非负整型,指定此参数时新增的标签会生成对应的标签id,不指定时则以目前最大的id自增。
+ * @return 标签id
+ * @throws WxErrorException .
+ */
+ String create(String name, Integer id) throws WxErrorException;
+
/**
* 创建标签.
*
* @param tagName 标签名
+ * @return 标签id
+ * @throws WxErrorException .
+ * @deprecated 建议使用 {@link #create(String, Integer)},其中后面的参数可以为空
*/
+ @Deprecated
String create(String tagName) throws WxErrorException;
/**
@@ -30,6 +48,7 @@ public interface WxCpTagService {
*
* @param tagId 标签id
* @param tagName 标签名
+ * @throws WxErrorException .
*/
void update(String tagId, String tagName) throws WxErrorException;
@@ -37,11 +56,15 @@ public interface WxCpTagService {
* 删除标签.
*
* @param tagId 标签id
+ * @throws WxErrorException .
*/
void delete(String tagId) throws WxErrorException;
/**
* 获得标签列表.
+ *
+ * @return 标签列表
+ * @throws WxErrorException .
*/
List listAll() throws WxErrorException;
@@ -49,6 +72,8 @@ public interface WxCpTagService {
* 获取标签成员.
*
* @param tagId 标签ID
+ * @return 成员列表
+ * @throws WxErrorException .
*/
List listUsersByTagId(String tagId) throws WxErrorException;
@@ -57,6 +82,8 @@ public interface WxCpTagService {
* 对应: http://qydev.weixin.qq.com/wiki/index.php?title=管理标签 中的get接口
*
* @param tagId 标签id
+ * @return .
+ * @throws WxErrorException .
*/
WxCpTagGetResult get(String tagId) throws WxErrorException;
@@ -66,6 +93,8 @@ public interface WxCpTagService {
* @param tagId 标签id
* @param userIds 用户ID 列表
* @param partyIds 企业部门ID列表
+ * @return .
+ * @throws WxErrorException .
*/
WxCpTagAddOrRemoveUsersResult addUsers2Tag(String tagId, List userIds, List partyIds) throws WxErrorException;
@@ -75,6 +104,8 @@ public interface WxCpTagService {
* @param tagId 标签id
* @param userIds 用户id列表
* @param partyIds 企业部门ID列表
+ * @return .
+ * @throws WxErrorException .
*/
WxCpTagAddOrRemoveUsersResult removeUsersFromTag(String tagId, List userIds, List partyIds) throws WxErrorException;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java
index 40ffcf55..edc2f552 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpTpService.java
@@ -15,7 +15,6 @@ import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
* @author zhenjun cai
*/
public interface WxCpTpService {
-
/**
*
* 验证推送过来的消息的正确性
@@ -84,15 +83,15 @@ public interface WxCpTpService {
WxAccessToken getCorpToken(String authCorpid, String permanentCode) throws WxErrorException;
/**
- * 获取企业永久授权码
+ * 获取企业永久授权码 .
*
- * @param authCode
- * @return
+ * @param authCode .
+ * @return .
*/
WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException;
/**
- * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求
+ * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求.
*
* @param url 接口地址
* @param queryParam 请求参数
@@ -100,7 +99,7 @@ public interface WxCpTpService {
String get(String url, String queryParam) throws WxErrorException;
/**
- * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求
+ * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求.
*
* @param url 接口地址
* @param postData 请求body字符串
@@ -124,7 +123,7 @@ public interface WxCpTpService {
/**
*
- * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试
+ * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试.
* 默认:1000ms
*
*
@@ -134,7 +133,7 @@ public interface WxCpTpService {
/**
*
- * 设置当微信系统响应系统繁忙时,最大重试次数
+ * 设置当微信系统响应系统繁忙时,最大重试次数.
* 默认:5次
*
*
@@ -148,21 +147,21 @@ public interface WxCpTpService {
void initHttp();
/**
- * 获取WxMpConfigStorage 对象
+ * 获取WxMpConfigStorage 对象.
*
* @return WxMpConfigStorage
*/
WxCpTpConfigStorage getWxCpTpConfigStorage();
/**
- * 注入 {@link WxCpTpConfigStorage} 的实现
+ * 注入 {@link WxCpTpConfigStorage} 的实现.
*
* @param wxConfigProvider 配置对象
*/
void setWxCpTpConfigStorage(WxCpTpConfigStorage wxConfigProvider);
/**
- * http请求对象
+ * http请求对象.
*/
RequestHttp, ?> getRequestHttp();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
index c7f10f6b..9c7396ab 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
@@ -6,6 +6,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.bean.WxJsapiSignature;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -23,10 +24,8 @@ import me.chanjar.weixin.cp.api.*;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpMessage;
import me.chanjar.weixin.cp.bean.WxCpMessageSendResult;
+import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
@@ -36,34 +35,36 @@ import java.util.Map;
import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.*;
/**
+ * .
+ *
* @author chanjarster
*/
@Slf4j
public abstract class BaseWxCpServiceImpl implements WxCpService, RequestHttp {
- private WxCpUserService userService = new WxCpUserServiceImpl(this);
- private WxCpChatService chatService = new WxCpChatServiceImpl(this);
+ private WxCpUserService userService = new WxCpUserServiceImpl(this);
+ private WxCpChatService chatService = new WxCpChatServiceImpl(this);
private WxCpDepartmentService departmentService = new WxCpDepartmentServiceImpl(this);
- private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this);
- private WxCpMenuService menuService = new WxCpMenuServiceImpl(this);
- private WxCpOAuth2Service oauth2Service = new WxCpOAuth2ServiceImpl(this);
- private WxCpTagService tagService = new WxCpTagServiceImpl(this);
- private WxCpAgentService agentService = new WxCpAgentServiceImpl(this);
- private WxCpOaService oaService = new WxCpOaServiceImpl(this);
- private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this);
+ private WxCpMediaService mediaService = new WxCpMediaServiceImpl(this);
+ private WxCpMenuService menuService = new WxCpMenuServiceImpl(this);
+ private WxCpOAuth2Service oauth2Service = new WxCpOAuth2ServiceImpl(this);
+ private WxCpTagService tagService = new WxCpTagServiceImpl(this);
+ private WxCpAgentService agentService = new WxCpAgentServiceImpl(this);
+ private WxCpOaService oaService = new WxCpOaServiceImpl(this);
+ private WxCpTaskCardService taskCardService = new WxCpTaskCardServiceImpl(this);
private WxCpExternalContactService externalContactService = new WxCpExternalContactServiceImpl(this);
/**
- * 全局的是否正在刷新access token的锁
+ * 全局的是否正在刷新access token的锁.
*/
protected final Object globalAccessTokenRefreshLock = new Object();
/**
- * 全局的是否正在刷新jsapi_ticket的锁
+ * 全局的是否正在刷新jsapi_ticket的锁.
*/
protected final Object globalJsapiTicketRefreshLock = new Object();
/**
- * 全局的是否正在刷新agent的jsapi_ticket的锁
+ * 全局的是否正在刷新agent的jsapi_ticket的锁.
*/
protected final Object globalAgentJsapiTicketRefreshLock = new Object();
@@ -72,7 +73,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
private WxSessionManager sessionManager = new StandardSessionManager();
/**
- * 临时文件目录
+ * 临时文件目录.
*/
private File tmpDirFile;
private int retrySleepMillis = 1000;
@@ -183,8 +184,8 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
params.put("js_code", jsCode);
params.put("grant_type", "authorization_code");
- String result = this.get(this.configStorage.getApiUrl(JSCODE_TO_SESSION), Joiner.on("&").withKeyValueSeparator("=").join(params));
- return WxCpMaJsCode2SessionResult.fromJson(result);
+ final String url = this.configStorage.getApiUrl(JSCODE_TO_SESSION);
+ return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params)));
}
@Override
@@ -199,6 +200,14 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
return ips;
}
+ @Override
+ public WxCpProviderToken getProviderToken(String corpId, String providerSecret) throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("corpid", corpId);
+ jsonObject.addProperty("provider_secret", providerSecret);
+ return WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN), jsonObject.toString()));
+ }
+
@Override
public String get(String url, String queryParam) throws WxErrorException {
return execute(SimpleGetRequestExecutor.create(this), url, queryParam);
@@ -258,7 +267,7 @@ public abstract class BaseWxCpServiceImpl implements WxCpService, RequestH
String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "access_token=" + accessToken;
try {
- T result = executor.execute(uriWithAccessToken, data);
+ T result = executor.execute(uriWithAccessToken, data, WxType.CP);
log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
return result;
} catch (WxErrorException e) {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
index 92c6ac29..fe8e3c08 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImpl.java
@@ -18,14 +18,17 @@ import me.chanjar.weixin.cp.api.WxCpTpService;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpTpCorp;
import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
+import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.*;
+
/**
+ * .
+ *
* @author zhenjun cai
*/
@Slf4j
@@ -73,7 +76,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ
@Override
public String getSuiteTicket(boolean forceRefresh) throws WxErrorException {
-// suite ticket由微信服务器推送,不能强制刷新
+// suite ticket由微信服务器推送,不能强制刷新
// if (forceRefresh) {
// this.configStorage.expireSuiteTicket();
// }
@@ -93,8 +96,8 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ
params.put("js_code", jsCode);
params.put("grant_type", "authorization_code");
- String result = this.get(configStorage.getApiUrl(WxCpApiPathConsts.Tp.JSCODE_TO_SESSION), Joiner.on("&").withKeyValueSeparator("=").join(params));
- return WxCpMaJsCode2SessionResult.fromJson(result);
+ final String url = configStorage.getApiUrl(JSCODE_TO_SESSION);
+ return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params)));
}
@@ -103,20 +106,19 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("auth_corpid", authCorpid);
jsonObject.addProperty("permanent_code", permanentCode);
- String result = post(configStorage.getApiUrl(WxCpApiPathConsts.Tp.GET_CORP_TOKEN), jsonObject.toString());
+ String result = post(configStorage.getApiUrl(GET_CORP_TOKEN), jsonObject.toString());
return WxAccessToken.fromJson(result);
}
-
@Override
public WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("auth_code", authCode);
- String result = post(configStorage.getApiUrl(WxCpApiPathConsts.Tp.GET_PERMANENT_CODE), jsonObject.toString());
+ String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString());
jsonObject = new JsonParser().parse(result).getAsJsonObject();
- WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsString());
+ WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsJsonObject().toString());
wxCpTpCorp.setPermanentCode(jsonObject.get("permanent_code").getAsString());
return wxCpTpCorp;
}
@@ -180,7 +182,7 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ
String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken;
try {
- T result = executor.execute(uriWithAccessToken, data);
+ T result = executor.execute(uriWithAccessToken, data, WxType.CP);
log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result);
return result;
} catch (WxErrorException e) {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
index 6a9b7746..94aa977b 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImpl.java
@@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpAgentService;
@@ -36,8 +37,8 @@ public class WxCpAgentServiceImpl implements WxCpAgentService {
throw new IllegalArgumentException("缺少agentid参数");
}
- String responseContent = this.mainService.get(String.format(this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_GET), agentId), null);
- return WxCpAgent.fromJson(responseContent);
+ final String url = String.format(this.mainService.getWxCpConfigStorage().getApiUrl(AGENT_GET), agentId);
+ return WxCpAgent.fromJson(this.mainService.get(url, null));
}
@Override
@@ -46,7 +47,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService {
String responseContent = this.mainService.post(url, agentInfo.toJson());
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
if (jsonObject.get("errcode").getAsInt() != 0) {
- throw new WxErrorException(WxError.fromJson(responseContent));
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP));
}
}
@@ -56,7 +57,7 @@ public class WxCpAgentServiceImpl implements WxCpAgentService {
String responseContent = this.mainService.get(url, null);
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
if (jsonObject.get("errcode").getAsInt() != 0) {
- throw new WxErrorException(WxError.fromJson(responseContent));
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.CP));
}
return WxCpGsonBuilder.create().fromJson(jsonObject.get("agentlist").toString(), new TypeToken>() {
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
index bd5baf01..b1f374c0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpChatServiceImpl.java
@@ -43,13 +43,14 @@ public class WxCpChatServiceImpl implements WxCpChatService {
if (StringUtils.isNotBlank(chatId)) {
data.put("chatid", chatId);
}
- String result = this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE), WxGsonBuilder.create().toJson(data));
+ final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_CREATE);
+ String result = this.cpService.post(url, WxGsonBuilder.create().toJson(data));
return new JsonParser().parse(result).getAsJsonObject().get("chatid").getAsString();
}
@Override
public String create(String name, String owner, List users, String chatId) throws WxErrorException {
- return chatCreate(name, owner, users, chatId);
+ return this.chatCreate(name, owner, users, chatId);
}
@Override
@@ -72,24 +73,27 @@ public class WxCpChatServiceImpl implements WxCpChatService {
data.put("del_user_list", usersToDelete);
}
- this.cpService.post(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_UPDATE), WxGsonBuilder.create().toJson(data));
+ final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_UPDATE);
+ this.cpService.post(url, WxGsonBuilder.create().toJson(data));
}
@Override
- public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete) throws WxErrorException {
+ public void update(String chatId, String name, String owner, List usersToAdd, List usersToDelete)
+ throws WxErrorException {
chatUpdate(chatId, name, owner, usersToAdd, usersToDelete);
}
@Override
public WxCpChat chatGet(String chatId) throws WxErrorException {
- String result = this.cpService.get(this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId), null);
- return WxCpGsonBuilder.create()
- .fromJson(JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString(), WxCpChat.class);
+ final String url = this.cpService.getWxCpConfigStorage().getApiUrl(APPCHAT_GET_CHATID + chatId);
+ String result = this.cpService.get(url, null);
+ final String chatInfo = JSON_PARSER.parse(result).getAsJsonObject().getAsJsonObject("chat_info").toString();
+ return WxCpGsonBuilder.create().fromJson(chatInfo, WxCpChat.class);
}
@Override
public WxCpChat get(String chatId) throws WxErrorException {
- return chatGet(chatId);
+ return this.chatGet(chatId);
}
@Override
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 18910008..8a5b7d56 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -20,22 +20,22 @@ public class WxCpExternalContactServiceImpl implements WxCpExternalContactServic
@Override
public WxCpUserExternalContactInfo getExternalContact(String userId) throws WxErrorException {
- String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(GET_EXTERNAL_CONTACT + userId), null);
-
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_EXTERNAL_CONTACT + userId);
+ String responseContent = this.mainService.get(url, null);
return WxCpUserExternalContactInfo.fromJson(responseContent);
}
@Override
public List listExternalContacts(String userId) throws WxErrorException {
- String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(LIST_EXTERNAL_CONTACT + userId), null);
- WxCpUserExternalContactList list = WxCpUserExternalContactList.fromJson(responseContent);
- return list.getExternalUserId();
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(LIST_EXTERNAL_CONTACT + userId);
+ String responseContent = this.mainService.get(url, null);
+ return WxCpUserExternalContactList.fromJson(responseContent).getExternalUserId();
}
@Override
public List listFollowUser() throws WxErrorException {
- String responseContent = this.mainService.get(this.mainService.getWxCpConfigStorage().getApiUrl(GET_FOLLOW_USER_LIST), null);
- WxCpUserWithExternalPermission list = WxCpUserWithExternalPermission.fromJson(responseContent);
- return list.getFollowUser();
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_FOLLOW_USER_LIST);
+ String responseContent = this.mainService.get(url, null);
+ return WxCpUserWithExternalPermission.fromJson(responseContent).getFollowUser();
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java
index 05e13cfc..55579ff0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpMediaServiceImpl.java
@@ -6,6 +6,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.fs.FileUtils;
import me.chanjar.weixin.common.util.http.BaseMediaDownloadRequestExecutor;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.cp.api.WxCpMediaService;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
@@ -59,8 +60,8 @@ public class WxCpMediaServiceImpl implements WxCpMediaService {
@Override
public String uploadImg(File file) throws WxErrorException {
- final WxMediaUploadResult result = this.mainService
- .execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), this.mainService.getWxCpConfigStorage().getApiUrl(IMG_UPLOAD), file);
- return result.getUrl();
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(IMG_UPLOAD);
+ return this.mainService.execute(MediaUploadRequestExecutor.create(this.mainService.getRequestHttp()), url, file)
+ .getUrl();
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
index 5d7d758c..b8449ced 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpOaServiceImpl.java
@@ -22,6 +22,8 @@ import java.util.List;
import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Oa.*;
/**
+ * .
+ *
* @author Element
* @date 2019-04-06 11:20
*/
@@ -60,7 +62,8 @@ public class WxCpOaServiceImpl implements WxCpOaService {
jsonObject.add("useridlist", jsonArray);
- String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA), jsonObject.toString());
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_DATA);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
return WxCpGsonBuilder.create()
.fromJson(
@@ -89,7 +92,8 @@ public class WxCpOaServiceImpl implements WxCpOaService {
jsonObject.addProperty("datetime", datetime.getTime() / 1000L);
jsonObject.add("useridlist", jsonArray);
- String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION), jsonObject.toString());
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_CHECKIN_OPTION);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
return WxCpGsonBuilder.create()
@@ -109,12 +113,14 @@ public class WxCpOaServiceImpl implements WxCpOaService {
jsonObject.addProperty("next_spnum", nextSpnum);
}
- String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_APPROVAL_DATA), jsonObject.toString());
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_APPROVAL_DATA);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
return WxCpGsonBuilder.create().fromJson(responseContent, WxCpApprovalDataResult.class);
}
@Override
- public List getDialRecord(Date startTime, Date endTime, Integer offset, Integer limit) throws WxErrorException {
+ public List getDialRecord(Date startTime, Date endTime, Integer offset, Integer limit)
+ throws WxErrorException {
JsonObject jsonObject = new JsonObject();
if (offset == null) {
@@ -141,14 +147,13 @@ public class WxCpOaServiceImpl implements WxCpOaService {
jsonObject.addProperty("end_time", endtimestamp);
}
- String responseContent = this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD), jsonObject.toString());
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(GET_DIAL_RECORD);
+ String responseContent = this.mainService.post(url, jsonObject.toString());
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
- return WxCpGsonBuilder.create()
- .fromJson(
- tmpJsonElement.getAsJsonObject().get("record"),
- new TypeToken>() {
- }.getType()
- );
+ return WxCpGsonBuilder.create().fromJson(tmpJsonElement.getAsJsonObject().get("record"),
+ new TypeToken>() {
+ }.getType()
+ );
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
index d0e97c6e..753f2493 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpTagServiceImpl.java
@@ -10,14 +10,11 @@ import me.chanjar.weixin.cp.bean.WxCpTag;
import me.chanjar.weixin.cp.bean.WxCpTagAddOrRemoveUsersResult;
import me.chanjar.weixin.cp.bean.WxCpTagGetResult;
import me.chanjar.weixin.cp.bean.WxCpUser;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List;
import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.*;
-import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_CREATE;
-import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_UPDATE;
/**
*
@@ -31,12 +28,27 @@ import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tag.TAG_UPDATE;
public class WxCpTagServiceImpl implements WxCpTagService {
private final WxCpService mainService;
+ @Override
+ public String create(String name, Integer id) throws WxErrorException {
+ JsonObject o = new JsonObject();
+ o.addProperty("tagname", name);
+
+ if (id != null) {
+ o.addProperty("tagid", id);
+ }
+ return this.create(o);
+ }
+
@Override
public String create(String tagName) throws WxErrorException {
JsonObject o = new JsonObject();
o.addProperty("tagname", tagName);
+ return this.create(o);
+ }
+
+ private String create(JsonObject param) throws WxErrorException {
String url = this.mainService.getWxCpConfigStorage().getApiUrl(TAG_CREATE);
- String responseContent = this.mainService.post(url, o.toString());
+ String responseContent = this.mainService.post(url, param.toString());
JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
return tmpJsonElement.getAsJsonObject().get("tagid").getAsString();
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java
index c75f7566..b9844d39 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpUserServiceImpl.java
@@ -10,7 +10,6 @@ import me.chanjar.weixin.cp.api.WxCpUserService;
import me.chanjar.weixin.cp.bean.WxCpInviteResult;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.bean.WxCpUserExternalContactInfo;
-import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.util.List;
@@ -61,7 +60,7 @@ public class WxCpUserServiceImpl implements WxCpUserService {
}
jsonObject.add("useridlist", jsonArray);
- this.mainService.post(USER_BATCH_DELETE, jsonObject.toString());
+ this.mainService.post(this.mainService.getWxCpConfigStorage().getApiUrl(USER_BATCH_DELETE), jsonObject.toString());
}
@Override
@@ -94,7 +93,8 @@ public class WxCpUserServiceImpl implements WxCpUserService {
}
@Override
- public List listSimpleByDepartment(Long departId, Boolean fetchChild, Integer status) throws WxErrorException {
+ public List listSimpleByDepartment(Long departId, Boolean fetchChild, Integer status)
+ throws WxErrorException {
String params = "";
if (fetchChild != null) {
params += "&fetch_child=" + (fetchChild ? "1" : "0");
@@ -117,7 +117,8 @@ public class WxCpUserServiceImpl implements WxCpUserService {
}
@Override
- public WxCpInviteResult invite(List userIds, List partyIds, List tagIds) throws WxErrorException {
+ public WxCpInviteResult invite(List userIds, List partyIds, List tagIds)
+ throws WxErrorException {
JsonObject jsonObject = new JsonObject();
if (userIds != null) {
JsonArray jsonArray = new JsonArray();
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java
index 0af13a84..9aa2a2fc 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAppChatMessage.java
@@ -6,9 +6,9 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import me.chanjar.weixin.cp.constant.WxCpConsts.AppChatMsgType;
import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
import me.chanjar.weixin.cp.bean.article.NewArticle;
+import me.chanjar.weixin.cp.constant.WxCpConsts.AppChatMsgType;
import java.io.Serializable;
import java.util.List;
@@ -28,16 +28,49 @@ import java.util.List;
public class WxCpAppChatMessage implements Serializable {
private static final long serialVersionUID = -5469013416372240229L;
+ /**
+ * 消息类型
+ */
private String msgType;
+ /**
+ * 消息内容
+ */
private String content;
+ /**
+ * 群聊id
+ */
private String chatId;
+ /**
+ * 图片媒体文件id,可以调用上传临时素材接口获取
+ */
private String mediaId;
+ /**
+ * 视频消息的标题,不超过128个字节,超过会自动截断
+ */
private String title;
+ /**
+ * 视频消息的描述,不超过512个字节,超过会自动截断
+ */
private String description;
+ /**
+ * 表示是否是保密消息
+ */
private Boolean safe;
+ /**
+ * 点击后跳转的链接。
+ */
private String url;
+ /**
+ * 按钮文字。 默认为“详情”, 不超过4个文字,超过自动截断。
+ */
private String btnTxt;
+ /**
+ * 图文消息,一个图文消息支持1到8条图文
+ */
private List articles;
+ /**
+ * Mpnews图文消息,一个图文消息支持1到8条图文
+ */
private List mpnewsArticles;
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java
index 3e1299e9..383c5265 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpApprovalDataResult.java
@@ -7,10 +7,10 @@ import java.io.Serializable;
import java.util.Map;
/**
+ * 企业微信 OA 审批数据.
+ *
* @author Element
- * @Package me.chanjar.weixin.cp.bean
* @date 2019-04-06 14:36
- * @Description: 企业微信 OA 审批数据
*/
@Data
public class WxCpApprovalDataResult implements Serializable {
@@ -27,17 +27,16 @@ public class WxCpApprovalDataResult implements Serializable {
private Integer total;
@SerializedName("next_spnum")
- private Long nextSpnum;
+ private Long nextSpNum;
private WxCpApprovalData[] data;
@Data
- public static class WxCpApprovalData implements Serializable{
-
+ public static class WxCpApprovalData implements Serializable {
private static final long serialVersionUID = -3051785319608491640L;
-
- private String spname;
+ @SerializedName("spname")
+ private String spName;
@SerializedName("apply_name")
private String applyName;
@@ -64,6 +63,6 @@ public class WxCpApprovalDataResult implements Serializable {
private String applyUserId;
@SerializedName("comm")
- private Map comm;
+ private Map comm;
}
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java
index 369c771f..d2fbf0f9 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinData.java
@@ -7,14 +7,13 @@ import java.io.Serializable;
import java.util.List;
/**
+ * 企业微信打卡数据.
+ *
* @author Element
- * @Package me.chanjar.weixin.cp.bean
* @date 2019-04-06 11:01
- * @Description: 企业微信打卡数据
*/
@Data
public class WxCpCheckinData implements Serializable {
-
private static final long serialVersionUID = 1915820330847799605L;
@SerializedName("userid")
@@ -42,7 +41,7 @@ public class WxCpCheckinData implements Serializable {
private String wifiName;
@SerializedName("wifimac")
- private String wifiMAC;
+ private String wifiMac;
private String notes;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java
index 9cc3c389..c554e3d7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpCheckinOption.java
@@ -7,10 +7,10 @@ import java.io.Serializable;
import java.util.List;
/**
+ * 企业微信打卡规则.
+ *
* @author Element
- * @Package me.chanjar.weixin.cp.bean
* @date 2019-04-06 13:22
- * @Description: 企业微信打卡规则
*/
@Data
public class WxCpCheckinOption implements Serializable {
@@ -21,10 +21,8 @@ public class WxCpCheckinOption implements Serializable {
private Group group;
-
@Data
public static class CheckinDate implements Serializable {
-
private static final long serialVersionUID = -5601722383347110974L;
private List workdays;
@@ -36,15 +34,14 @@ public class WxCpCheckinOption implements Serializable {
private Long flexTime;
@SerializedName("noneed_offwork")
- private Boolean noneedOffwork;
+ private Boolean noNeedOffwork;
@SerializedName("limit_aheadtime")
- private Long limitAheadtime;
+ private Long limitAheadTime;
}
@Data
public static class CheckinTime implements Serializable {
-
private static final long serialVersionUID = -8579954143265336276L;
@SerializedName("work_sec")
@@ -90,16 +87,16 @@ public class WxCpCheckinOption implements Serializable {
private Boolean needPhoto;
@SerializedName("note_can_use_local_pic")
- private Boolean note_can_use_local_pic;
+ private Boolean noteCanUseLocalPic;
@SerializedName("allow_checkin_offworkday")
- private Boolean allow_checkin_offworkday;
+ private Boolean allowCheckinOffWorkday;
@SerializedName("allow_apply_offworkday")
- private Boolean allow_apply_offworkday;
+ private Boolean allowApplyOffWorkday;
@SerializedName("wifimac_infos")
- private List wifiMACInfos;
+ private List wifiMacInfos;
@SerializedName("loc_infos")
private List locInfos;
@@ -107,8 +104,7 @@ public class WxCpCheckinOption implements Serializable {
}
@Data
- public static class WifiMACInfo implements Serializable{
-
+ public static class WifiMacInfo implements Serializable {
private static final long serialVersionUID = -4657809185716627368L;
@SerializedName("wifiname")
@@ -119,8 +115,7 @@ public class WxCpCheckinOption implements Serializable {
}
@Data
- public static class LocInfo implements Serializable{
-
+ public static class LocInfo implements Serializable {
private static final long serialVersionUID = -618965280668099608L;
private Long lat;
@@ -136,8 +131,7 @@ public class WxCpCheckinOption implements Serializable {
}
@Data
- public static class SpeDay implements Serializable{
-
+ public static class SpeDay implements Serializable {
private static final long serialVersionUID = -3538818921359212748L;
private Long timestamp;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java
index d8e40c79..4f93b3de 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpDialRecord.java
@@ -7,10 +7,10 @@ import java.io.Serializable;
import java.util.List;
/**
+ * 公费电话拨打记录.
+ *
* @author Element
- * @Package me.chanjar.weixin.cp.bean
* @date 2019-04-06 15:38
- * @Description: 公费电话拨打记录
*/
@Data
public class WxCpDialRecord implements Serializable {
@@ -39,7 +39,7 @@ public class WxCpDialRecord implements Serializable {
* 主叫信息
*/
@Data
- public static class Caller implements Serializable{
+ public static class Caller implements Serializable {
private static final long serialVersionUID = 4792200404338145607L;
@@ -53,7 +53,7 @@ public class WxCpDialRecord implements Serializable {
* 被叫信息
*/
@Data
- public static class Callee implements Serializable{
+ public static class Callee implements Serializable {
private static final long serialVersionUID = 2390963671336179550L;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
index b07e3d54..b39c2229 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpMessage.java
@@ -8,7 +8,6 @@ import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.messagebuilder.*;
import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
-import me.chanjar.weixin.cp.constant.WxCpConsts;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
new file mode 100644
index 00000000..2c98f8e3
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpProviderToken.java
@@ -0,0 +1,30 @@
+package me.chanjar.weixin.cp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
+
+/**
+ * 服务商凭证.
+ *
+ * @author Binary Wang
+ * @date 2019-11-02
+ */
+@Data
+public class WxCpProviderToken {
+ /**
+ * 服务商的access_token,最长为512字节。
+ */
+ @SerializedName("provider_access_token")
+ private String providerAccessToken;
+
+ /**
+ * provider_access_token有效期(秒)
+ */
+ @SerializedName("expires_in")
+ private Integer expiresIn;
+
+ public static WxCpProviderToken fromJson(String json) {
+ return WxCpGsonBuilder.create().fromJson(json, WxCpProviderToken.class);
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java
index 82c33f52..0e22b626 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackage.java
@@ -1,55 +1,55 @@
-package me.chanjar.weixin.cp.bean;
-
-import java.io.Serializable;
-import java.util.Map;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamConverter;
-import lombok.Data;
-import me.chanjar.weixin.common.util.XmlUtils;
-import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder;
-import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder;
-import me.chanjar.weixin.cp.config.WxCpConfigStorage;
-import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
-import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
-
-/**
- * 回调消息包.
- * https://work.weixin.qq.com/api/doc#90001/90143/91116
- *
- * @author zhenjun cai
- */
-@XStreamAlias("xml")
-@Data
-public class WxCpTpXmlPackage implements Serializable {
-
- private static final long serialVersionUID = 6031833682211475786L;
- /**
- * 使用dom4j解析的存放所有xml属性和值的map.
- */
- private Map allFieldsMap;
-
- @XStreamAlias("ToUserName")
- @XStreamConverter(value = XStreamCDataConverter.class)
- protected String toUserName;
-
- @XStreamAlias("AgentID")
- @XStreamConverter(value = XStreamCDataConverter.class)
- protected String agentId;
-
- @XStreamAlias("Encrypt")
- @XStreamConverter(value = XStreamCDataConverter.class)
- protected String msgEncrypt;
-
- public static WxCpTpXmlPackage fromXml(String xml) {
- //修改微信变态的消息内容格式,方便解析
- //xml = xml.replace("", "");
- final WxCpTpXmlPackage xmlPackage = XStreamTransformer.fromXml(WxCpTpXmlPackage.class, xml);
- xmlPackage.setAllFieldsMap(XmlUtils.xml2Map(xml));
- return xmlPackage;
- }
-}
+package me.chanjar.weixin.cp.bean;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import me.chanjar.weixin.common.util.XmlUtils;
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder;
+import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder;
+import me.chanjar.weixin.cp.config.WxCpConfigStorage;
+import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
+import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
+
+/**
+ * 回调消息包.
+ * https://work.weixin.qq.com/api/doc#90001/90143/91116
+ *
+ * @author zhenjun cai
+ */
+@XStreamAlias("xml")
+@Data
+public class WxCpTpXmlPackage implements Serializable {
+ private static final long serialVersionUID = 6031833682211475786L;
+
+ /**
+ * 使用dom4j解析的存放所有xml属性和值的map.
+ */
+ private Map allFieldsMap;
+
+ @XStreamAlias("ToUserName")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ protected String toUserName;
+
+ @XStreamAlias("AgentID")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ protected String agentId;
+
+ @XStreamAlias("Encrypt")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ protected String msgEncrypt;
+
+ public static WxCpTpXmlPackage fromXml(String xml) {
+ //修改微信变态的消息内容格式,方便解析
+ //xml = xml.replace(" ", "");
+ final WxCpTpXmlPackage xmlPackage = XStreamTransformer.fromXml(WxCpTpXmlPackage.class, xml);
+ xmlPackage.setAllFieldsMap(XmlUtils.xml2Map(xml));
+ return xmlPackage;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
index 8f4e4989..b7389afa 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpUser.java
@@ -27,6 +27,10 @@ public class WxCpUser implements Serializable {
private Gender gender;
private String email;
private String avatar;
+ /**
+ * 地址。长度最大128个字符
+ */
+ private String address;
private String avatarMediaId;
private Integer status;
private Integer enable;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java
index 771e5729..712eed83 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpXmlMessage.java
@@ -7,6 +7,8 @@ import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.util.XmlUtils;
+import me.chanjar.weixin.common.util.xml.IntegerArrayConverter;
+import me.chanjar.weixin.common.util.xml.LongArrayConverter;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
@@ -214,7 +216,7 @@ public class WxCpXmlMessage implements Serializable {
* 成员部门列表,变更时推送,仅返回该应用有查看权限的部门id.
*/
@XStreamAlias("Department")
- @XStreamConverter(value = XStreamCDataConverter.class)
+ @XStreamConverter(value = LongArrayConverter.class)
private Long[] departments;
/**
@@ -268,6 +270,7 @@ public class WxCpXmlMessage implements Serializable {
* 表示所在部门是否为上级,0-否,1-是,顺序与Department字段的部门逐一对应.
*/
@XStreamAlias("IsLeaderInDept")
+ @XStreamConverter(value = IntegerArrayConverter.class)
private Integer[] isLeaderInDept;
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java
index af622fef..595d12c5 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/MpnewsArticle.java
@@ -17,12 +17,34 @@ import java.io.Serializable;
public class MpnewsArticle implements Serializable {
private static final long serialVersionUID = 6985871812170756481L;
+ /**
+ * 标题,不超过128个字节,超过会自动截断
+ */
private String title;
+ /**
+ * 图文消息缩略图的media_id, 可以通过素材管理接口获得。此处thumb_media_id即上传接口返回的media_id
+ */
private String thumbMediaId;
+ /**
+ * 图文消息的作者,不超过64个字节
+ */
private String author;
+ /**
+ * 图文消息点击“阅读原文”之后的页面链接
+ */
private String contentSourceUrl;
+ /**
+ * 图文消息的内容,支持html标签,不超过666 K个字节
+ */
private String content;
+ /**
+ * 图文消息的描述,不超过512个字节,超过会自动截断
+ */
private String digest;
+ /**
+ * 可能已经废弃了,官方文档里已经看不到了
+ */
+ @Deprecated
private String showCoverPic;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java
index d5e74c44..5eede5fa 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/article/NewArticle.java
@@ -1,12 +1,12 @@
package me.chanjar.weixin.cp.bean.article;
-import java.io.Serializable;
-
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.io.Serializable;
+
/**
*
* Created by BinaryWang on 2017/3/27.
@@ -20,10 +20,21 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class NewArticle implements Serializable {
private static final long serialVersionUID = 4087852055781140659L;
-
+ /**
+ * 标题,不超过128个字节,超过会自动截断
+ */
private String title;
+ /**
+ * 描述,不超过512个字节,超过会自动截断
+ */
private String description;
+ /**
+ * 点击后跳转的链接。
+ */
private String url;
+ /**
+ * 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图1068*455,小图150*150。
+ */
private String picUrl;
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 6de1a63a..46813464 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -20,7 +20,8 @@ public final class WxCpApiPathConsts {
public static final String BATCH_REPLACE_USER = "/cgi-bin/batch/replaceuser";
public static final String BATCH_GET_RESULT = "/cgi-bin/batch/getresult?jobid=";
public static final String JSCODE_TO_SESSION = "/cgi-bin/miniprogram/jscode2session";
- public static final String GET_TOKEN = "/cgi-bin/gettoken?&corpid=%s&corpsecret=%s";
+ public static final String GET_TOKEN = "/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
+ public static final String GET_PROVIDER_TOKEN = "/cgi-bin/service/get_provider_token";
public static class Agent {
public static final String AGENT_GET = "/cgi-bin/agent/get?agentid=%d";
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
index 631abdff..b5424be0 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
@@ -1,9 +1,6 @@
package me.chanjar.weixin.cp.message;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -18,7 +15,6 @@ import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
import me.chanjar.weixin.common.session.InternalSession;
import me.chanjar.weixin.common.session.InternalSessionManager;
-import me.chanjar.weixin.common.session.StandardSessionManager;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.common.util.LogExceptionHandler;
import me.chanjar.weixin.cp.api.WxCpService;
@@ -54,9 +50,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
* @author Daniel Qian
*/
public class WxCpMessageRouter {
-
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
- protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class);
+ private final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class);
private final List rules = new ArrayList<>();
private final WxCpService wxCpService;
@@ -69,6 +64,9 @@ public class WxCpMessageRouter {
private WxErrorExceptionHandler exceptionHandler;
+ /**
+ * 构造方法.
+ */
public WxCpMessageRouter(WxCpService wxCpService) {
this.wxCpService = wxCpService;
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
@@ -82,8 +80,6 @@ public class WxCpMessageRouter {
* 设置自定义的 {@link ExecutorService}
* 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
*
- *
- * @param executorService
*/
public void setExecutorService(ExecutorService executorService) {
this.executorService = executorService;
@@ -94,8 +90,6 @@ public class WxCpMessageRouter {
* 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker}
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker}
*
- *
- * @param messageDuplicateChecker
*/
public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) {
this.messageDuplicateChecker = messageDuplicateChecker;
@@ -106,8 +100,6 @@ public class WxCpMessageRouter {
* 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
*
- *
- * @param sessionManager
*/
public void setSessionManager(WxSessionManager sessionManager) {
this.sessionManager = sessionManager;
@@ -118,8 +110,6 @@ public class WxCpMessageRouter {
* 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
*
- *
- * @param exceptionHandler
*/
public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) {
this.exceptionHandler = exceptionHandler;
@@ -130,20 +120,17 @@ public class WxCpMessageRouter {
}
/**
- * 开始一个新的Route规则
+ * 开始一个新的Route规则.
*/
public WxCpMessageRouterRule rule() {
return new WxCpMessageRouterRule(this);
}
/**
- * 处理微信消息
- *
- * @param wxMessage
- * @param context
+ * 处理微信消息.
*/
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) {
- if (isDuplicateMessage(wxMessage)) {
+ if (isMsgDuplicated(wxMessage)) {
// 如果是重复消息,那么就不做处理
return null;
}
@@ -207,48 +194,46 @@ public class WxCpMessageRouter {
return res;
}
-
/**
* 处理微信消息.
- *
*/
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
return this.route(wxMessage, new HashMap(2));
}
- protected boolean isDuplicateMessage(WxCpXmlMessage wxMessage) {
- String messageId;
+ private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
+ StringBuilder messageId = new StringBuilder();
if (wxMessage.getMsgId() == null) {
- messageId = String.valueOf(wxMessage.getCreateTime())
- + "-" + StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))
- + "-" + wxMessage.getFromUserName()
- + "-" + StringUtils.trimToEmpty(wxMessage.getEventKey())
- + "-" + StringUtils.trimToEmpty(wxMessage.getEvent())
- ;
+ messageId.append(wxMessage.getCreateTime())
+ .append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId())))
+ .append("-").append(wxMessage.getFromUserName())
+ .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()))
+ .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()));
} else {
- messageId = new StringBuilder().append(wxMessage.getMsgId())
+ messageId.append(wxMessage.getMsgId())
.append("-").append(wxMessage.getCreateTime())
- .append("-").append(wxMessage.getFromUserName())
- .toString();
+ .append("-").append(wxMessage.getFromUserName());
}
- return this.messageDuplicateChecker.isDuplicate(messageId);
+ if (StringUtils.isNotEmpty(wxMessage.getUserId())) {
+ messageId.append("-").append(wxMessage.getUserId());
+ }
+
+ if (StringUtils.isNotEmpty(wxMessage.getChangeType())) {
+ messageId.append("-").append(wxMessage.getChangeType());
+ }
+ return this.messageDuplicateChecker.isDuplicate(messageId.toString());
}
/**
- * 对session的访问结束
- *
- * @param wxMessage
+ * 对session的访问结束.
*/
- protected void sessionEndAccess(WxCpXmlMessage wxMessage) {
-
+ private void sessionEndAccess(WxCpXmlMessage wxMessage) {
InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName());
if (session != null) {
session.endAccess();
}
}
-
-
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java
index 453d1700..e45ef2ec 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/crypto/WxCpTpCryptUtil.java
@@ -1,52 +1,30 @@
-/**
- * 对公众平台发送给公众账号的消息加解密示例代码.
- *
- * @copyright Copyright (c) 1998-2014 Tencent Inc.
- *
- * 针对org.apache.commons.codec.binary.Base64,
- * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
- * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
- *
- * 针对org.apache.commons.codec.binary.Base64,
- * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
- * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * 针对org.apache.commons.codec.binary.Base64,
- * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
- * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
- */
-package me.chanjar.weixin.cp.util.crypto;
-
-import org.apache.commons.codec.binary.Base64;
-
-import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
-import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
-
-public class WxCpTpCryptUtil extends WxCryptUtil {
-
- /**
- * 构造函数
- *
- * @param wxCpConfigStorage
- */
- public WxCpTpCryptUtil(WxCpTpConfigStorage wxCpTpConfigStorage) {
- /*
- * @param token 公众平台上,开发者设置的token
- * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey
- * @param appidOrCorpid 公众平台corpId
- */
- String encodingAesKey = wxCpTpConfigStorage.getAesKey();
- String token = wxCpTpConfigStorage.getToken();
- String corpId = wxCpTpConfigStorage.getCorpId();
-
- this.token = token;
- this.appidOrCorpid = corpId;
- this.aesKey = Base64.decodeBase64(encodingAesKey + "=");
- }
-
-
-}
+package me.chanjar.weixin.cp.util.crypto;
+
+import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
+import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * @author someone
+ */
+public class WxCpTpCryptUtil extends WxCryptUtil {
+ /**
+ * 构造函数.
+ */
+ public WxCpTpCryptUtil(WxCpTpConfigStorage wxCpTpConfigStorage) {
+ /*
+ * @param token 公众平台上,开发者设置的token
+ * @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey
+ * @param appidOrCorpid 公众平台corpId
+ */
+ String encodingAesKey = wxCpTpConfigStorage.getAesKey();
+ String token = wxCpTpConfigStorage.getToken();
+ String corpId = wxCpTpConfigStorage.getCorpId();
+
+ this.token = token;
+ this.appidOrCorpid = corpId;
+ this.aesKey = Base64.decodeBase64(encodingAesKey + "=");
+ }
+
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
index ed125c57..482a42b4 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapter.java
@@ -66,6 +66,7 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
user.setGender(Gender.fromCode(GsonHelper.getString(o, "gender")));
user.setEmail(GsonHelper.getString(o, "email"));
user.setAvatar(GsonHelper.getString(o, "avatar"));
+ user.setAddress(GsonHelper.getString(o, "address"));
user.setAvatarMediaId(GsonHelper.getString(o, "avatar_mediaid"));
user.setStatus(GsonHelper.getInteger(o, "status"));
user.setEnable(GsonHelper.getInteger(o, "enable"));
@@ -186,6 +187,9 @@ public class WxCpUserGsonAdapter implements JsonDeserializer, JsonSeri
if (user.getAvatar() != null) {
o.addProperty("avatar", user.getAvatar());
}
+ if (user.getAddress() != null) {
+ o.addProperty("address", user.getAddress());
+ }
if (user.getAvatarMediaId() != null) {
o.addProperty("avatar_mediaid", user.getAvatarMediaId());
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
index 69a6aa43..f18f8b74 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
@@ -33,4 +33,9 @@ public class BaseWxCpServiceImplTest {
public void testJsCode2Session() throws WxErrorException {
assertThat(this.wxService.jsCode2Session("111")).isNotNull();
}
+
+ @Test
+ public void testGetProviderToken() throws WxErrorException {
+ assertThat(this.wxService.getProviderToken("111","123")).isNotNull();
+ }
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
new file mode 100644
index 00000000..5de54f54
--- /dev/null
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpTpServiceImplTest.java
@@ -0,0 +1,172 @@
+package me.chanjar.weixin.cp.api.impl;
+
+import com.google.gson.JsonObject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.cp.api.WxCpTpService;
+import me.chanjar.weixin.cp.bean.WxCpTpCorp;
+import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
+import me.chanjar.weixin.cp.config.impl.WxCpTpDefaultConfigImpl;
+import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
+import org.testng.annotations.Test;
+
+import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.GET_PERMANENT_CODE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.*;
+import static org.testng.Assert.*;
+
+/**
+ * 测试代码.
+ *
+ * @author Binary Wang
+ * @date 2019-08-18
+ */
+public class BaseWxCpTpServiceImplTest {
+ private WxCpTpService tpService = spy(new WxCpTpServiceImpl());
+
+ @Test
+ public void testCheckSignature() {
+ }
+
+ @Test
+ public void testGetSuiteAccessToken() {
+ }
+
+ @Test
+ public void testGetSuiteTicket() {
+ }
+
+ @Test
+ public void testTestGetSuiteTicket() {
+ }
+
+ @Test
+ public void testJsCode2Session() {
+ }
+
+ @Test
+ public void testGetCorpToken() {
+ }
+
+ @Test
+ public void testGetPermanentCode() throws WxErrorException {
+ String returnJson = "{\n" +
+ " \"errcode\":0 ,\n" +
+ " \"errmsg\":\"ok\" ,\n" +
+ " \"access_token\": \"xxxxxx\", \n" +
+ " \"expires_in\": 7200, \n" +
+ " \"permanent_code\": \"xxxx\", \n" +
+ " \"dealer_corp_info\": \n" +
+ " {\n" +
+ " \"corpid\": \"xxxx\",\n" +
+ " \"corp_name\": \"name\"\n" +
+ " },\n" +
+ " \"auth_corp_info\": \n" +
+ " {\n" +
+ " \"corpid\": \"xxxx\",\n" +
+ " \"corp_name\": \"name\",\n" +
+ " \"corp_type\": \"verified\",\n" +
+ " \"corp_square_logo_url\": \"yyyyy\",\n" +
+ " \"corp_user_max\": 50,\n" +
+ " \"corp_agent_max\": 30,\n" +
+ " \"corp_full_name\":\"full_name\",\n" +
+ " \"verified_end_time\":1431775834,\n" +
+ " \"subject_type\": 1,\n" +
+ " \"corp_wxqrcode\": \"zzzzz\",\n" +
+ " \"corp_scale\": \"1-50人\",\n" +
+ " \"corp_industry\": \"IT服务\",\n" +
+ " \"corp_sub_industry\": \"计算机软件/硬件/信息服务\",\n" +
+ " \"location\":\"广东省广州市\"\n" +
+ " },\n" +
+ " \"auth_info\":\n" +
+ " {\n" +
+ " \"agent\" :\n" +
+ " [\n" +
+ " {\n" +
+ " \"agentid\":1,\n" +
+ " \"name\":\"NAME\",\n" +
+ " \"round_logo_url\":\"xxxxxx\",\n" +
+ " \"square_logo_url\":\"yyyyyy\",\n" +
+ " \"appid\":1,\n" +
+ " \"privilege\":\n" +
+ " {\n" +
+ " \"level\":1,\n" +
+ " \"allow_party\":[1,2,3],\n" +
+ " \"allow_user\":[\"zhansan\",\"lisi\"],\n" +
+ " \"allow_tag\":[1,2,3],\n" +
+ " \"extra_party\":[4,5,6],\n" +
+ " \"extra_user\":[\"wangwu\"],\n" +
+ " \"extra_tag\":[4,5,6]\n" +
+ " }\n" +
+ " },\n" +
+ " {\n" +
+ " \"agentid\":2,\n" +
+ " \"name\":\"NAME2\",\n" +
+ " \"round_logo_url\":\"xxxxxx\",\n" +
+ " \"square_logo_url\":\"yyyyyy\",\n" +
+ " \"appid\":5\n" +
+ " }\n" +
+ " ]\n" +
+ " },\n" +
+ " \"auth_user_info\":\n" +
+ " {\n" +
+ " \"userid\":\"aa\",\n" +
+ " \"name\":\"xxx\",\n" +
+ " \"avatar\":\"http://xxx\"\n" +
+ " }\n" +
+ "}\n";
+
+ final WxCpTpConfigStorage configStorage = new WxCpTpDefaultConfigImpl();
+ tpService.setWxCpTpConfigStorage(configStorage);
+
+ JsonObject jsonObject = new JsonObject();
+ String authCode = "";
+ jsonObject.addProperty("auth_code", authCode);
+ doReturn(returnJson).when(tpService).post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString());
+
+ final WxCpTpCorp tpCorp = tpService.getPermanentCode(authCode);
+ assertThat(tpCorp.getPermanentCode()).isEqualTo("xxxx");
+ }
+
+ @Test
+ public void testGet() {
+ }
+
+ @Test
+ public void testPost() {
+ }
+
+ @Test
+ public void testExecute() {
+ }
+
+ @Test
+ public void testExecuteInternal() {
+ }
+
+ @Test
+ public void testSetWxCpTpConfigStorage() {
+ }
+
+ @Test
+ public void testSetRetrySleepMillis() {
+ }
+
+ @Test
+ public void testSetMaxRetryTimes() {
+ }
+
+ @Test
+ public void testGetTmpDirFile() {
+ }
+
+ @Test
+ public void testSetTmpDirFile() {
+ }
+
+ @Test
+ public void testGetRequestHttp() {
+ }
+}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
index 90d2f14a..b785fc0a 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpAgentServiceImplTest.java
@@ -6,13 +6,17 @@ import me.chanjar.weixin.cp.api.ApiTestModule;
import me.chanjar.weixin.cp.api.WxCpAgentService;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.WxCpAgent;
+import me.chanjar.weixin.cp.config.WxCpConfigStorage;
+import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import me.chanjar.weixin.cp.constant.WxCpApiPathConsts;
+import me.chanjar.weixin.cp.constant.WxCpConsts;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.contentOf;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
@@ -71,7 +75,9 @@ public class WxCpAgentServiceImplTest {
@Test
public void testGet() throws Exception {
String returnJson = "{\"errcode\": 0,\"errmsg\": \"ok\",\"agentid\": 9,\"name\": \"测试应用\",\"square_logo_url\": \"http://wx.qlogo.cn/mmhead/alksjf;lasdjf;lasjfuodiuj3rj2o34j/0\",\"description\": \"这是一个企业号应用\",\"allow_userinfos\": {\"user\": [{\"userid\": \"0009854\"}, {\"userid\": \"1723\"}, {\"userid\": \"5625\"}]},\"allow_partys\": {\"partyid\": [42762742]},\"allow_tags\": {\"tagid\": [23, 22, 35, 19, 32, 125, 133, 46, 150, 38, 183, 9, 7]},\"close\": 0,\"redirect_domain\": \"weixin.com.cn\",\"report_location_flag\": 0,\"isreportenter\": 0,\"home_url\": \"\"}";
- when(wxService.get(String.format(wxService.getWxCpConfigStorage().getApiUrl(WxCpApiPathConsts.Agent.AGENT_GET), 9), null)).thenReturn(returnJson);
+ final WxCpConfigStorage configStorage = new WxCpDefaultConfigImpl();
+ when(wxService.getWxCpConfigStorage()).thenReturn(configStorage);
+ when(wxService.get(String.format(configStorage.getApiUrl(WxCpApiPathConsts.Agent.AGENT_GET), 9), null)).thenReturn(returnJson);
when(wxService.getAgentService()).thenReturn(new WxCpAgentServiceImpl(wxService));
WxCpAgentService wxAgentService = this.wxService.getAgentService();
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
new file mode 100644
index 00000000..7b0e75a5
--- /dev/null
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpTpXmlPackageTest.java
@@ -0,0 +1,28 @@
+package me.chanjar.weixin.cp.bean;
+
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.*;
+
+/**
+ * .
+ *
+ * @author Binary Wang
+ * @date 2019-08-18
+ */
+public class WxCpTpXmlPackageTest {
+
+ @Test
+ public void testFromXml() {
+ WxCpTpXmlPackage result = WxCpTpXmlPackage.fromXml(" \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n");
+ assertThat(result).isNotNull();
+ assertThat(result.getToUserName()).isEqualTo("toUser");
+ assertThat(result.getAgentId()).isEqualTo("toAgentID");
+ assertThat(result.getMsgEncrypt()).isEqualTo("msg_encrypt");
+ }
+}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java
index e6efa043..f10b5d4f 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/WxCpXmlMessageTest.java
@@ -2,9 +2,11 @@ package me.chanjar.weixin.cp.bean;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.cp.constant.WxCpConsts;
+import me.chanjar.weixin.cp.util.xml.XStreamTransformer;
import org.testng.annotations.Test;
import static me.chanjar.weixin.cp.constant.WxCpConsts.EventType.TASKCARD_CLICK;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
@@ -222,4 +224,52 @@ public class WxCpXmlMessageTest {
assertEquals(wxMessage.getUserId(), "zhangsan");
assertEquals(wxMessage.getExternalUserId(), "woAJ2GCAAAXtWyujaWJHDDGi0mACH71w");
}
+
+ public void testChangeContact() {
+ String xml = "\n" +
+ " \n" +
+ " \n" +
+ " 1403610513 \n" +
+ " \n" +
+ " \n" +
+ " update_user \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " 15913215421 \n" +
+ " 1 \n" +
+ " \n" +
+ " 1 \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " - \n" +
+ "
\n" +
+ " 0 \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " - \n" +
+ "
\n" +
+ " 1 \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " ";
+
+ WxCpXmlMessage wxCpXmlMessage = WxCpXmlMessage.fromXml(xml);
+ assertThat(wxCpXmlMessage).isNotNull();
+ assertThat(wxCpXmlMessage.getDepartments()).isNotEmpty();
+
+ System.out.println(XStreamTransformer.toXml(WxCpXmlMessage.class, wxCpXmlMessage));
+ }
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java
index 9cdc51f8..d1770022 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/util/json/WxCpUserGsonAdapterTest.java
@@ -1,8 +1,7 @@
package me.chanjar.weixin.cp.util.json;
-import org.testng.annotations.*;
-
import me.chanjar.weixin.cp.bean.WxCpUser;
+import org.testng.annotations.Test;
import static org.assertj.core.api.Assertions.assertThat;
@@ -32,6 +31,7 @@ public class WxCpUserGsonAdapterTest {
" \"isleader\": 1,\n" +
" \"avatar\": \"http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0\",\n" +
" \"telephone\": \"020-123456\",\n" +
+ " \"address\": \"广州市海珠区新港中路\"," +
" \"enable\": 1,\n" +
" \"alias\": \"jackzhang\",\n" +
" \"extattr\": {\n" +
@@ -82,7 +82,7 @@ public class WxCpUserGsonAdapterTest {
assertThat(user.getOrders()[0]).isEqualTo(1);
assertThat(user.getOrders()[1]).isEqualTo(2);
-
+ assertThat(user.getAddress()).isEqualTo("广州市海珠区新港中路");
assertThat(user.getExternalAttrs()).isNotEmpty();
final WxCpUser.ExternalAttribute externalAttr1 = user.getExternalAttrs().get(0);
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index fb7cf4f6..cefda9b5 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 3.5.0
+ 3.6.0
weixin-java-miniapp
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
index f0dbccd8..3dec5140 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaMsgService.java
@@ -1,6 +1,7 @@
package cn.binarywang.wx.miniapp.api;
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -15,6 +16,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
public interface WxMaMsgService {
String KEFU_MESSAGE_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
String TEMPLATE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send";
+ String SUBSCRIBE_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send";
String UNIFORM_MSG_SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send";
/**
@@ -36,6 +38,15 @@ public interface WxMaMsgService {
void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException;
+ /**
+ *
+ * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+ *
+ * 发送订阅消息
+ */
+ void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException;
+
+
/**
*
* 下发小程序和公众号统一的服务消息
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
index 842d0662..4c821e07 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
@@ -1,5 +1,6 @@
package cn.binarywang.wx.miniapp.api;
+import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
import java.io.File;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -18,6 +19,8 @@ public interface WxMaSecCheckService {
String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check";
+ String MEDIA_CHECK_ASYNC_URL = "https://api.weixin.qq.com/wxa/media_check_async";
+
/**
*
* 校验一张图片是否含有违法违规内容.
@@ -39,5 +42,25 @@ public interface WxMaSecCheckService {
* 详情请见: https://developers.weixin.qq.com/miniprogram/dev/api/open-api/sec-check/msgSecCheck.html
*
*/
- boolean checkMessage(String msgString);
+ boolean checkMessage(String msgString) throws WxErrorException;
+
+
+ /**
+ *
+ * 异步校验图片/音频是否含有违法违规内容。
+ * 应用场景举例:
+ * 语音风险识别:社交类用户发表的语音内容检测;
+ * 图片智能鉴黄:涉及拍照的工具类应用(如美拍,识图类应用)用户拍照上传检测;电商类商品上架图片检测;媒体类用户文章里的图片检测等;
+ * 敏感人脸识别:用户头像;媒体类用户文章里的图片检测;社交类用户上传的图片检测等。
+ * 频率限制:
+ * 单个 appId 调用上限为 2000 次/分钟,200,000 次/天;文件大小限制:单个文件大小不超过10M
+ * 详情请见:
+ * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.mediaCheckAsync.html
+ *
+ * @param mediaUrl 要检测的多媒体url
+ * @param mediaType 媒体类型,{@link cn.binarywang.wx.miniapp.constant.WxMaConstants.SecCheckMediaType}
+ * @return
+ */
+ WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl,int mediaType) throws WxErrorException;
+
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
index 1dbf0526..3973774f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java
@@ -9,20 +9,29 @@ import me.chanjar.weixin.common.error.WxErrorException;
import java.util.List;
public interface WxMaTemplateService {
-
- //获取小程序模板库标题列表
+ /**
+ * 获取小程序模板库标题列表.
+ */
String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list";
- //获取模板库某个模板标题下关键词库
+ /**
+ * 获取模板库某个模板标题下关键词库.
+ */
String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get";
- //组合模板并添加至帐号下的个人模板库
+ /**
+ * 组合模板并添加至帐号下的个人模板库.
+ */
String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add";
- //获取帐号下已存在的模板列表
+ /**
+ * 获取帐号下已存在的模板列表.
+ */
String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list";
- //删除帐号下的某个模板
+ /**
+ * 删除帐号下的某个模板.
+ */
String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del";
/**
@@ -32,9 +41,6 @@ public interface WxMaTemplateService {
* 详情请见: 获取小程序模板库标题列表
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN
*
- * @param offset
- * @param count
- * @return
*/
WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException;
@@ -45,8 +51,6 @@ public interface WxMaTemplateService {
* 详情请见: 获取小程序模板库标题列表
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN
*
- * @param id
- * @return
*/
WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException;
@@ -57,9 +61,6 @@ public interface WxMaTemplateService {
* 详情请见: 获取小程序模板库标题列表
* 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN
*
- * @param id
- * @param keywordIdList
- * @return
*/
WxMaTemplateAddResult addTemplate(String id, List+ * 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能 + *+ */ @Override public void sendTemplateMsg(WxMaTemplateMessage templateMessage) throws WxErrorException { String responseContent = this.wxMaService.post(TEMPLATE_MSG_SEND_URL, templateMessage.toJson()); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); + } + } + + @Override + public void sendSubscribeMsg(WxMaSubscribeMessage subscribeMessage) throws WxErrorException { + String responseContent = this.wxMaService.post(SUBSCRIBE_MSG_SEND_URL, subscribeMessage.toJson()); + JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); + if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } } @@ -42,7 +56,7 @@ public class WxMaMsgServiceImpl implements WxMaMsgService { String responseContent = this.wxMaService.post(UNIFORM_MSG_SEND_URL, uniformMessage.toJson()); JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject(); if (jsonObject.get(WxMaConstants.ERRCODE).getAsInt() != 0) { - throw new WxErrorException(WxError.fromJson(responseContent)); + throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp)); } } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java index 052a0caa..134ed66d 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaPluginServiceImpl.java @@ -4,33 +4,28 @@ import cn.binarywang.wx.miniapp.api.WxMaPluginService; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaPluginListResult; import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; -import java.util.HashMap; import java.util.Map; +@AllArgsConstructor public class WxMaPluginServiceImpl implements WxMaPluginService { - private WxMaService wxMaService; - public WxMaPluginServiceImpl(WxMaService wxMaService) { - this.wxMaService = wxMaService; - } - @Override public void applyPlugin(String pluginAppId, String reason) throws WxErrorException { - Map
@@ -15,13 +16,10 @@ import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
*
* @author Binary Wang
*/
+@AllArgsConstructor
public class WxMaRunServiceImpl implements WxMaRunService {
private WxMaService service;
- public WxMaRunServiceImpl(WxMaService service) {
- this.service = service;
- }
-
@Override
public List getRunStepInfo(String sessionKey, String encryptedData, String ivStr) {
return WxMaRunStepInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
index 1dab0a82..c69ca5eb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
@@ -1,10 +1,11 @@
package cn.binarywang.wx.miniapp.api.impl;
-import java.io.File;
-
import cn.binarywang.wx.miniapp.api.WxMaSecCheckService;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
import com.google.gson.JsonObject;
+import java.io.File;
+import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
@@ -17,12 +18,10 @@ import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
*
* @author Binary Wang
*/
+@AllArgsConstructor
public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
- private WxMaService service;
- public WxMaSecCheckServiceImpl(WxMaService service) {
- this.service = service;
- }
+ private WxMaService service;
@Override
public boolean checkImage(File file) throws WxErrorException {
@@ -33,16 +32,24 @@ public class WxMaSecCheckServiceImpl implements WxMaSecCheckService {
}
@Override
- public boolean checkMessage(String msgString) {
+ public boolean checkMessage(String msgString) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("content", msgString);
- try {
- this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
- } catch (WxErrorException e) {
- return false;
- }
+
+ this.service.post(MSG_SEC_CHECK_URL, jsonObject.toString());
return true;
}
+ @Override
+ public WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl, int mediaType)
+ throws WxErrorException {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("media_url", mediaUrl);
+ jsonObject.addProperty("media_type", mediaType);
+
+ return WxMaMediaAsyncCheckResult
+ .fromJson(this.service.post(MEDIA_CHECK_ASYNC_URL, jsonObject.toString()));
+ }
+
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
index 797dc6b9..44ba6258 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
@@ -119,7 +119,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttpCharming
* @since 2018-04-27 15:46
*/
+@AllArgsConstructor
public class WxMaSettingServiceImpl implements WxMaSettingService {
private WxMaService wxMaService;
- public WxMaSettingServiceImpl(WxMaService wxMaService) {
- this.wxMaService = wxMaService;
- }
-
@Override
public WxMaDomainAction modifyDomain(WxMaDomainAction domainAction) throws WxErrorException {
String responseContent = this.wxMaService.post(MODIFY_DOMAIN_URL, domainAction.toJson());
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
index 173bfde3..a9d1f474 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShareServiceImpl.java
@@ -4,17 +4,15 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaShareService;
import cn.binarywang.wx.miniapp.bean.WxMaShareInfo;
import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
+import lombok.AllArgsConstructor;
/**
* @author zhfish
*/
+@AllArgsConstructor
public class WxMaShareServiceImpl implements WxMaShareService {
private WxMaService service;
- public WxMaShareServiceImpl(WxMaService service) {
- this.service = service;
- }
-
@Override
public WxMaShareInfo getShareInfo(String sessionKey, String encryptedData, String ivStr) {
return WxMaShareInfo.fromJson(WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr));
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
index 3ecb484d..9f5fbf0f 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java
@@ -1,101 +1,58 @@
package cn.binarywang.wx.miniapp.api.impl;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaTemplateService;
import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
-import me.chanjar.weixin.common.error.WxError;
+import com.google.common.collect.ImmutableMap;
+import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
-public class WxMaTemplateServiceImpl implements WxMaTemplateService {
+import java.util.List;
+import java.util.Map;
+/**
+ * @author Binary
+ */
+@AllArgsConstructor
+public class WxMaTemplateServiceImpl implements WxMaTemplateService {
private WxMaService wxMaService;
- public WxMaTemplateServiceImpl(WxMaService wxMaService) {
- this.wxMaService = wxMaService;
- }
-
@Override
public WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException {
-
- Map params = new HashMap<>();
- params.put("offset", offset);
- params.put("count", count);
-
+ Map params = ImmutableMap.of("offset", offset, "count", count);
String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params));
- WxError wxError = WxError.fromJson(responseText);
- if (wxError.getErrorCode() == 0) {
- return WxMaTemplateLibraryListResult.fromJson(responseText);
- } else {
- throw new WxErrorException(wxError);
- }
+ return WxMaTemplateLibraryListResult.fromJson(responseText);
}
@Override
public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException {
-
- Map params = new HashMap<>();
- params.put("id", id);
-
- String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL, WxGsonBuilder.create().toJson(params));
- WxError wxError = WxError.fromJson(responseText);
- if (wxError.getErrorCode() == 0) {
- return WxMaTemplateLibraryGetResult.fromJson(responseText);
- } else {
- throw new WxErrorException(wxError);
- }
+ String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL,
+ WxGsonBuilder.create().toJson(ImmutableMap.of("id", id)));
+ return WxMaTemplateLibraryGetResult.fromJson(responseText);
}
@Override
public WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException {
-
- Map params = new HashMap<>();
- params.put("id", id);
- params.put("keyword_id_list", keywordIdList.toArray());
-
- String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, WxGsonBuilder.create().toJson(params));
- WxError wxError = WxError.fromJson(responseText);
- if (wxError.getErrorCode() == 0) {
- return WxMaTemplateAddResult.fromJson(responseText);
- } else {
- throw new WxErrorException(wxError);
- }
+ String responseText = this.wxMaService.post(TEMPLATE_ADD_URL,
+ WxGsonBuilder.create().toJson(ImmutableMap.of("id", id, "keyword_id_list", keywordIdList.toArray())));
+ return WxMaTemplateAddResult.fromJson(responseText);
}
@Override
public WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException {
-
- Map params = new HashMap<>();
- params.put("offset", offset);
- params.put("count", count);
-
+ Map params = ImmutableMap.of("offset", offset, "count", count);
String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params));
- WxError wxError = WxError.fromJson(responseText);
- if (wxError.getErrorCode() == 0) {
- return WxMaTemplateListResult.fromJson(responseText);
- } else {
- throw new WxErrorException(wxError);
- }
+ return WxMaTemplateListResult.fromJson(responseText);
}
@Override
public boolean delTemplate(String templateId) throws WxErrorException {
- Map params = new HashMap<>();
- params.put("template_id", templateId);
-
- String responseText = this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params));
- WxError wxError = WxError.fromJson(responseText);
- if (wxError.getErrorCode() == 0) {
- return true;
- } else {
- throw new WxErrorException(wxError);
- }
+ Map params = ImmutableMap.of("template_id", templateId);
+ this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params));
+ return true;
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
index 3c29f855..ea9df1bf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImpl.java
@@ -10,7 +10,6 @@ import cn.binarywang.wx.miniapp.util.crypt.WxMaCryptUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.SignUtils;
import org.apache.commons.codec.digest.DigestUtils;
@@ -49,11 +48,7 @@ public class WxMaUserServiceImpl implements WxMaUserService {
String params = param.toString();
String signature = SignUtils.createHmacSha256Sign(params, sessionKey);
String url = String.format(SET_USER_STORAGE, config.getAppid(), signature, openid, "hmac_sha256");
- String result = this.service.post(url, params);
- WxError error = WxError.fromJson(result);
- if (error.getErrorCode() != 0) {
- throw new WxErrorException(error);
- }
+ this.service.post(url, params);
}
@Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
new file mode 100644
index 00000000..807f8076
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaMediaAsyncCheckResult.java
@@ -0,0 +1,25 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import com.google.gson.annotations.SerializedName;
+import java.io.Serializable;
+
+public class WxMaMediaAsyncCheckResult implements Serializable {
+
+ private static final long serialVersionUID = 3928132365399916183L;
+
+ /**
+ * 任务id,用于匹配异步推送结果
+ */
+ @SerializedName("trace_id")
+ private String traceId;
+
+
+ public static WxMaMediaAsyncCheckResult fromJson(String json) {
+ return WxMaGsonBuilder.create().fromJson(json, WxMaMediaAsyncCheckResult.class);
+ }
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java
new file mode 100644
index 00000000..048e6dae
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeData.java
@@ -0,0 +1,30 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ * 参考文档 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+ *
+ */
+@Data
+@NoArgsConstructor
+public class WxMaSubscribeData {
+ private String name;
+ private String value;
+ private String color;
+
+ public WxMaSubscribeData(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public WxMaSubscribeData(String name, String value, String color) {
+ this.name = name;
+ this.value = value;
+ this.color = color;
+ }
+
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
new file mode 100644
index 00000000..a43fd5b4
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaSubscribeMessage.java
@@ -0,0 +1,77 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 订阅消息.
+ * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class WxMaSubscribeMessage implements Serializable {
+
+ private static final long serialVersionUID = 6846729898251286686L;
+
+ /**
+ * 接收者(用户)的 openid.
+ *
+ * 参数:touser
+ * 是否必填: 是
+ * 描述: 接收者(用户)的 openid
+ *
+ */
+ private String toUser;
+
+ /**
+ * 所需下发的模板消息的id.
+ *
+ * 参数:template_id
+ * 是否必填: 是
+ * 描述: 所需下发的模板消息的id
+ *
+ */
+ private String templateId;
+
+ /**
+ * 点击模板卡片后的跳转页面,仅限本小程序内的页面.
+ *
+ * 参数:page
+ * 是否必填: 否
+ * 描述: 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
+ *
+ */
+ private String page;
+
+ /**
+ * 模板内容,不填则下发空模板.
+ *
+ * 参数:data
+ * 是否必填: 是
+ * 描述: 模板内容,不填则下发空模板
+ *
+ */
+ private List data;
+
+
+ public WxMaSubscribeMessage addData(WxMaSubscribeData datum) {
+ if (this.data == null) {
+ this.data = new ArrayList<>();
+ }
+ this.data.add(datum);
+
+ return this;
+ }
+
+ public String toJson() {
+ return WxMaGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
index 1ea3595e..efd2b229 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java
@@ -69,4 +69,20 @@ public class WxMaConstants {
*/
public static final int ERR_40014 = 40014;
}
+
+ /**
+ * 内容安全检测的媒体类型
+ */
+ public static final class SecCheckMediaType {
+
+ /**
+ * 音频
+ */
+ public static final int VOICE = 1;
+
+ /**
+ * 图片
+ */
+ public static final int IMAGE = 2;
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
index 5ea3fb8a..41f3e995 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/message/WxMaMessageRouterRule.java
@@ -32,6 +32,8 @@ public class WxMaMessageRouterRule {
private String rContent;
+ private String title;
+
private WxMaMessageMatcher matcher;
private boolean reEnter = false;
@@ -60,6 +62,16 @@ public class WxMaMessageRouterRule {
return this;
}
+ /**
+ * 标题,发送小程序页卡时有效
+ * @param title
+ * @return
+ */
+ public WxMaMessageRouterRule title(String title){
+ this.title = title;
+ return this;
+ }
+
/**
* 如果event等于某值.
*/
@@ -100,6 +112,8 @@ public class WxMaMessageRouterRule {
return this;
}
+
+
/**
* 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候.
*/
@@ -164,6 +178,8 @@ public class WxMaMessageRouterRule {
return end();
}
+
+
/**
* 将微信自定义的事件修正为不区分大小写.
* 比如框架定义的事件常量为click,但微信传递过来的却是CLICK
@@ -183,6 +199,9 @@ public class WxMaMessageRouterRule {
.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
&&
(this.matcher == null || this.matcher.match(wxMessage))
+ &&
+ (this.title == null || this.title
+ .equals(wxMessage.getTitle() == null ? null : wxMessage.getTitle().trim()))
;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
index 5421aea3..aa329396 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/QrcodeBytesRequestExecutor.java
@@ -1,8 +1,14 @@
package cn.binarywang.wx.miniapp.util;
-import java.io.IOException;
-import java.io.InputStream;
-
+import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.ResponseHandler;
+import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler;
+import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
import org.apache.commons.io.IOUtils;
import org.apache.http.Header;
import org.apache.http.HttpHost;
@@ -13,14 +19,8 @@ import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
-import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
-import me.chanjar.weixin.common.error.WxError;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.http.RequestExecutor;
-import me.chanjar.weixin.common.util.http.RequestHttp;
-import me.chanjar.weixin.common.util.http.ResponseHandler;
-import me.chanjar.weixin.common.util.http.apache.InputStreamResponseHandler;
-import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+import java.io.IOException;
+import java.io.InputStream;
/**
* @author Binary Wang
@@ -33,12 +33,12 @@ public class QrcodeBytesRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, AbstractWxMaQrcodeWrapper data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
@Override
- public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper) throws WxErrorException, IOException {
+ public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
httpPost.setConfig(
@@ -55,7 +55,7 @@ public class QrcodeBytesRequestExecutor implements RequestExecutorBinary Wang
@@ -35,12 +35,12 @@ public class QrcodeRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, AbstractWxMaQrcodeWrapper data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
@Override
- public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper) throws WxErrorException, IOException {
+ public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
httpPost.setConfig(
@@ -57,7 +57,7 @@ public class QrcodeRequestExecutor implements RequestExecutor {
+
+ @Override
+ public JsonElement serialize(WxMaSubscribeMessage message, Type typeOfSrc, JsonSerializationContext context) {
+ JsonObject messageJson = new JsonObject();
+ messageJson.addProperty("touser", message.getToUser());
+ messageJson.addProperty("template_id", message.getTemplateId());
+ if (message.getPage() != null) {
+ messageJson.addProperty("page", message.getPage());
+ }
+
+
+ JsonObject data = new JsonObject();
+ messageJson.add("data", data);
+
+ if (message.getData() == null) {
+ return messageJson;
+ }
+
+ for (WxMaSubscribeData datum : message.getData()) {
+ JsonObject dataJson = new JsonObject();
+ dataJson.addProperty("value", datum.getValue());
+ data.add(datum.getName(), dataJson);
+ }
+
+ return messageJson;
+ }
+
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
index 95b09713..f0961d5e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/xml/XStreamTransformer.java
@@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map;
import cn.binarywang.wx.miniapp.bean.WxMaMessage;
+import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage;
import com.thoughtworks.xstream.XStream;
import me.chanjar.weixin.common.util.xml.XStreamInitializer;
@@ -19,6 +20,7 @@ public class XStreamTransformer {
static {
registerClass(WxMaMessage.class);
+ registerClass(WxMaXmlOutMessage.class);
}
/**
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
index 298a9c93..f5f62cc5 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaMsgServiceImplTest.java
@@ -3,13 +3,10 @@ package cn.binarywang.wx.miniapp.api.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
+import cn.binarywang.wx.miniapp.bean.*;
import org.testng.annotations.*;
import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
-import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
-import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
-import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage;
import cn.binarywang.wx.miniapp.test.ApiTestModule;
import cn.binarywang.wx.miniapp.test.TestConfig;
import com.google.common.collect.Lists;
@@ -59,6 +56,21 @@ public class WxMaMsgServiceImplTest {
this.wxService.getMsgService().sendTemplateMsg(templateMessage);
}
+
+ @Test
+ public void testSendSubscribeMsg() throws WxErrorException {
+ TestConfig config = (TestConfig) this.wxService.getWxMaConfig();
+
+ WxMaSubscribeMessage message = new WxMaSubscribeMessage();
+ message.setTemplateId(config.getTemplateId());
+ message.setToUser(config.getOpenid());
+ message.addData(new WxMaSubscribeData("thing1", "苹果到货啦"));
+ message.addData(new WxMaSubscribeData("amount3", "¥5"));
+ message.addData(new WxMaSubscribeData("thing5", "记得领取哦"));
+ this.wxService.getMsgService().sendSubscribeMsg(message);
+ }
+
+
@Test
public void testSendUniformMsg() throws WxErrorException {
TestConfig config = (TestConfig) this.wxService.getWxMaConfig();
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
index df9ccaa8..19bca1ca 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
@@ -38,12 +38,13 @@ public class WxMaSecCheckServiceImplTest {
return new Object[][]{
{"特3456书yuuo莞6543李zxcz蒜7782法fgnv级", false},
{"完2347全dfji试3726测asad感3847知qwez到", false},
+ {"提现&下载&棋牌游戏&网页", false},
{"hello world!", true}
};
}
@Test(dataProvider = "secData")
- public void testCheckMessage(String msg, boolean result) {
+ public void testCheckMessage(String msg, boolean result) throws WxErrorException {
assertThat(this.wxService.getSecCheckService()
.checkMessage(msg))
.isEqualTo(result);
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java
index 85fb2f98..bf502733 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java
@@ -37,4 +37,16 @@ public class WxMaServiceImplTest {
final String unionId = this.wxService.getPaidUnionId("1", null, "3", "4");
assertThat(unionId).isNotEmpty();
}
+
+ @Test
+ public void testPost() throws WxErrorException {
+ final String postResult = this.wxService.post("https://api.weixin.qq.com/wxa/setdynamicdata", "{\n" +
+ " \"data\": \"{\\\"items\\\": [{\\\"from\\\":{\\\"city_name_cn\\\":\\\"广州市\\\"},\\\"to\\\":{\\\"city_name_cn\\\":\\\"北京市\\\"}}], \\\"attribute\\\": {\\\"count\\\": 1, \\\"totalcount\\\": 100, \\\"id\\\": \\\"1\\\", \\\"seq\\\": 0}}\",\n" +
+ " \"lifespan\": 86400,\n" +
+ " \"query\": \"{\\\"type\\\":100005}\",\n" +
+ " \"scene\": 1\n" +
+ "}");
+
+ System.out.println(postResult);
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java
index 2c478e8f..fe3fa167 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaUserServiceImplTest.java
@@ -1,20 +1,18 @@
package cn.binarywang.wx.miniapp.api.impl;
-import cn.binarywang.wx.miniapp.test.TestConfig;
-import com.google.common.collect.ImmutableMap;
-import jdk.nashorn.internal.ir.annotations.Immutable;
-import me.chanjar.weixin.common.error.WxErrorException;
-import org.testng.annotations.*;
-
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import cn.binarywang.wx.miniapp.test.TestConfig;
+import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
-import javax.management.ImmutableDescriptor;
-
-import static org.testng.Assert.*;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
/**
* 测试用户相关的接口
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
new file mode 100644
index 00000000..f07c57b1
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/message/WxMaXmlOutMessageTest.java
@@ -0,0 +1,23 @@
+package cn.binarywang.wx.miniapp.message;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.*;
+
+public class WxMaXmlOutMessageTest {
+
+ @Test
+ public void testToXml() {
+ WxMaXmlOutMessage message = WxMaXmlOutMessage.builder()
+ .fromUserName("1")
+ .toUserName("2")
+ .msgType(WxConsts.XmlMsgType.TRANSFER_CUSTOMER_SERVICE)
+ .createTime(System.currentTimeMillis() / 1000)
+ .build();
+
+ assertThat(message.toXml()).isNotEmpty();
+ System.out.println(message.toXml());
+ }
+}
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 8792a55e..7db18593 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 3.5.0
+ 3.6.0
weixin-java-mp
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
index f5131e8f..2202f556 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
@@ -4,6 +4,8 @@ import me.chanjar.weixin.common.bean.WxCardApiSignature;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.card.*;
+import java.util.List;
+
/**
* 卡券相关接口.
*
@@ -138,7 +140,7 @@ public interface WxMpCardService {
* @return result
* @throws WxErrorException 异常
*/
- WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException;
+ WxMpCardCreateResult createCard(WxMpCardCreateRequest cardCreateMessage) throws WxErrorException;
/**
* 创建卡券二维码.
@@ -183,7 +185,8 @@ public interface WxMpCardService {
* @return WxMpCardLandingPageCreateResult
* @throws WxErrorException 异常
*/
- WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateRequest createRequest) throws WxErrorException;
+ WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateRequest createRequest)
+ throws WxErrorException;
/**
* 将用户的卡券设置为失效状态.
@@ -206,4 +209,78 @@ public interface WxMpCardService {
*/
WxMpCardDeleteResult deleteCard(String cardId) throws WxErrorException;
+
+ /**
+ * 导入自定义code(仅对自定义code商户)
+ *
+ * @param cardId 卡券id
+ * @param codeList 需导入微信卡券后台的自定义code,上限为100个。
+ */
+ WxMpCardCodeDepositResult cardCodeDeposit(String cardId, List codeList) throws WxErrorException;
+
+ /**
+ * 查询导入code数目接口
+ *
+ * @param cardId 卡券id
+ */
+ WxMpCardCodeDepositCountResult cardCodeDepositCount(String cardId) throws WxErrorException;
+
+
+ /**
+ * 核查code接口
+ *
+ * @param cardId 卡券id
+ * @param codeList 已经微信卡券后台的自定义code,上限为100个
+ */
+ WxMpCardCodeCheckcodeResult cardCodeCheckcode(String cardId, List codeList) throws WxErrorException;
+
+ /**
+ * 图文消息群发卡券获取内嵌html
+ *
+ * @param cardId 卡券id
+ */
+ WxMpCardMpnewsGethtmlResult cardMpnewsGethtml(String cardId) throws WxErrorException;
+
+
+ /**
+ * 修改库存接口
+ * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#5
+ *
+ * @param cardId 卡券ID
+ * @param changeValue 库存变更值,负值为减少库存
+ */
+ void cardModifyStock(String cardId, Integer changeValue) throws WxErrorException;
+
+
+ /**
+ * 更改Code接口
+ * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Managing_Coupons_Vouchers_and_Cards.html#6
+ *
+ * @param cardId 卡券ID
+ * @param oldCode 需变更的Code码
+ * @param newCode 变更后的有效Code码
+ */
+ void cardCodeUpdate(String cardId, String oldCode, String newCode) throws WxErrorException;
+
+ /**
+ * 设置买单接口
+ * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#12
+ *
+ * @param cardId 卡券ID
+ * @param isOpen 是否开启买单功能,填true/false
+ */
+ void cardPaycellSet(String cardId, Boolean isOpen) throws WxErrorException;
+
+ /**
+ * 设置自助核销
+ * https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Create_a_Coupon_Voucher_or_Card.html#14
+ *
+ * @param cardId 卡券ID
+ * @param isOpen 是否开启自助核销功能
+ * @param needVerifyCod 用户核销时是否需要输入验证码, 填true/false, 默认为false
+ * @param needRemarkAmount 用户核销时是否需要备注核销金额, 填true/false, 默认为false
+ */
+ void cardSelfConsumeCellSet(String cardId, Boolean isOpen,
+ Boolean needVerifyCod, Boolean needRemarkAmount) throws WxErrorException;
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java
index 2ba7a092..423f61a7 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java
@@ -1,9 +1,11 @@
package me.chanjar.weixin.mp.api;
import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo;
/**
- * 评论数据管理.
+ * 图文消息留言管理接口.
+ * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1494572718_WzHIY
*
* @author Binary Wang
* @date 2019-06-16
@@ -12,11 +14,34 @@ public interface WxMpCommentService {
/**
* 打开已群发文章评论.
* https://api.weixin.qq.com/cgi-bin/comment/open?access_token=ACCESS_TOKEN
- * 参数 是否必须 类型 说明
*
* @param msgDataId 群发返回的msg_data_id
* @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
* @throws WxErrorException 异常
*/
void open(Integer msgDataId, Integer index) throws WxErrorException;
+
+ /**
+ * 关闭已群发文章评论.
+ * https://api.weixin.qq.com/cgi-bin/comment/close?access_token=ACCESS_TOKEN
+ *
+ * @param msgDataId 群发返回的msg_data_id
+ * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
+ * @throws WxErrorException 异常
+ */
+ void close(Integer msgDataId, Integer index) throws WxErrorException;
+
+ /**
+ * 查看指定文章的评论数据.
+ * https://api.weixin.qq.com/cgi-bin/comment/list?access_token=ACCESS_TOKEN
+ *
+ * @param msgDataId 群发返回的msg_data_id
+ * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文
+ * @param begin 起始位置
+ * @param count 获取数目(>=50会被拒绝)
+ * @param type type=0 普通评论&精选评论 type=1 普通评论 type=2 精选评论
+ * @return 评论列表数据
+ * @throws WxErrorException 异常
+ */
+ WxMpCommentListVo list(Integer msgDataId, Integer index, int begin, int count, int type) throws WxErrorException;
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java
new file mode 100644
index 00000000..63cea28e
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpImgProcService.java
@@ -0,0 +1,121 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
+
+import java.io.File;
+
+/**
+ * 多项图像处理能力相关的API.
+ * https://developers.weixin.qq.com/doc/offiaccount/Intelligent_Interface/Img_Proc.html
+ *
+ * @author Theo Nie
+ */
+public interface WxMpImgProcService {
+
+ /**
+ * 二维码/条码识别接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.支持条码、二维码、DataMatrix和PDF417的识别。
+ * 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。
+ *
+ * @param imgUrl 图片url地址
+ * @return WxMpImgProcQrCodeResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException;
+
+ /**
+ * 二维码/条码识别接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.支持条码、二维码、DataMatrix和PDF417的识别。
+ * 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。
+ *
+ * @param imgFile 图片文件对象
+ * @return WxMpImgProcQrCodeResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException;
+
+ /**
+ * 图片高清化接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小
+ * 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制
+ *
+ * @param imgUrl 图片url地址
+ * @return WxMpImgProcSuperResolutionResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException;
+
+ /**
+ * 图片高清化接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小
+ * 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制
+ *
+ * @param imgFile 图片文件对象
+ * @return WxMpImgProcSuperResolutionResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException;
+
+ /**
+ * 图片智能裁剪接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.该接口默认使用最佳宽高比
+ * @param imgUrl 图片url地址
+ * @return WxMpImgProcAiCropResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException;
+
+ /**
+ * 图片智能裁剪接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * @param imgUrl 图片url地址
+ * @param ratios 宽高比,最多支持5个,请以英文逗号分隔
+ * @return WxMpImgProcAiCropResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException;
+
+ /**
+ * 图片智能裁剪接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * 3.该接口默认使用最佳宽高比
+ * @param imgFile 图片文件对象
+ * @return WxMpImgProcAiCropResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException;
+
+ /**
+ * 图片智能裁剪接口
+ * 说明:
+ * 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别
+ * 2.文件大小限制:小于2M
+ * @param imgFile 图片文件对象
+ * @param ratios 宽高比,最多支持5个,请以英文逗号分隔
+ * @return WxMpImgProcAiCropResult
+ * @throws WxErrorException .
+ */
+ WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException;
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java
index c986e53e..df5d03e0 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMassMessageService.java
@@ -2,7 +2,9 @@ package me.chanjar.weixin.mp.api;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.*;
+import me.chanjar.weixin.mp.bean.result.WxMpMassGetResult;
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
+import me.chanjar.weixin.mp.bean.result.WxMpMassSpeedGetResult;
import me.chanjar.weixin.mp.bean.result.WxMpMassUploadResult;
/**
@@ -92,4 +94,36 @@ public interface WxMpMassMessageService {
*/
void delete(Long msgId, Integer articleIndex) throws WxErrorException;
+
+ /**
+ * 获取群发速度
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
+ */
+ WxMpMassSpeedGetResult messageMassSpeedGet() throws WxErrorException;
+
+
+ /**
+ * 设置群发速度
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
+ *
+ * @param speed 群发速度的级别,是一个0到4的整数,数字越大表示群发速度越慢。
+ * speed realspeed
+ * 0 80w/分钟
+ * 1 60w/分钟
+ * 2 45w/分钟
+ * 3 30w/分钟
+ * 4 10w/分钟
+ */
+ void messageMassSpeedSet(Integer speed) throws WxErrorException;
+
+
+ /**
+ * 查询群发消息发送状态【订阅号与服务号认证后均可用】
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%8F%91%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E7%8A%B6%E6%80%81%E3%80%90%E8%AE%A2%E9%98%85%E5%8F%B7%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%8F%B7%E8%AE%A4%E8%AF%81%E5%90%8E%E5%9D%87%E5%8F%AF%E7%94%A8%E3%80%91
+ *
+ * @param msgId 群发消息后返回的消息id
+ * @return 消息发送后的状态,SEND_SUCCESS表示发送成功,SENDING表示发送中,SEND_FAIL表示发送失败,DELETE表示已删除
+ */
+ WxMpMassGetResult messageMassGet(Long msgId) throws WxErrorException;
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java
index 686c86f2..998939ca 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java
@@ -88,6 +88,22 @@ public interface WxMpMaterialService {
*/
File mediaDownload(String mediaId) throws WxErrorException;
+ /**
+ *
+ * 获取高清语音素材
+ * 公众号可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。
+ * 该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。
+ * 详情请见:
+ * 获取高清语音素材
+ * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/get/jssdk?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
+ *
+ *
+ * @param mediaId 媒体文件Id
+ * @return 保存到本地的临时文件
+ * @throws WxErrorException
+ */
+ File jssdkMediaDownload(String mediaId) throws WxErrorException;
+
/**
*
* 上传图文消息内的图片获取URL
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
index e551f7d9..579ae346 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java
@@ -93,6 +93,16 @@ public interface WxMpMemberCardService {
*/
ActivatePluginParam getActivatePluginParam(String cardId, String outStr) throws WxErrorException;
+ /**
+ * 获取开卡组件链接接口
+ *
+ * @param cardId 会员卡的CardId,微信分配
+ * @param outStr 会员卡设置商户的渠道
+ * @return 会员卡开卡插件参数结果对象
+ * @throws WxErrorException 接口调用失败抛出的异常
+ */
+ String getActivatePluginUrl(String cardId, String outStr) throws WxErrorException;
+
/**
* 更新会员卡信息.
*
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
index 86351e5a..2571ebaa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
@@ -53,7 +53,6 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
* @author Daniel Qian
*/
public class WxMpMessageRouter {
-
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
protected final Logger log = LoggerFactory.getLogger(WxMpMessageRouter.class);
private final List rules = new ArrayList<>();
@@ -77,9 +76,7 @@ public class WxMpMessageRouter {
}
/**
- *
- * 使用自定义的 {@link ExecutorService}
- *
+ * 使用自定义的 {@link ExecutorService}.
*/
public WxMpMessageRouter(WxMpService wxMpService, ExecutorService executorService) {
this.wxMpService = wxMpService;
@@ -90,9 +87,7 @@ public class WxMpMessageRouter {
}
/**
- *
- * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法。
- *
+ * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法.
*/
public void shutDownExecutorService() {
this.executorService.shutdown();
@@ -230,23 +225,26 @@ public class WxMpMessageRouter {
}
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) {
- return this.route(wxMessage, new HashMap());
+ return this.route(wxMessage, new HashMap(2));
}
- protected boolean isMsgDuplicated(WxMpXmlMessage wxMessage) {
+ private boolean isMsgDuplicated(WxMpXmlMessage wxMessage) {
StringBuilder messageId = new StringBuilder();
if (wxMessage.getMsgId() == null) {
messageId.append(wxMessage.getCreateTime())
.append("-").append(wxMessage.getFromUser())
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()))
- .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()))
- ;
+ .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()));
} else {
messageId.append(wxMessage.getMsgId())
.append("-").append(wxMessage.getCreateTime())
.append("-").append(wxMessage.getFromUser());
}
+ if (StringUtils.isNotEmpty(wxMessage.getUserCardCode())) {
+ messageId.append("-").append(wxMessage.getUserCardCode());
+ }
+
return this.messageDuplicateChecker.isDuplicate(messageId.toString());
}
@@ -254,12 +252,10 @@ public class WxMpMessageRouter {
/**
* 对session的访问结束.
*/
- protected void sessionEndAccess(WxMpXmlMessage wxMessage) {
-
+ private void sessionEndAccess(WxMpXmlMessage wxMessage) {
InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUser());
if (session != null) {
session.endAccess();
}
-
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
index 1748b553..f7986d24 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpOcrService.java
@@ -1,8 +1,11 @@
package me.chanjar.weixin.mp.api;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
import java.io.File;
@@ -15,36 +18,114 @@ import java.io.File;
* @date 2019-06-22
*/
public interface WxMpOcrService {
- @AllArgsConstructor
- @Getter
- enum ImageType {
- /**
- * 拍照模型,带背景的图片.
- */
- PHOTO("photo"),
- /**
- * 扫描模式,不带背景的图片.
- */
- SCAN("scan");
-
- private String type;
- }
/**
* 身份证OCR识别接口.
*
- * @param imgType 图片类型
* @param imgUrl 图片url地址
+ * @return WxMpOcrIdCardResult
* @throws WxErrorException .
*/
- WxMpOcrIdCardResult idCard(ImageType imgType, String imgUrl) throws WxErrorException;
+ WxMpOcrIdCardResult idCard(String imgUrl) throws WxErrorException;
/**
* 身份证OCR识别接口.
*
- * @param imgType 图片类型
* @param imgFile 图片文件对象
+ * @return WxMpOcrIdCardResult
* @throws WxErrorException .
*/
- WxMpOcrIdCardResult idCard(ImageType imgType, File imgFile) throws WxErrorException;
+ WxMpOcrIdCardResult idCard(File imgFile) throws WxErrorException;
+
+ /**
+ * 银行卡OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgUrl 图片url地址
+ * @return WxMpOcrBankCardResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrBankCardResult bankCard(String imgUrl) throws WxErrorException;
+
+ /**
+ * 银行卡OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgFile 图片文件对象
+ * @return WxMpOcrBankCardResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrBankCardResult bankCard(File imgFile) throws WxErrorException;
+
+ /**
+ * 行驶证OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgUrl 图片url地址
+ * @return WxMpOcrDrivingResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrDrivingResult driving(String imgUrl) throws WxErrorException;
+
+ /**
+ * 行驶证OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgFile 图片文件对象
+ * @return WxMpOcrDrivingResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrDrivingResult driving(File imgFile) throws WxErrorException;
+
+ /**
+ * 驾驶证OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgUrl 图片url地址
+ * @return WxMpOcrDrivingLicenseResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrDrivingLicenseResult drivingLicense(String imgUrl) throws WxErrorException;
+
+ /**
+ * 驾驶证OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgFile 图片文件对象
+ * @return WxMpOcrDrivingLicenseResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrDrivingLicenseResult drivingLicense(File imgFile) throws WxErrorException;
+
+ /**
+ * 营业执照OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgUrl 图片url地址
+ * @return WxMpOcrBizLicenseResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrBizLicenseResult bizLicense(String imgUrl) throws WxErrorException;
+
+ /**
+ * 营业执照OCR识别接口
+ * 文件大小限制:小于2M
+ * @param imgFile 图片文件对象
+ * @return WxMpOcrBizLicenseResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrBizLicenseResult bizLicense(File imgFile) throws WxErrorException;
+
+ /**
+ * 通用印刷体OCR识别接口
+ * 文件大小限制:小于2M
+ * 适用于屏幕截图、印刷体照片等场景
+ * @param imgUrl 图片url地址
+ * @return WxMpOcrCommResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrCommResult comm(String imgUrl) throws WxErrorException;
+
+ /**
+ * 通用印刷体OCR识别接口
+ * 文件大小限制:小于2M
+ * 适用于屏幕截图、印刷体照片等场景
+ * @param imgFile 图片文件对象
+ * @return WxMpOcrCommResult
+ * @throws WxErrorException .
+ */
+ WxMpOcrCommResult comm(File imgFile) throws WxErrorException;
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index be8000d3..2d95b4f4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -1,6 +1,7 @@
package me.chanjar.weixin.mp.api;
import me.chanjar.weixin.common.bean.WxJsapiSignature;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestExecutor;
@@ -178,6 +179,19 @@ public interface WxMpService {
*/
String[] getCallbackIP() throws WxErrorException;
+ /**
+ *
+ * 网络检测
+ * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21541575776DtsuT
+ * 为了帮助开发者排查回调连接失败的问题,提供这个网络检测的API。它可以对开发者URL做域名解析,然后对所有IP进行一次ping操作,得到丢包率和耗时。
+ *
+ *
+ * @param action 执行的检测动作
+ * @param operator 指定平台从某个运营商进行检测
+ * @throws WxErrorException .
+ */
+ WxNetCheckResult netCheck(String action, String operator) throws WxErrorException;
+
/**
*
* 获取公众号的自动回复规则.
@@ -290,6 +304,8 @@ public interface WxMpService {
* 设置当微信系统响应系统繁忙时,最大重试次数.
* 默认:5次
*
+ *
+ * @param maxRetryTimes 最大重试次数
*/
void setMaxRetryTimes(int maxRetryTimes);
@@ -302,18 +318,21 @@ public interface WxMpService {
/**
* 设置 {@link WxMpConfigStorage} 的实现. 兼容老版本
+ *
+ * @param wxConfigProvider .
*/
void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider);
/**
- * {@link Map} 加入新的 {@link WxMpConfigStorage},适用于动态添加新的微信公众号配置
+ * Map里 加入新的 {@link WxMpConfigStorage},适用于动态添加新的微信公众号配置.
*
+ * @param mpId 公众号id
* @param configStorage 新的微信配置
*/
void addConfigStorage(String mpId, WxMpConfigStorage configStorage);
/**
- * 从{@link Map} 移除 {@link String mpId} 所对应的 {@link WxMpConfigStorage},适用于动态移除微信公众号配置
+ * 从 Map中 移除 {@link String mpId} 所对应的 {@link WxMpConfigStorage},适用于动态移除微信公众号配置.
*
* @param mpId 对应公众号的标识
*/
@@ -336,7 +355,7 @@ public interface WxMpService {
void setMultiConfigStorages(Map configStorages, String defaultMpId);
/**
- * 进行相应的公众号切换
+ * 进行相应的公众号切换.
*
* @param mpId 公众号标识
* @return 切换是否成功
@@ -344,7 +363,7 @@ public interface WxMpService {
boolean switchover(String mpId);
/**
- * 进行相应的公众号切换
+ * 进行相应的公众号切换.
*
* @param mpId 公众号标识
* @return 切换成功,则返回当前对象,方便链式调用,否则抛出异常
@@ -469,6 +488,8 @@ public interface WxMpService {
void initHttp();
/**
+ * 获取RequestHttp对象.
+ *
* @return RequestHttp对象
*/
RequestHttp getRequestHttp();
@@ -501,42 +522,145 @@ public interface WxMpService {
*/
WxMpOcrService getOcrService();
+ /**
+ * 返回图像处理接口的实现类对象,以方便调用其各个接口.
+ * @return WxMpImgProcService
+ */
+ WxMpImgProcService getImgProcService();
+
+ /**
+ * .
+ *
+ * @param kefuService .
+ */
void setKefuService(WxMpKefuService kefuService);
+ /**
+ * .
+ *
+ * @param materialService .
+ */
void setMaterialService(WxMpMaterialService materialService);
+ /**
+ * .
+ *
+ * @param menuService .
+ */
void setMenuService(WxMpMenuService menuService);
+ /**
+ * .
+ *
+ * @param userService .
+ */
void setUserService(WxMpUserService userService);
+ /**
+ * .
+ *
+ * @param tagService .
+ */
void setTagService(WxMpUserTagService tagService);
+ /**
+ * .
+ *
+ * @param qrCodeService .
+ */
void setQrCodeService(WxMpQrcodeService qrCodeService);
+ /**
+ * .
+ *
+ * @param cardService .
+ */
void setCardService(WxMpCardService cardService);
+ /**
+ * .
+ *
+ * @param storeService .
+ */
void setStoreService(WxMpStoreService storeService);
+ /**
+ * .
+ *
+ * @param dataCubeService .
+ */
void setDataCubeService(WxMpDataCubeService dataCubeService);
+ /**
+ * .
+ *
+ * @param blackListService .
+ */
void setBlackListService(WxMpUserBlacklistService blackListService);
+ /**
+ * .
+ *
+ * @param templateMsgService .
+ */
void setTemplateMsgService(WxMpTemplateMsgService templateMsgService);
+ /**
+ * .
+ *
+ * @param deviceService .
+ */
void setDeviceService(WxMpDeviceService deviceService);
+ /**
+ * .
+ *
+ * @param shakeService .
+ */
void setShakeService(WxMpShakeService shakeService);
+ /**
+ * .
+ *
+ * @param memberCardService .
+ */
void setMemberCardService(WxMpMemberCardService memberCardService);
+ /**
+ * .
+ *
+ * @param massMessageService .
+ */
void setMassMessageService(WxMpMassMessageService massMessageService);
+ /**
+ * .
+ *
+ * @param aiOpenService .
+ */
void setAiOpenService(WxMpAiOpenService aiOpenService);
+ /**
+ * .
+ *
+ * @param marketingService .
+ */
void setMarketingService(WxMpMarketingService marketingService);
+ /**
+ * .
+ *
+ * @param ocrService .
+ */
void setOcrService(WxMpOcrService ocrService);
+ /**
+ * .
+ *
+ * @param imgProcService .
+ */
+ void setImgProcService(WxMpImgProcService imgProcService);
+
/**
* 返回评论数据管理接口方法的实现类对象,以方便调用其各个接口.
*
@@ -544,5 +668,10 @@ public interface WxMpService {
*/
WxMpCommentService getCommentService();
+ /**
+ * .
+ *
+ * @param commentService .
+ */
void setCommentService(WxMpCommentService commentService);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
index 656840cb..24c6eded 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpTemplateMsgService.java
@@ -24,7 +24,9 @@ public interface WxMpTemplateMsgService {
* 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
*
*
+ * @param wxMpIndustry 行业信息
* @return 是否成功
+ * @throws WxErrorException .
*/
boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException;
@@ -35,6 +37,7 @@ public interface WxMpTemplateMsgService {
*
*
* @return wxMpIndustry
+ * @throws WxErrorException .
*/
WxMpTemplateIndustry getIndustry() throws WxErrorException;
@@ -44,7 +47,9 @@ public interface WxMpTemplateMsgService {
* 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN
*
*
+ * @param templateMessage 模板消息
* @return 消息Id
+ * @throws WxErrorException .
*/
String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException;
@@ -58,6 +63,7 @@ public interface WxMpTemplateMsgService {
*
* @param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
* @return templateId 模板Id
+ * @throws WxErrorException .
*/
String addTemplate(String shortTemplateId) throws WxErrorException;
@@ -70,6 +76,7 @@ public interface WxMpTemplateMsgService {
*
*
* @return templateId 模板Id
+ * @throws WxErrorException .
*/
List
+ * 查询群发消息发送状态【订阅号与服务号认证后均可用】
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%8F%91%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E7%8A%B6%E6%80%81%E3%80%90%E8%AE%A2%E9%98%85%E5%8F%B7%E4%B8%8E%E6%9C%8D%E5%8A%A1%E5%8F%B7%E8%AE%A4%E8%AF%81%E5%90%8E%E5%9D%87%E5%8F%AF%E7%94%A8%E3%80%91
+ */
+@Data
+public class WxMpMassGetResult extends WxMpResult implements Serializable {
+
+ private static final long serialVersionUID = -2909694117357278557L;
+
+ @SerializedName("msg_id")
+ private Long msgId;
+
+ @SerializedName("msg_status")
+ private String msgstatus;
+
+ public static WxMpMassGetResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpMassGetResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java
new file mode 100644
index 00000000..ef53b5be
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpMassSpeedGetResult.java
@@ -0,0 +1,38 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 获取群发速度
+ * https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html#9
+ * speed realspeed
+ * 0 80w/分钟
+ * 1 60w/分钟
+ * 2 45w/分钟
+ * 3 30w/分钟
+ * 4 10w/分钟
+ *
+ */
+@Data
+public class WxMpMassSpeedGetResult implements Serializable {
+
+ private static final long serialVersionUID = -6478157575168068334L;
+
+ private Integer speed;
+
+ private Integer realspeed;
+
+ public static WxMpMassSpeedGetResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, WxMpMassSpeedGetResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java
new file mode 100644
index 00000000..9be4b7e8
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/result/WxMpResult.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean.result;
+
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 基础的微信公众号平台请求结果.
+ */
+@Data
+public class WxMpResult implements Serializable {
+ private static final long serialVersionUID = 2101652152604850904L;
+ protected String errcode;
+ protected String errmsg;
+
+ /**
+ * 请求是否成功.
+ */
+ public boolean isSuccess() {
+ return StringUtils.equalsIgnoreCase(errcode, "0");
+ }
+
+ public static WxMpResult fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
index 4507cacb..adab3785 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustry.java
@@ -1,28 +1,26 @@
package me.chanjar.weixin.mp.bean.template;
-import java.io.Serializable;
-
+import lombok.AllArgsConstructor;
import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import java.io.Serializable;
+
/**
* @author miller
*/
@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
public class WxMpTemplateIndustry implements Serializable {
private static final long serialVersionUID = -7700398224795914722L;
- private Industry primaryIndustry;
- private Industry secondIndustry;
-
- public WxMpTemplateIndustry() {
- }
-
- public WxMpTemplateIndustry(Industry primaryIndustry, Industry secondIndustry) {
- this.primaryIndustry = primaryIndustry;
- this.secondIndustry = secondIndustry;
- }
+ private WxMpTemplateIndustryEnum primaryIndustry;
+ private WxMpTemplateIndustryEnum secondIndustry;
public static WxMpTemplateIndustry fromJson(String json) {
return WxMpGsonBuilder.create().fromJson(json, WxMpTemplateIndustry.class);
@@ -41,29 +39,22 @@ public class WxMpTemplateIndustry implements Serializable {
* 官方文档中,创建和获取的数据结构不一样。所以采用冗余字段的方式,实现相应的接口.
*/
@Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @Accessors(chain = true)
public static class Industry implements Serializable {
private static final long serialVersionUID = -1707184885588012142L;
private String id;
private String firstClass;
private String secondClass;
- public Industry() {
- }
-
public Industry(String id) {
this.id = id;
}
- public Industry(String id, String firstClass, String secondClass) {
- this.id = id;
- this.firstClass = firstClass;
- this.secondClass = secondClass;
- }
-
@Override
public String toString() {
return WxMpGsonBuilder.create().toJson(this);
}
-
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java
new file mode 100644
index 00000000..8a0a9137
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/template/WxMpTemplateIndustryEnum.java
@@ -0,0 +1,224 @@
+package me.chanjar.weixin.mp.bean.template;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 模版消息行业枚举.
+ *
+ * @author Binary Wang
+ * @date 2019-10-18
+ */
+@Getter
+@AllArgsConstructor
+public enum WxMpTemplateIndustryEnum {
+ /**
+ * IT科技 - 互联网|电子商务
+ */
+ E_COMMERCE("IT科技", "互联网|电子商务", 1),
+ /**
+ * IT科技 - IT软件与服务
+ */
+ IT_SOFTWARE_AND_SERVICES("IT科技", "IT软件与服务", 2),
+ /**
+ * IT科技 - IT硬件与设备
+ */
+ IT_HARDWARE_AND_EQUIPMENT("IT科技", "IT硬件与设备", 3),
+ /**
+ * IT科技 - 电子技术
+ */
+ ELECTRONIC_TECHNIQUE("IT科技", "电子技术", 4),
+ /**
+ * IT科技 - 通信与运营商
+ */
+ COMMUNICATION_AND_OPERATOR("IT科技", "通信与运营商", 5),
+ /**
+ * IT科技 - 网络游戏
+ */
+ ONLINE_GAME("IT科技", "网络游戏", 6),
+ /**
+ * 金融业 - 银行
+ */
+ BANK("金融业", "银行", 7),
+ /**
+ * 金融业 - 基金|理财|信托
+ */
+ FUND("金融业", "基金|理财|信托", 8),
+ /**
+ * 金融业 - 保险
+ */
+ INSURANCE("金融业", "保险", 9),
+ /**
+ * 餐饮 - 餐饮
+ */
+ REPAST("餐饮", "餐饮", 10),
+ /**
+ * 酒店旅游 - 酒店
+ */
+ HOTEL("酒店旅游", "酒店", 11),
+ /**
+ * 酒店旅游 - 旅游
+ */
+ TRAVEL("酒店旅游", "旅游", 12),
+ /**
+ * 运输与仓储 - 快递
+ */
+ EXPRESS("运输与仓储", "快递", 13),
+ /**
+ * 运输与仓储 - 物流
+ */
+ LOGISTICS("运输与仓储", "物流", 14),
+ /**
+ * 运输与仓储 - 仓储
+ */
+ STORAGE("运输与仓储", "仓储", 15),
+ /**
+ * 教育 - 培训
+ */
+ CULTIVATE("教育", "培训", 16),
+ /**
+ * 教育 - 院校
+ */
+ ACADEMY("教育", "院校", 17),
+ /**
+ * 政府与公共事业 - 学术科研
+ */
+ ACADEMIC_RESEARCH("政府与公共事业", "学术科研", 18),
+ /**
+ * 政府与公共事业 - 交警
+ */
+ TRAFFIC_POLICE("政府与公共事业", "交警", 19),
+ /**
+ * 政府与公共事业 - 博物馆
+ */
+ MUSEUM("政府与公共事业", "博物馆", 20),
+ /**
+ * 政府与公共事业 - 公共事业|非盈利机构
+ */
+ PUBLIC_WORKS_NONPROFIT("政府与公共事业", "公共事业|非盈利机构", 21),
+ /**
+ * 医药护理 - 医药医疗
+ */
+ MEDICAL_HEALTH("医药护理", "医药医疗", 22),
+ /**
+ * 医药护理 - 护理美容
+ */
+ CARE_AND_BEAUTY("医药护理", "护理美容", 23),
+ /**
+ * 医药护理 - 保健与卫生
+ */
+ HEALTH_AND_HYGIENE("医药护理", "保健与卫生", 24),
+ /**
+ * 交通工具 - 汽车相关
+ */
+ AUTOMOTIVE_RELATED("交通工具", "汽车相关", 25),
+ /**
+ * 交通工具 - 摩托车相关
+ */
+ MOTORCYCLE_CORRELATION("交通工具", "摩托车相关", 26),
+ /**
+ * 交通工具 - 火车相关
+ */
+ THE_TRAIN_RELATED("交通工具", "火车相关", 27),
+ /**
+ * 交通工具 - 飞机相关
+ */
+ THE_PLANE_RELATED("交通工具", "飞机相关", 28),
+ /**
+ * 房地产 - 建筑
+ */
+ ARCHITECTURE("房地产", "建筑", 29),
+ /**
+ * 房地产 - 物业
+ */
+ REAL_ESTATE("房地产", "物业", 30),
+ /**
+ * 消费品 - 消费品
+ */
+ CONSUMER_GOODS("消费品", "消费品", 31),
+ /**
+ * 商业服务 - 法律
+ */
+ LEGISLATION("商业服务", "法律", 32),
+ /**
+ * 商业服务 - 会展
+ */
+ CONVENTION_AND_EXHIBITION("商业服务", "会展", 33),
+ /**
+ * 商业服务 - 中介服务
+ */
+ INTERMEDIARY_SERVICES("商业服务", "中介服务", 34),
+ /**
+ * 商业服务 - 认证
+ */
+ AUTHENTICATION("商业服务", "认证", 35),
+ /**
+ * 商业服务 - 会计|审计
+ */
+ AUDIT("商业服务", "会计|审计", 36),
+ /**
+ * 文体娱乐 - 传媒
+ */
+ MASS_MEDIA("文体娱乐", "传媒", 37),
+ /**
+ * 文体娱乐 - 体育
+ */
+ SPORTS("文体娱乐", "体育", 38),
+ /**
+ * 文体娱乐 - 娱乐休闲
+ */
+ LEISURE_AND_ENTERTAINMENT("文体娱乐", "娱乐休闲", 39),
+ /**
+ * 印刷 - 印刷
+ */
+ PRINTING("印刷", "印刷", 40),
+ /**
+ * 其它 - 其它
+ */
+ OTHER("其它", "其它", 41);
+
+ /**
+ * 主行业(一级行业)
+ */
+ public final String firstClass;
+ /**
+ * 副行业(二级行业)
+ */
+ public final String secondClass;
+ /**
+ * 行业代码
+ */
+ public final Integer code;
+
+ /**
+ * 查找行业
+ *
+ * @param industry 二级行业名称
+ * @return .
+ */
+ public static WxMpTemplateIndustryEnum findBySecondary(String industry) {
+ for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) {
+ if (industryEnum.secondClass.equals(industry)) {
+ return industryEnum;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * 查找行业
+ *
+ * @param code 行业编码
+ * @return .
+ */
+ public static WxMpTemplateIndustryEnum findByCode(int code) {
+ for (WxMpTemplateIndustryEnum industryEnum : WxMpTemplateIndustryEnum.values()) {
+ if (industryEnum.code == code) {
+ return industryEnum;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java
new file mode 100644
index 00000000..46cc43f8
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxCardType.java
@@ -0,0 +1,26 @@
+package me.chanjar.weixin.mp.enums;
+
+/**
+ * 微信卡券类型.
+ *
+ * @author chenyixin
+ * @date 2019-09-07 23:33
+ **/
+public enum WxCardType {
+ MEMBER_CARD("MEMBER_CARD"),
+ GROUPON("GROUPON"),
+ CASH("CASH"),
+ DISCOUNT("DISCOUNT"),
+ GIFT("GIFT"),
+ GENERAL_COUPON("GENERAL_COUPON");
+
+ private String code;
+
+ WxCardType(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 77124c68..5963af92 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -110,6 +110,10 @@ public interface WxMpApiUrl {
* 获取微信服务器IP地址.
*/
GET_CALLBACK_IP_URL(API_DEFAULT_HOST_URL, "/cgi-bin/getcallbackip"),
+ /**
+ * 网络检测.
+ */
+ NETCHECK_URL(API_DEFAULT_HOST_URL, "/cgi-bin/callback/check"),
/**
* 第三方使用网站应用授权登录的url.
*/
@@ -436,7 +440,58 @@ public interface WxMpApiUrl {
/**
* 身份证识别.
*/
- IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?type=%s&img_url=%s");
+ IDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard?img_url=%s"),
+
+ FILEIDCARD(API_DEFAULT_HOST_URL, "/cv/ocr/idcard"),
+
+ /**
+ * 银行卡OCR识别
+ */
+ BANK_CARD(API_DEFAULT_HOST_URL, "/cv/ocr/bankcard?img_url=%s"),
+
+ /**
+ * 银行卡OCR识别(文件)
+ */
+ FILE_BANK_CARD(API_DEFAULT_HOST_URL, "/cv/ocr/bankcard"),
+
+ /**
+ * 行驶证OCR识别
+ */
+ DRIVING(API_DEFAULT_HOST_URL, "/cv/ocr/driving?img_url=%s"),
+ /**
+ * 行驶证OCR识别(文件)
+ */
+ FILE_DRIVING(API_DEFAULT_HOST_URL, "/cv/ocr/driving"),
+
+ /**
+ * 驾驶证OCR识别
+ */
+ DRIVING_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/drivinglicense?img_url=%s"),
+
+ /**
+ * 驾驶证OCR识别(文件)
+ */
+ FILE_DRIVING_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/drivinglicense"),
+
+ /**
+ * 营业执照OCR识别
+ */
+ BIZ_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/bizlicense?img_url=%s"),
+
+ /**
+ * 营业执照OCR识别(文件)
+ */
+ FILE_BIZ_LICENSE(API_DEFAULT_HOST_URL, "/cv/ocr/bizlicense"),
+
+ /**
+ * 通用印刷体OCR识别
+ */
+ COMM(API_DEFAULT_HOST_URL, "/cv/ocr/comm?img_url=%s"),
+
+ /**
+ * 通用印刷体OCR识别(文件)
+ */
+ FILE_COMM(API_DEFAULT_HOST_URL, "/cv/ocr/comm");
private String prefix;
private String path;
@@ -500,7 +555,48 @@ public interface WxMpApiUrl {
/**
* 卡券删除.
*/
- CARD_DELETE(API_DEFAULT_HOST_URL, "/card/delete");
+ CARD_DELETE(API_DEFAULT_HOST_URL, "/card/delete"),
+
+ /**
+ * 导入code接口.
+ */
+ CARD_CODE_DEPOSIT(API_DEFAULT_HOST_URL, "/card/code/deposit"),
+
+ /**
+ * 查询导入code数目接口
+ */
+ CARD_CODE_DEPOSIT_COUNT(API_DEFAULT_HOST_URL, "/card/code/getdepositcount"),
+
+ /**
+ * 核查code接口
+ */
+ CARD_CODE_CHECKCODE(API_DEFAULT_HOST_URL, "/card/code/checkcode"),
+
+ /**
+ * 图文消息群发卡券
+ */
+ CARD_MPNEWS_GETHTML(API_DEFAULT_HOST_URL, "/card/mpnews/gethtml"),
+
+ /**
+ * 修改库存接口
+ */
+ CARD_MODIFY_STOCK(API_DEFAULT_HOST_URL, "/card/modifystock"),
+
+ /**
+ * 更改Code接口
+ */
+ CARD_CODE_UPDATE(API_DEFAULT_HOST_URL, "/card/code/update"),
+
+ /**
+ * 设置买单接口
+ */
+ CARD_PAYCELL_SET(API_DEFAULT_HOST_URL, "/card/paycell/set"),
+
+ /**
+ * 设置自助核销接口
+ */
+ CARD_SELF_CONSUME_CELL_SET(API_DEFAULT_HOST_URL, "/card/selfconsumecell/set"),
+ ;
private String prefix;
private String path;
@@ -688,7 +784,25 @@ public interface WxMpApiUrl {
/**
* 删除群发接口.
*/
- MESSAGE_MASS_DELETE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/delete");
+ MESSAGE_MASS_DELETE_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/delete"),
+
+
+ /**
+ * 获取群发速度.
+ */
+ MESSAGE_MASS_SPEED_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/speed/get"),
+
+
+ /**
+ * 设置群发速度.
+ */
+ MESSAGE_MASS_SPEED_SET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/speed/set"),
+
+
+ /**
+ * 查询群发消息发送状态【订阅号与服务号认证后均可用】
+ */
+ MESSAGE_MASS_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/message/mass/get");
private String prefix;
private String path;
@@ -705,6 +819,10 @@ public interface WxMpApiUrl {
* get.
*/
MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get"),
+ /**
+ * jssdk media get.
+ */
+ JSSDK_MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get/jssdk"),
/**
* upload.
*/
@@ -869,7 +987,17 @@ public interface WxMpApiUrl {
/**
* 打开已群发文章评论.
*/
- OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open");
+ OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open"),
+
+ /**
+ * 关闭已群发文章评论.
+ */
+ CLOSE(API_DEFAULT_HOST_URL, "/cgi-bin/comment/close"),
+
+ /**
+ * 查看指定文章的评论数据.
+ */
+ LIST(API_DEFAULT_HOST_URL, "/cgi-bin/comment/list");
private String prefix;
private String path;
@@ -879,4 +1007,49 @@ public interface WxMpApiUrl {
return buildUrl(config.getHostConfig(), prefix, path);
}
}
+
+ @AllArgsConstructor
+ enum ImgProc implements WxMpApiUrl {
+ /**
+ * 二维码/条码识别
+ */
+ QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode?img_url=%s"),
+
+ /**
+ * 二维码/条码识别(文件)
+ */
+ FILE_QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode"),
+
+ /**
+ * 图片高清化
+ */
+ SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution?img_url=%s"),
+
+ /**
+ * 图片高清化(文件)
+ */
+ FILE_SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution"),
+
+ /**
+ * 图片智能裁剪
+ */
+ AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?img_url=%s&ratios=%s"),
+
+ /**
+ * 图片智能裁剪(文件)
+ */
+ FILE_AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?ratios=%s");
+
+ private String prefix;
+ private String path;
+
+ @Override
+ public String getUrl(WxMpConfigStorage config) {
+ if (null == config) {
+ return buildUrl(null, prefix, path);
+ }
+ return buildUrl(config.getHostConfig(), prefix, path);
+ }
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
index eb0972bc..0c457195 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/json/WxMpIndustryGsonAdapter.java
@@ -3,41 +3,32 @@ package me.chanjar.weixin.mp.util.json;
import com.google.gson.*;
import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
+import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustryEnum;
import java.lang.reflect.Type;
/**
* @author miller
*/
-public class WxMpIndustryGsonAdapter
- implements JsonSerializer, JsonDeserializer {
- private static WxMpTemplateIndustry.Industry convertFromJson(JsonObject json) {
- WxMpTemplateIndustry.Industry industry = new WxMpTemplateIndustry.Industry();
- industry.setFirstClass(GsonHelper.getString(json, "first_class"));
- industry.setSecondClass(GsonHelper.getString(json, "second_class"));
- return industry;
- }
-
+public class WxMpIndustryGsonAdapter implements JsonSerializer, JsonDeserializer {
@Override
- public JsonElement serialize(WxMpTemplateIndustry wxMpIndustry, Type type,
- JsonSerializationContext jsonSerializationContext) {
+ public JsonElement serialize(WxMpTemplateIndustry wxMpIndustry, Type type, JsonSerializationContext context) {
JsonObject json = new JsonObject();
- json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getId());
- json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getId());
+ json.addProperty("industry_id1", wxMpIndustry.getPrimaryIndustry().getCode());
+ json.addProperty("industry_id2", wxMpIndustry.getSecondIndustry().getCode());
return json;
}
@Override
- public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type,
- JsonDeserializationContext jsonDeserializationContext)
+ public WxMpTemplateIndustry deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context)
throws JsonParseException {
- WxMpTemplateIndustry wxMpIndustry = new WxMpTemplateIndustry();
- JsonObject primaryIndustry = jsonElement.getAsJsonObject()
- .get("primary_industry").getAsJsonObject();
- wxMpIndustry.setPrimaryIndustry(convertFromJson(primaryIndustry));
- JsonObject secondaryIndustry = jsonElement.getAsJsonObject()
- .get("secondary_industry").getAsJsonObject();
- wxMpIndustry.setSecondIndustry(convertFromJson(secondaryIndustry));
- return wxMpIndustry;
+ return new WxMpTemplateIndustry()
+ .setPrimaryIndustry(this.convertFromJson(jsonElement.getAsJsonObject().get("primary_industry").getAsJsonObject()))
+ .setSecondIndustry(this.convertFromJson(jsonElement.getAsJsonObject().get("secondary_industry").getAsJsonObject()));
}
+
+ private WxMpTemplateIndustryEnum convertFromJson(JsonObject json) {
+ return WxMpTemplateIndustryEnum.findBySecondary(GsonHelper.getString(json, "second_class"));
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
index b6409325..8274d400 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteApacheHttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MaterialDeleteApacheHttpRequestExecutor extends MaterialDeleteReque
}
@Override
- public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+ public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
index f1ffdd6b..df6ecfb5 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteJoddHttpRequestExecutor.java
@@ -22,7 +22,7 @@ public class MaterialDeleteJoddHttpRequestExecutor extends MaterialDeleteRequest
}
@Override
- public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+ public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
index 2e4a37ec..15064413 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteOkhttpRequestExecutor.java
@@ -1,24 +1,24 @@
package me.chanjar.weixin.mp.util.requestexecuter.material;
-import java.io.IOException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.ResponseHandler;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
-import okhttp3.FormBody;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import okhttp3.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
*/
public class MaterialDeleteOkhttpRequestExecutor extends MaterialDeleteRequestExecutor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -28,25 +28,25 @@ public class MaterialDeleteOkhttpRequestExecutor extends MaterialDeleteRequestEx
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType)
+ throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
@Override
- public Boolean execute(String uri, String materialId) throws WxErrorException, IOException {
+ public Boolean execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
logger.debug("MaterialDeleteOkhttpRequestExecutor is running");
- //得到httpClient
- OkHttpClient client = requestHttp.getRequestHttpClient();
- RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build();
+ RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
+ WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
Request request = new Request.Builder().url(uri).post(requestBody).build();
- Response response = client.newCall(request).execute();
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
String responseContent = response.body().string();
WxError error = WxError.fromJson(responseContent, WxType.MP);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
- } else {
- return true;
}
+
+ return true;
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
index b1fd2ca9..7a2deb6c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialDeleteRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -15,8 +16,8 @@ public abstract class MaterialDeleteRequestExecutor implements RequestExec
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
index aa717c0a..239dc232 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoApacheHttpRequestExecutor.java
@@ -35,7 +35,7 @@ public class MaterialNewsInfoApacheHttpRequestExecutor
}
@Override
- public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
+ public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
index d91e2afc..6f30d022 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoJoddHttpRequestExecutor.java
@@ -29,7 +29,7 @@ public class MaterialNewsInfoJoddHttpRequestExecutor extends MaterialNewsInfoReq
}
@Override
- public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
+ public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
index 5883a058..9a0b2c68 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoOkhttpRequestExecutor.java
@@ -1,6 +1,7 @@
package me.chanjar.weixin.mp.util.requestexecuter.material;
import com.google.common.collect.ImmutableMap;
+import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
@@ -10,33 +11,30 @@ import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialNews;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import okhttp3.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
- * Created by ecoolper on 2017/5/5.
+ * .
+ *
+ * @author ecoolper
+ * @date 2017/5/5
*/
+@Slf4j
public class MaterialNewsInfoOkhttpRequestExecutor extends MaterialNewsInfoRequestExecutor {
- private final Logger logger = LoggerFactory.getLogger(this.getClass());
public MaterialNewsInfoOkhttpRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}
@Override
- public WxMpMaterialNews execute(String uri, String materialId) throws WxErrorException, IOException {
-
- //得到httpClient
- OkHttpClient client = requestHttp.getRequestHttpClient();
-
+ public WxMpMaterialNews execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
Request request = new Request.Builder().url(uri).post(requestBody).build();
- Response response = client.newCall(request).execute();
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
String responseContent = response.body().string();
- this.logger.debug("响应原始数据:{}", responseContent);
+ log.debug("响应原始数据:{}", responseContent);
WxError error = WxError.fromJson(responseContent, WxType.MP);
if (error.getErrorCode() != 0) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
index a636ed26..3dfa2af6 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialNewsInfoRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -16,8 +17,8 @@ public abstract class MaterialNewsInfoRequestExecutor implements RequestEx
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
index d2e1029f..c63301a4 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadApacheHttpRequestExecutor.java
@@ -33,7 +33,7 @@ public class MaterialUploadApacheHttpRequestExecutor extends MaterialUploadReque
}
@Override
- public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+ public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig response = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
index a09788a8..dc838146 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadJoddHttpRequestExecutor.java
@@ -28,7 +28,7 @@ public class MaterialUploadJoddHttpRequestExecutor extends MaterialUploadRequest
}
@Override
- public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+ public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
index 879df496..9f034def 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadOkhttpRequestExecutor.java
@@ -28,7 +28,7 @@ public class MaterialUploadOkhttpRequestExecutor extends MaterialUploadRequestEx
}
@Override
- public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material) throws WxErrorException, IOException {
+ public WxMpMaterialUploadResult execute(String uri, WxMpMaterial material, WxType wxType) throws WxErrorException, IOException {
logger.debug("MaterialUploadOkhttpRequestExecutor is running");
if (material == null) {
throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("非法请求,material参数为空").build());
@@ -38,8 +38,6 @@ public class MaterialUploadOkhttpRequestExecutor extends MaterialUploadRequestEx
throw new FileNotFoundException();
}
- //得到httpClient
-
OkHttpClient client = requestHttp.getRequestHttpClient();
MultipartBody.Builder bodyBuilder = new MultipartBody.Builder()
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
index 4e518669..92c6effa 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialUploadRequestExecutor.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -20,8 +21,8 @@ public abstract class MaterialUploadRequestExecutor implements RequestExec
}
@Override
- public void execute(String uri, WxMpMaterial data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, WxMpMaterial data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
index 65af9cf7..13f33bde 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoApacheHttpRequestExecutor.java
@@ -27,7 +27,7 @@ public class MaterialVideoInfoApacheHttpRequestExecutor extends MaterialVideoInf
}
@Override
- public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+ public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
index 852bea5d..08a07f34 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoJoddHttpRequestExecutor.java
@@ -23,7 +23,7 @@ public class MaterialVideoInfoJoddHttpRequestExecutor extends MaterialVideoInfoR
}
@Override
- public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+ public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
index 118c9673..b626fe93 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoOkhttpRequestExecutor.java
@@ -1,10 +1,12 @@
package me.chanjar.weixin.mp.util.requestexecuter.material;
+import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.bean.material.WxMpMaterialVideoInfoResult;
import okhttp3.*;
import org.slf4j.Logger;
@@ -23,14 +25,13 @@ public class MaterialVideoInfoOkhttpRequestExecutor extends MaterialVideoInfoReq
}
@Override
- public WxMpMaterialVideoInfoResult execute(String uri, String materialId) throws WxErrorException, IOException {
+ public WxMpMaterialVideoInfoResult execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
logger.debug("MaterialVideoInfoOkhttpRequestExecutor is running");
- //得到httpClient
- OkHttpClient client = requestHttp.getRequestHttpClient();
- RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build();
+ RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
+ WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
Request request = new Request.Builder().url(uri).post(requestBody).build();
- Response response = client.newCall(request).execute();
+ Response response = requestHttp.getRequestHttpClient().newCall(request).execute();
String responseContent = response.body().string();
WxError error = WxError.fromJson(responseContent, WxType.MP);
if (error.getErrorCode() != 0) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
index ee057592..bf4c41cd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVideoInfoRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.material;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -17,8 +18,8 @@ public abstract class MaterialVideoInfoRequestExecutor implements RequestE
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
index cb295d06..cecfdec8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadApacheHttpRequestExecutor.java
@@ -1,5 +1,6 @@
package me.chanjar.weixin.mp.util.requestexecuter.material;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -30,7 +31,7 @@ public class MaterialVoiceAndImageDownloadApacheHttpRequestExecutor extends Mate
}
@Override
- public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+ public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
index 391befbb..2a86b369 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadJoddHttpRequestExecutor.java
@@ -6,6 +6,7 @@ import jodd.http.HttpResponse;
import jodd.http.ProxyInfo;
import jodd.util.StringPool;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -27,7 +28,7 @@ public class MaterialVoiceAndImageDownloadJoddHttpRequestExecutor extends Materi
}
@Override
- public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+ public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
HttpRequest request = HttpRequest.post(uri);
if (requestHttp.getRequestHttpProxy() != null) {
requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
index 8952d173..39869b6c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadOkhttpRequestExecutor.java
@@ -1,10 +1,12 @@
package me.chanjar.weixin.mp.util.requestexecuter.material;
+import com.google.common.collect.ImmutableMap;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.okhttp.OkHttpProxyInfo;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import okhttp3.*;
import okio.BufferedSink;
import okio.Okio;
@@ -24,10 +26,12 @@ public class MaterialVoiceAndImageDownloadOkhttpRequestExecutor extends Material
}
@Override
- public InputStream execute(String uri, String materialId) throws WxErrorException, IOException {
+ public InputStream execute(String uri, String materialId, WxType wxType) throws WxErrorException, IOException {
logger.debug("MaterialVoiceAndImageDownloadOkhttpRequestExecutor is running");
OkHttpClient client = requestHttp.getRequestHttpClient();
- RequestBody requestBody = new FormBody.Builder().add("media_id", materialId).build();
+
+ RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
+ WxGsonBuilder.create().toJson(ImmutableMap.of("media_id", materialId)));
Request request = new Request.Builder().url(uri).get().post(requestBody).build();
Response response = client.newCall(request).execute();
String contentTypeHeader = response.header("Content-Type");
@@ -35,6 +39,7 @@ public class MaterialVoiceAndImageDownloadOkhttpRequestExecutor extends Material
String responseContent = response.body().string();
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MP));
}
+
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); BufferedSink sink = Okio.buffer(Okio.sink(outputStream))) {
sink.writeAll(response.body().source());
return new ByteArrayInputStream(outputStream.toByteArray());
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
index c00ac148..4a27602d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/material/MaterialVoiceAndImageDownloadRequestExecutor.java
@@ -4,6 +4,7 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -19,8 +20,8 @@ public abstract class MaterialVoiceAndImageDownloadRequestExecutor impleme
}
@Override
- public void execute(String uri, String data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, String data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp, File tmpDirFile) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
index dc6d9792..4176bad1 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadApacheHttpRequestExecutor.java
@@ -30,7 +30,7 @@ public class MediaImgUploadApacheHttpRequestExecutor extends MediaImgUploadReque
}
@Override
- public WxMediaImgUploadResult execute(String uri, File data) throws WxErrorException, IOException {
+ public WxMediaImgUploadResult execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
if (data == null) {
throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
index c7ff37ba..6fad6d46 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadHttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MediaImgUploadHttpRequestExecutor extends MediaImgUploadRequestExec
}
@Override
- public WxMediaImgUploadResult execute(String uri, File data) throws WxErrorException, IOException {
+ public WxMediaImgUploadResult execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
if (data == null) {
throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
index c787126e..78bb14f3 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadOkhttpRequestExecutor.java
@@ -26,7 +26,7 @@ public class MediaImgUploadOkhttpRequestExecutor extends MediaImgUploadRequestEx
}
@Override
- public WxMediaImgUploadResult execute(String uri, File file) throws WxErrorException, IOException {
+ public WxMediaImgUploadResult execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
logger.debug("MediaImgUploadOkhttpRequestExecutor is running");
//得到httpClient
OkHttpClient client = requestHttp.getRequestHttpClient();
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
index 18678f87..bbb2871e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/media/MediaImgUploadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.media;
import java.io.File;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -20,8 +21,8 @@ public abstract class MediaImgUploadRequestExecutor implements RequestExec
}
@Override
- public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
new file mode 100644
index 00000000..033126d5
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernApacheHttpRequestExecutor.java
@@ -0,0 +1,57 @@
+package me.chanjar.weixin.mp.util.requestexecuter.ocr;
+
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * .
+ *
+ * @author : zhayueran
+ * @date 2019/6/27 14:06
+ */
+public class OcrDiscernApacheHttpRequestExecutor extends OcrDiscernRequestExecutor {
+ public OcrDiscernApacheHttpRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ @Override
+ public String execute(String uri, File file, WxType wxType) throws WxErrorException, IOException {
+ HttpPost httpPost = new HttpPost(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
+ httpPost.setConfig(config);
+ }
+ if (file != null) {
+ HttpEntity entity = MultipartEntityBuilder
+ .create()
+ .addBinaryBody("file", file)
+ .setMode(HttpMultipartMode.RFC6532)
+ .build();
+ httpPost.setEntity(entity);
+ }
+ try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
+ String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
+ WxError error = WxError.fromJson(responseContent, wxType);
+ if (error.getErrorCode() != 0) {
+ throw new WxErrorException(error);
+ }
+ return responseContent;
+ } finally {
+ httpPost.releaseConnection();
+ }
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
new file mode 100644
index 00000000..536097e4
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/ocr/OcrDiscernRequestExecutor.java
@@ -0,0 +1,38 @@
+package me.chanjar.weixin.mp.util.requestexecuter.ocr;
+
+import me.chanjar.weixin.common.WxType;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.ResponseHandler;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * .
+ *
+ * @author zhayueran
+ * @date 2019/6/27 15:06
+ */
+public abstract class OcrDiscernRequestExecutor implements RequestExecutor {
+ protected RequestHttp requestHttp;
+
+ public OcrDiscernRequestExecutor(RequestHttp requestHttp) {
+ this.requestHttp = requestHttp;
+ }
+
+ @Override
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
+ }
+
+ public static RequestExecutor create(RequestHttp requestHttp) {
+ switch (requestHttp.getRequestType()) {
+ case APACHE_HTTP:
+ return new OcrDiscernApacheHttpRequestExecutor(requestHttp);
+ default:
+ return null;
+ }
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
index 6280be7a..8244761e 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/qrcode/QrCodeApacheHttpRequestExecutor.java
@@ -31,7 +31,7 @@ public class QrCodeApacheHttpRequestExecutor extends QrCodeRequestExecutor implements RequestExecutor handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, WxMpQrCodeTicket data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) throws WxErrorException {
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
index c23b3a32..c507d5fd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadApacheHttpRequestExecutor.java
@@ -31,7 +31,7 @@ public class VoiceUploadApacheHttpRequestExecutor extends VoiceUploadRequestExec
}
@Override
- public Boolean execute(String uri, File data) throws WxErrorException, IOException {
+ public Boolean execute(String uri, File data, WxType wxType) throws WxErrorException, IOException {
if (data == null) {
throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
index 32bab9f6..a2be94cd 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/requestexecuter/voice/VoiceUploadRequestExecutor.java
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.util.requestexecuter.voice;
import java.io.File;
import java.io.IOException;
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
@@ -23,8 +24,8 @@ public abstract class VoiceUploadRequestExecutor implements RequestExecuto
}
@Override
- public void execute(String uri, File data, ResponseHandler handler) throws WxErrorException, IOException {
- handler.handle(this.execute(uri, data));
+ public void execute(String uri, File data, ResponseHandler handler, WxType wxType) throws WxErrorException, IOException {
+ handler.handle(this.execute(uri, data, wxType));
}
public static RequestExecutor create(RequestHttp requestHttp) {
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
deleted file mode 100644
index d8ed016b..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMiscAPITest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.test.ApiTestModule;
-import org.testng.*;
-import org.testng.annotations.*;
-
-import java.util.Arrays;
-
-/**
- * @author chanjarster
- */
-@Test(groups = "miscAPI")
-@Guice(modules = ApiTestModule.class)
-public class WxMpMiscAPITest {
-
- @Inject
- protected WxMpService wxService;
-
- @Test
- public void testGetCallbackIP() throws WxErrorException {
- String[] ipArray = this.wxService.getCallbackIP();
- System.out.println(Arrays.toString(ipArray));
- Assert.assertNotNull(ipArray);
- Assert.assertNotEquals(ipArray.length, 0);
- }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
deleted file mode 100644
index ec6e75d7..00000000
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpShortUrlAPITest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package me.chanjar.weixin.mp.api;
-
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.test.ApiTestModule;
-import org.testng.*;
-import org.testng.annotations.*;
-
-/**
- * 测试短连接
- *
- * @author chanjarster
- */
-@Test(groups = "shortURLAPI")
-@Guice(modules = ApiTestModule.class)
-public class WxMpShortUrlAPITest {
-
- @Inject
- protected WxMpService wxService;
-
- public void testShortUrl() throws WxErrorException {
- String shortUrl = this.wxService.shortUrl("www.baidu.com");
- Assert.assertNotNull(shortUrl);
- }
-
-}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
index ff0d7537..e0b2471b 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java
@@ -1,14 +1,25 @@
package me.chanjar.weixin.mp.api.impl;
+import com.google.common.collect.Sets;
import com.google.inject.Inject;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.bean.WxNetCheckResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
import me.chanjar.weixin.mp.util.WxMpConfigStorageHolder;
+import org.testng.Assert;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
+import java.util.Arrays;
+
import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
@@ -37,4 +48,107 @@ public class BaseWxMpServiceImplTest {
assertThat(this.wxService.switchoverTo("another").getAccessToken()).isNotEmpty();
assertThat(WxMpConfigStorageHolder.get()).isEqualTo("another");
}
+
+ @Test
+ public void testNetCheck() throws WxErrorException {
+ WxNetCheckResult result = this.wxService.netCheck(WxConsts.NetCheckArgs.ACTIONALL, WxConsts.NetCheckArgs.OPERATORDEFAULT);
+ Assert.assertNotNull(result);
+
+ }
+
+ @Test
+ public void testNectCheckResult() {
+ String json = "{\n" +
+ " \"dns\": [\n" +
+ " {\n" +
+ " \"ip\": \"111.161.64.40\", \n" +
+ " \"real_operator\": \"UNICOM\"\n" +
+ " }, \n" +
+ " {\n" +
+ " \"ip\": \"111.161.64.48\", \n" +
+ " \"real_operator\": \"UNICOM\"\n" +
+ " }\n" +
+ " ], \n" +
+ " \"ping\": [\n" +
+ " {\n" +
+ " \"ip\": \"111.161.64.40\", \n" +
+ " \"from_operator\": \"UNICOM\"," +
+ " \"package_loss\": \"0%\", \n" +
+ " \"time\": \"23.079ms\"\n" +
+ " }, \n" +
+ " {\n" +
+ " \"ip\": \"111.161.64.48\", \n" +
+ " \"from_operator\": \"UNICOM\", \n" +
+ " \"package_loss\": \"0%\", \n" +
+ " \"time\": \"21.434ms\"\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+ WxNetCheckResult result = WxNetCheckResult.fromJson(json);
+ Assert.assertNotNull(result);
+ Assert.assertNotNull(result.getDnsInfos());
+
+ WxNetCheckResult.WxNetCheckDnsInfo dnsInfo = new WxNetCheckResult.WxNetCheckDnsInfo();
+ dnsInfo.setIp("111.161.64.40");
+ dnsInfo.setRealOperator("UNICOM");
+ Assert.assertEquals(result.getDnsInfos().get(0), dnsInfo);
+
+ WxNetCheckResult.WxNetCheckPingInfo pingInfo = new WxNetCheckResult.WxNetCheckPingInfo();
+ pingInfo.setTime("21.434ms");
+ pingInfo.setFromOperator("UNICOM");
+ pingInfo.setIp("111.161.64.48");
+ pingInfo.setPackageLoss("0%");
+ Assert.assertEquals(result.getPingInfos().get(1), pingInfo);
+
+ }
+
+ @Test
+ public void testGetCallbackIP() throws WxErrorException {
+ String[] ipArray = this.wxService.getCallbackIP();
+ System.out.println(Arrays.toString(ipArray));
+ Assert.assertNotNull(ipArray);
+ Assert.assertNotEquals(ipArray.length, 0);
+ }
+
+ public void testShortUrl() throws WxErrorException {
+ String shortUrl = this.wxService.shortUrl("http://www.baidu.com/test?access_token=123");
+ assertThat(shortUrl).isNotEmpty();
+ System.out.println(shortUrl);
+ }
+
+ @Test(expectedExceptions = WxErrorException.class)
+ public void testShortUrl_with_exceptional_url() throws WxErrorException {
+ this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123");
+ }
+
+ @Test
+ public void refreshAccessTokenDuplicatelyTest() throws InterruptedException {
+ // 测试多线程刷新accessToken时是否重复刷新
+ wxService.getWxMpConfigStorage().expireAccessToken();
+ final Set set = Sets.newConcurrentHashSet();
+ Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ String accessToken = wxService.getAccessToken();
+ set.add(accessToken);
+ } catch (WxErrorException e) {
+ e.printStackTrace();
+ }
+ }
+ };
+
+ final int threadNumber = 10;
+ ExecutorService executorService = Executors.newFixedThreadPool(threadNumber);
+ for ( int i = 0; i < threadNumber; i++ ) {
+ executorService.submit(r);
+ }
+ executorService.shutdown();
+ boolean isTerminated = executorService.awaitTermination(15, TimeUnit.SECONDS);
+ System.out.println("isTerminated: " + isTerminated);
+ System.out.println("times of refreshing accessToken: " + set.size());
+
+ assertEquals(set.size(), 1);
+
+ }
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
index b736f908..948af00c 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
@@ -137,7 +137,7 @@ public class WxMpCardServiceImplTest {
base.setLocationIdList("1234");
//团购券
- WxMpCardCreateMessage grouponMessage = new WxMpCardCreateMessage();
+ WxMpCardCreateRequest grouponMessage = new WxMpCardCreateRequest();
GrouponCardCreateRequest grouponCardCreateRequest = new GrouponCardCreateRequest();
GrouponCard grouponCard = new GrouponCard();
grouponCard.setBaseInfo(base);
@@ -149,7 +149,7 @@ public class WxMpCardServiceImplTest {
System.out.println(this.wxService.getCardService().createCard(grouponMessage));
//现金券
- WxMpCardCreateMessage cashMessage = new WxMpCardCreateMessage();
+ WxMpCardCreateRequest cashMessage = new WxMpCardCreateRequest();
CashCardCreateRequest cashCardCreateRequest = new CashCardCreateRequest();
CashCard cashCard = new CashCard();
cashCard.setBaseInfo(base);
@@ -162,7 +162,7 @@ public class WxMpCardServiceImplTest {
System.out.println(this.wxService.getCardService().createCard(cashMessage));
//折扣券
- WxMpCardCreateMessage discountMessage = new WxMpCardCreateMessage();
+ WxMpCardCreateRequest discountMessage = new WxMpCardCreateRequest();
DiscountCardCreateRequest discountCardCreateRequest = new DiscountCardCreateRequest();
DiscountCard discountCard = new DiscountCard();
discountCard.setBaseInfo(base);
@@ -174,7 +174,7 @@ public class WxMpCardServiceImplTest {
System.out.println(this.wxService.getCardService().createCard(discountMessage));
//兑换券
- WxMpCardCreateMessage giftMessage = new WxMpCardCreateMessage();
+ WxMpCardCreateRequest giftMessage = new WxMpCardCreateRequest();
GiftCardCreateRequest giftCardCreateRequest = new GiftCardCreateRequest();
GiftCard giftCard = new GiftCard();
giftCard.setBaseInfo(base);
@@ -185,14 +185,14 @@ public class WxMpCardServiceImplTest {
System.out.println(this.wxService.getCardService().createCard(giftMessage));
//普通兑换券
- WxMpCardCreateMessage generalMessage = new WxMpCardCreateMessage();
- GeneralCardCreateRequest generalCardCreateRequest = new GeneralCardCreateRequest();
- GeneralCard generalCard = new GeneralCard();
- generalCard.setBaseInfo(base);
- generalCard.setDefaultDetail("音乐木盒");
-
- generalCardCreateRequest.setGeneralCoupon(generalCard);
- generalMessage.setCardCreateRequest(generalCardCreateRequest);
+ WxMpCardCreateRequest generalMessage = new WxMpCardCreateRequest();
+ GeneralCouponCreateRequest generalCouponCreateRequest = new GeneralCouponCreateRequest();
+ GeneralCoupon generalCoupon = new GeneralCoupon();
+ generalCoupon.setBaseInfo(base);
+ generalCoupon.setDefaultDetail("音乐木盒");
+
+ generalCouponCreateRequest.setGeneralCoupon(generalCoupon);
+ generalMessage.setCardCreateRequest(generalCouponCreateRequest);
System.out.println(this.wxService.getCardService().createCard(generalMessage));
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java
index 60551c32..efbf6e18 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java
@@ -2,11 +2,20 @@ package me.chanjar.weixin.mp.api.impl;
import com.google.inject.Inject;
import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpCommentService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Comment.LIST;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
/**
* 测试类.
*
@@ -25,4 +34,44 @@ public class WxMpCommentServiceImplTest {
this.wxService.getCommentService().open(1, null);
this.wxService.getCommentService().open(1, 0);
}
+
+ @Test
+ public void testClose() throws WxErrorException {
+ this.wxService.getCommentService().close(1000000001, null);
+ this.wxService.getCommentService().close(1, 0);
+ }
+
+ @Test
+ public void testList() throws WxErrorException {
+ String expectedResponse = "{\n" +
+ " \"errcode\": 0,\n" +
+ " \"errmsg\": \"ok\",\n" +
+ " \"total\": 1,\n" +
+ " \"comment\": [\n" +
+ " {\n" +
+ " \"user_comment_id\": 1,\n" +
+ " \"openid\": \"OPENID\",\n" +
+ " \"create_time\": \"CREATE_TIME\",\n" +
+ " \"content\": \"CONTENT\",\n" +
+ " \"comment_type\": 1,\n" +
+ " \"reply\": {\n" +
+ " \"content\": \"CONTENT\",\n" +
+ " \"create_time\": \"CREATE_TIME\"\n" +
+ " }\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+
+ wxService = spy(wxService);
+ WxMpCommentService commentService = new WxMpCommentServiceImpl(wxService);
+ doReturn(expectedResponse).when(wxService).post(anyString(), anyString());
+
+ final WxMpCommentListVo commentListVo = commentService.list(1, 1, 1, 1, 1);
+ assertThat(commentListVo).isNotNull();
+ System.out.println(commentListVo);
+ assertThat(commentListVo.getTotal()).isEqualTo(1);
+ assertThat(commentListVo.getComment()).isNotEmpty();
+
+ assertThat(commentListVo.getComment().get(0).getReply()).isNotNull();
+ }
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java
new file mode 100644
index 00000000..37f6ab72
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpImgProcServiceImplTest.java
@@ -0,0 +1,213 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.fs.FileUtils;
+import me.chanjar.weixin.mp.api.WxMpImgProcService;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.api.test.TestConstants;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult;
+import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import javax.inject.Inject;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.*;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMpImgProcServiceImplTest {
+ @Inject
+ private WxMpService mpService;
+
+ @Test
+ public void testQrCode() throws WxErrorException {
+ final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testQrCode2() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testSuperResolution() throws WxErrorException {
+ final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testSuperResolution2() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testAiCrop() throws WxErrorException {
+ final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testAiCrop2() throws WxErrorException {
+ final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png", "1,2.35");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testAiCrop3() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testAiCrop4() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile, "1,2.35,3.5");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ public static class mockTest {
+ private WxMpService wxService = mock(WxMpService.class);
+
+ @Test
+ public void testQrCode() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"code_results\": [\n" +
+ " {\n" +
+ " \"type_name\": \"QR_CODE\", \n" +
+ " \"data\": \"https://www.qq.com\", \n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 585, \n" +
+ " \"y\": 378\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 828, \n" +
+ " \"y\": 378\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 828, \n" +
+ " \"y\": 618\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 585, \n" +
+ " \"y\": 618\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " {\n" +
+ " \"type_name\": \"QR_CODE\", \n" +
+ " \"data\": \"https://mp.weixin.qq.com\", \n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 185, \n" +
+ " \"y\": 142\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 396, \n" +
+ " \"y\": 142\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 396, \n" +
+ " \"y\": 353\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 185, \n" +
+ " \"y\": 353\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " {\n" +
+ " \"type_name\": \"EAN_13\", \n" +
+ " \"data\": \"5906789678957\"\n" +
+ " }, \n" +
+ " {\n" +
+ " \"type_name\": \"CODE_128\", \n" +
+ " \"data\": \"50090500019191\"\n" +
+ " }\n" +
+ " ], \n" +
+ " \"img_size\": {\n" +
+ " \"w\": 1000, \n" +
+ " \"h\": 900\n" +
+ " }\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+ final WxMpImgProcQrCodeResult result = wxMpImgProcService.qrCode("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testSuperResolution() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"media_id\": \"6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB\"\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+ final WxMpImgProcSuperResolutionResult result = wxMpImgProcService.superResolution("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testAiCrop() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"results\": [ //智能裁剪结果\n" +
+ " {\n" +
+ " \"crop_left\": 112, \n" +
+ " \"crop_top\": 0, \n" +
+ " \"crop_right\": 839, \n" +
+ " \"crop_bottom\": 727\n" +
+ " }, \n" +
+ " {\n" +
+ " \"crop_left\": 0, \n" +
+ " \"crop_top\": 205, \n" +
+ " \"crop_right\": 965, \n" +
+ " \"crop_bottom\": 615\n" +
+ " }\n" +
+ " ], \n" +
+ " \"img_size\": { //图片大小\n" +
+ " \"w\": 966, \n" +
+ " \"h\": 728\n" +
+ " }\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService);
+ final WxMpImgProcAiCropResult result = wxMpImgProcService.aiCrop("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+ }
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
index afca1a2a..6d14b336 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
@@ -9,16 +9,16 @@ import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
import me.chanjar.weixin.mp.api.test.TestConstants;
import me.chanjar.weixin.mp.bean.material.*;
-import org.testng.annotations.*;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.*;
/**
* 素材管理相关接口的测试
@@ -27,7 +27,7 @@ import static org.testng.Assert.assertTrue;
* @author codepiano
* @author Binary Wang
*/
-@Test(groups = "materialAPI")
+@Test
@Guice(modules = ApiTestModule.class)
public class WxMpMaterialServiceImplTest {
@Inject
@@ -44,6 +44,8 @@ public class WxMpMaterialServiceImplTest {
private WxMpMaterialCountResult wxMaterialCountResultBeforeTest;
// 以下为media接口的测试
private List mediaIdsToDownload = new ArrayList<>();
+ // 以下为高清语音接口的测试
+ private List voiceMediaIdsToDownload = new ArrayList<>();
@DataProvider
public Object[][] mediaFiles() {
@@ -175,7 +177,7 @@ public class WxMpMaterialServiceImplTest {
}
}
- @Test(dependsOnMethods = {"testAddNews","testUploadMaterial"})
+ @Test(dependsOnMethods = {"testAddNews", "testUploadMaterial"})
public void testGetNewsInfo() throws WxErrorException {
WxMpMaterialNews wxMpMaterialNewsSingle = this.wxService
.getMaterialService().materialNewsInfo(this.singleNewsMediaId);
@@ -243,6 +245,15 @@ public class WxMpMaterialServiceImplTest {
@Test(dependsOnMethods = {"testMaterialFileList"}, dataProvider = "allTestMaterial")
public void testDeleteMaterial(String mediaId) throws WxErrorException {
+ this.delete(mediaId);
+ }
+
+ @Test
+ public void testDeleteMaterialDirectly() throws WxErrorException {
+ this.delete("abc");
+ }
+
+ public void delete(String mediaId) throws WxErrorException {
boolean result = this.wxService.getMaterialService().materialDelete(mediaId);
assertTrue(result);
}
@@ -280,6 +291,11 @@ public class WxMpMaterialServiceImplTest {
if (res.getMediaId() != null && !mediaType.equals(WxConsts.MediaFileType.VIDEO)) {
//video 不支持下载,所以不加入
this.mediaIdsToDownload.add(res.getMediaId());
+
+ // 音频media, 用于测试下载高清语音接口
+ if (mediaType.equals(WxConsts.MediaFileType.VOICE)) {
+ this.voiceMediaIdsToDownload.add(res.getMediaId());
+ }
}
if (res.getThumbMediaId() != null) {
@@ -299,10 +315,26 @@ public class WxMpMaterialServiceImplTest {
return params;
}
+ @DataProvider
+ public Object[][] downloadJssdkMedia() {
+ Object[][] params = new Object[this.voiceMediaIdsToDownload.size()][];
+ for (int i = 0; i < this.voiceMediaIdsToDownload.size(); i++) {
+ params[i] = new Object[]{this.voiceMediaIdsToDownload.get(i)};
+ }
+ return params;
+ }
+
@Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadMedia")
public void testDownloadMedia(String mediaId) throws WxErrorException {
File file = this.wxService.getMaterialService().mediaDownload(mediaId);
assertNotNull(file);
System.out.println(file.getAbsolutePath());
}
+
+ @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadJssdkMedia")
+ public void testDownloadJssdkMedia(String mediaId) throws WxErrorException {
+ File file = this.wxService.getMaterialService().jssdkMediaDownload(mediaId);
+ assertNotNull(file);
+ System.out.println(file.getAbsolutePath());
+ }
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
index 01706065..55bfa062 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpOcrServiceImplTest.java
@@ -1,16 +1,28 @@
package me.chanjar.weixin.mp.api.impl;
import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.api.WxMpOcrService;
+import me.chanjar.weixin.common.util.fs.FileUtils;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.api.test.TestConstants;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBankCardResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrBizLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrCommResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingLicenseResult;
+import me.chanjar.weixin.mp.bean.ocr.WxMpOcrDrivingResult;
import me.chanjar.weixin.mp.bean.ocr.WxMpOcrIdCardResult;
-import org.testng.annotations.BeforeTest;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
import javax.inject.Inject;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
@@ -30,12 +42,116 @@ public class WxMpOcrServiceImplTest {
@Test
public void testIdCard() throws WxErrorException {
- final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(WxMpOcrService.ImageType.PHOTO,
- "http://www.baidu.com");
+ final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(
+ "https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testIdCard2() throws Exception {
+ InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/E_oqdHqP4ETOJsT46sQnXz1HbeHOpqDQTuhkYeaLaJTf-JKld7de3091dwxCQwa6");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrIdCardResult result = this.mpService.getOcrService().idCard(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBankCard() throws WxErrorException {
+ final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBankCard2() throws Exception {
+ InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/eP7PObYbBJj-_19EbGBL4PWe_zQ1NwET5NXSugjEWc-4ayns4Q-HFJrp-AOog8ih");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrBankCardResult result = this.mpService.getOcrService().bankCard(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDriving() throws WxErrorException {
+ final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving("https://res.wx.qq.com/op_res/T051P5uWvh9gSJ9j78tWib53WiNi2pHSSZhoO8wnY3Av-djpsA4kA9whbtt6_Tb6");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDriving2() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrDrivingResult result = this.mpService.getOcrService().driving(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDrivingLicense() throws WxErrorException {
+ final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDrivingLicense2() throws Exception {
+ InputStream inputStream = this.getImageStream("https://res.wx.qq.com/op_res/kD4YXjYVAW1eaQqn9uTA0rrOFoZRvVINitNDSGo5gJ7SzTCezNq_ZDDmU1I08kGn");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrDrivingLicenseResult result = this.mpService.getOcrService().drivingLicense(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBizLicense() throws WxErrorException {
+ final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBizLicense2() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrBizLicenseResult result = this.mpService.getOcrService().bizLicense(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testComm() throws WxErrorException {
+ final WxMpOcrCommResult result = this.mpService.getOcrService().comm("https://res.wx.qq.com/op_res/apCy0YbnEdjYsa_cjW6x3FlpCc20uQ-2BYE7aXnFsrB-ALHZNgdKXhzIUcrRnDoL");
assertThat(result).isNotNull();
System.out.println(result);
}
+ @Test
+ public void testComm2() throws Exception {
+ InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg");
+ File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG);
+ final WxMpOcrCommResult result = this.mpService.getOcrService().comm(tempFile);
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ private InputStream getImageStream(String url) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.setReadTimeout(5000);
+ connection.setConnectTimeout(5000);
+ connection.setRequestMethod("GET");
+ if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
+ return connection.getInputStream();
+ }
+ } catch (IOException e) {
+ System.out.println("获取网络图片出现异常,图片路径为:" + url);
+ }
+ return null;
+ }
+
public static class MockTest {
private WxMpService wxService = mock(WxMpService.class);
@@ -46,7 +162,231 @@ public class WxMpOcrServiceImplTest {
when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
- final WxMpOcrIdCardResult result = wxMpOcrService.idCard(WxMpOcrService.ImageType.PHOTO, "abc");
+ final WxMpOcrIdCardResult result = wxMpOcrService.idCard("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBankCard() throws Exception {
+ String returnJson = "{\"number\":\"24234234345234\"}";
+
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+ final WxMpOcrBankCardResult result = wxMpOcrService.bankCard("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDriving() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0,\n" +
+ " \"errmsg\": \"ok\",\n" +
+ " \"plate_num\": \"粤xxxxx\", //车牌号码\n" +
+ " \"vehicle_type\": \"小型普通客车\", //车辆类型\n" +
+ " \"owner\": \"东莞市xxxxx机械厂\", //所有人\n" +
+ " \"addr\": \"广东省东莞市xxxxx号\", //住址\n" +
+ " \"use_character\": \"非营运\", //使用性质\n" +
+ " \"model\": \"江淮牌HFCxxxxxxx\", //品牌型号\n" +
+ " \"vin\": \"LJ166xxxxxxxx51\", //车辆识别代号\n" +
+ " \"engine_num\": \"J3xxxxx3\", //发动机号码\n" +
+ " \"register_date\": \"2018-07-06\", //注册日期\n" +
+ " \"issue_date\": \"2018-07-01\", //发证日期\n" +
+ " \"plate_num_b\": \"粤xxxxx\", //车牌号码\n" +
+ " \"record\": \"441xxxxxx3\", //号牌\n" +
+ " \"passengers_num\": \"7人\", //核定载人数\n" +
+ " \"total_quality\": \"2700kg\", //总质量\n" +
+ " \"prepare_quality\": \"1995kg\", //整备质量\n" +
+ " \"overall_size\": \"4582x1795x1458mm\", //外廓尺寸\n" +
+ " \"card_position_front\": {//卡片正面位置(检测到卡片正面才会返回)\n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 119, \n" +
+ " \"y\": 2925\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 1435, \n" +
+ " \"y\": 2887\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 1435, \n" +
+ " \"y\": 3793\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 119, \n" +
+ " \"y\": 3831\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " \"card_position_back\": {//卡片反面位置(检测到卡片反面才会返回)\n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 1523, \n" +
+ " \"y\": 2849\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 2898, \n" +
+ " \"y\": 2887\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 2927, \n" +
+ " \"y\": 3831\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 1523, \n" +
+ " \"y\": 3831\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " \"img_size\": {//图片大小\n" +
+ " \"w\": 3120, \n" +
+ " \"h\": 4208\n" +
+ " }\n" +
+ "}";
+
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+ final WxMpOcrDrivingResult result = wxMpOcrService.driving("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testDrivingLicense() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0,\n" +
+ " \"errmsg\": \"ok\",\n" +
+ " \"id_num\": \"660601xxxxxxxx1234\", //证号\n" +
+ " \"name\": \"张三\", //姓名\n" +
+ " \"sex\": \"男\", //性别\n" +
+ " \"nationality\": \"中国\", //国籍\n" +
+ " \"address\": \"广东省东莞市xxxxx号\", //住址\n" +
+ " \"birth_date\": \"1990-12-21\", //出生日期\n" +
+ " \"issue_date\": \"2012-12-21\", //初次领证日期\n" +
+ " \"car_class\": \"C1\", //准驾车型\n" +
+ " \"valid_from\": \"2018-07-06\", //有效期限起始日\n" +
+ " \"valid_to\": \"2020-07-01\", //有效期限终止日\n" +
+ " \"official_seal\": \"xx市公安局公安交通管理局\" //印章文字\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+ final WxMpOcrDrivingLicenseResult result = wxMpOcrService.drivingLicense("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testBizLicense() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"reg_num\": \"123123\",//注册号\n" +
+ " \"serial\": \"123123\",//编号\n" +
+ " \"legal_representative\": \"张三\", //法定代表人姓名\n" +
+ " \"enterprise_name\": \"XX饮食店\", //企业名称\n" +
+ " \"type_of_organization\": \"个人经营\", //组成形式\n" +
+ " \"address\": \"XX市XX区XX路XX号\", //经营场所/企业住所\n" +
+ " \"type_of_enterprise\": \"xxx\", //公司类型\n" +
+ " \"business_scope\": \"中型餐馆(不含凉菜、不含裱花蛋糕,不含生食海产品)。\", //经营范围\n" +
+ " \"registered_capital\": \"200万\", //注册资本\n" +
+ " \"paid_in_capital\": \"200万\", //实收资本\n" +
+ " \"valid_period\": \"2019年1月1日\", //营业期限\n" +
+ " \"registered_date\": \"2018年1月1日\", //注册日期/成立日期\n" +
+ " \"cert_position\": { //营业执照位置\n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 155, \n" +
+ " \"y\": 191\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 725, \n" +
+ " \"y\": 157\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 743, \n" +
+ " \"y\": 512\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 164, \n" +
+ " \"y\": 525\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " \"img_size\": { //图片大小\n" +
+ " \"w\": 966, \n" +
+ " \"h\": 728\n" +
+ " }\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+ final WxMpOcrBizLicenseResult result = wxMpOcrService.bizLicense("abc");
+ assertThat(result).isNotNull();
+ System.out.println(result);
+ }
+
+ @Test
+ public void testComm() throws Exception {
+ String returnJson = "{\n" +
+ " \"errcode\": 0, \n" +
+ " \"errmsg\": \"ok\", \n" +
+ " \"items\": [ //识别结果\n" +
+ " {\n" +
+ " \"text\": \"腾讯\", \n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 575, \n" +
+ " \"y\": 519\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 744, \n" +
+ " \"y\": 519\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 744, \n" +
+ " \"y\": 532\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 573, \n" +
+ " \"y\": 532\n" +
+ " }\n" +
+ " }\n" +
+ " }, \n" +
+ " {\n" +
+ " \"text\": \"微信团队\", \n" +
+ " \"pos\": {\n" +
+ " \"left_top\": {\n" +
+ " \"x\": 670, \n" +
+ " \"y\": 516\n" +
+ " }, \n" +
+ " \"right_top\": {\n" +
+ " \"x\": 762, \n" +
+ " \"y\": 517\n" +
+ " }, \n" +
+ " \"right_bottom\": {\n" +
+ " \"x\": 762, \n" +
+ " \"y\": 532\n" +
+ " }, \n" +
+ " \"left_bottom\": {\n" +
+ " \"x\": 670, \n" +
+ " \"y\": 531\n" +
+ " }\n" +
+ " }\n" +
+ " }\n" +
+ " ], \n" +
+ " \"img_size\": { //图片大小\n" +
+ " \"w\": 1280, \n" +
+ " \"h\": 720\n" +
+ " }\n" +
+ "}";
+ when(wxService.get(anyString(), anyString())).thenReturn(returnJson);
+ final WxMpOcrServiceImpl wxMpOcrService = new WxMpOcrServiceImpl(wxService);
+
+ final WxMpOcrCommResult result = wxMpOcrService.comm("abc");
assertThat(result).isNotNull();
System.out.println(result);
}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
index 94d759fc..181411df 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpTemplateMsgServiceImplTest.java
@@ -5,10 +5,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
import me.chanjar.weixin.mp.api.test.TestConfigStorage;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
-import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
+import me.chanjar.weixin.mp.bean.template.*;
import org.apache.commons.lang3.RandomStringUtils;
import org.testng.Assert;
import org.testng.annotations.Guice;
@@ -32,10 +29,8 @@ public class WxMpTemplateMsgServiceImplTest {
@Test(invocationCount = 5, threadPoolSize = 3)
public void testSendTemplateMsg() throws WxErrorException {
- SimpleDateFormat dateFormat = new SimpleDateFormat(
- "yyyy-MM-dd HH:mm:ss.SSS");
- TestConfigStorage configStorage = (TestConfigStorage) this.wxService
- .getWxMpConfigStorage();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+ TestConfigStorage configStorage = (TestConfigStorage) this.wxService.getWxMpConfigStorage();
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(configStorage.getOpenid())
.templateId(configStorage.getTemplateId())
@@ -58,8 +53,8 @@ public class WxMpTemplateMsgServiceImplTest {
@Test
public void testSetIndustry() throws Exception {
- WxMpTemplateIndustry industry = new WxMpTemplateIndustry(new WxMpTemplateIndustry.Industry("1"),
- new WxMpTemplateIndustry.Industry("04"));
+ WxMpTemplateIndustry industry = new WxMpTemplateIndustry(WxMpTemplateIndustryEnum.findByCode(1),
+ WxMpTemplateIndustryEnum.findByCode(4));
boolean result = this.wxService.getTemplateMsgService().setIndustry(industry);
Assert.assertTrue(result);
}
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 7a2c2457..d25b5083 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 3.5.0
+ 3.6.0
weixin-java-open
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
index 2beec638..5f4994cd 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java
@@ -1,17 +1,22 @@
package me.chanjar.weixin.open.api;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.google.gson.JsonObject;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.open.bean.WxOpenCreateResult;
+import me.chanjar.weixin.open.bean.WxOpenGetResult;
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
import me.chanjar.weixin.open.bean.result.*;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import java.util.List;
/**
+ * .
+ *
* @author 007
*/
public interface WxOpenComponentService {
@@ -22,50 +27,56 @@ public interface WxOpenComponentService {
String API_GET_AUTHORIZER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info";
String API_GET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option";
String API_SET_AUTHORIZER_OPTION_URL = "https://api.weixin.qq.com/cgi-bin/component/api_set_authorizer_option";
- String API_GET_AUTHORIZER_LIST = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s";
+ String API_GET_AUTHORIZER_LIST = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list";
String COMPONENT_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx";
/**
- * 手机端打开授权链接
+ * 手机端打开授权链接.
*/
String COMPONENT_MOBILE_LOGIN_PAGE_URL = "https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&no_scan=1&auth_type=3&component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=xxx&biz_appid=xxx#wechat_redirect";
String CONNECT_OAUTH2_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s&component_appid=%s#wechat_redirect";
/**
- * 用code换取oauth2的access token
+ * 用code换取oauth2的access token.
*/
String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=%s&code=%s&grant_type=authorization_code&component_appid=%s";
/**
- * 刷新oauth2的access token
+ * 刷新oauth2的access token.
*/
String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid=%s";
String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s";
- 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 BIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/bind";
+
+ String UNBIND_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/unbind";
+
+ String GET_OPEN_URL = "https://api.weixin.qq.com/cgi-bin/open/get";
/**
- * 快速创建小程序接口
+ * 快速创建小程序接口.
*/
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);
/**
- * 获取指定appid的开放平台小程序服务(继承一般小程序服务能力)
+ * 获取指定appid的开放平台小程序服务(继承一般小程序服务能力).
*
- * @param appid
- * @return
+ * @param appid .
+ * @return .
*/
WxOpenMaService getWxMaServiceByAppid(String appid);
/**
- * 获取指定appid的快速创建的小程序服务
- * @param appid
- * @return
+ * 获取指定appid的快速创建的小程序服务.
+ *
+ * @param appid .
+ * @return .
*/
WxOpenFastMaService getWxFastMaServiceByAppid(String appid);
@@ -75,62 +86,72 @@ public interface WxOpenComponentService {
String getComponentAccessToken(boolean forceRefresh) throws WxErrorException;
+ String post(String uri, String postData) throws WxErrorException;
+
+ String post(String uri, String postData, String accessTokenKey) throws WxErrorException;
+
+ String get(String uri) throws WxErrorException;
+
+ String get(String uri, String accessTokenKey) throws WxErrorException;
+
/**
- * 获取用户授权页URL(来路URL和成功跳转URL 的域名都需要为三方平台设置的 登录授权的发起页域名)
+ * 获取用户授权页URL(来路URL和成功跳转URL 的域名都需要为三方平台设置的 登录授权的发起页域名).
*/
- String getPreAuthUrl(String redirectURI) throws WxErrorException;
+ String getPreAuthUrl(String redirectUri) throws WxErrorException;
/**
- * authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。
- * bizAppid 指定授权唯一的小程序或公众号
- * 注:auth_type、biz_appid两个字段互斥。
+ * .
+ *
+ * @param authType 要授权的帐号类型:1则商户点击链接后,手机端仅展示公众号、2表示仅展示小程序,3表示公众号和小程序都展示。如果为未指定,则默认小程序和公众号都展示。第三方平台开发者可以使用本字段来控制授权的帐号类型。
+ * @param bizAppid 指定授权唯一的小程序或公众号
+ * 注:authType、bizAppid 互斥。
*/
- String getPreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException;
+ String getPreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException;
/**
- * 获取预授权链接(手机端预授权)
+ * 获取预授权链接(手机端预授权).
*
- * @param redirectURI
- * @return
- * @throws WxErrorException
+ * @param redirectUri .
+ * @return .
+ * @throws WxErrorException .
*/
- String getMobilePreAuthUrl(String redirectURI) throws WxErrorException;
+ String getMobilePreAuthUrl(String redirectUri) throws WxErrorException;
/**
- * 获取预授权链接(手机端预授权)
+ * 获取预授权链接(手机端预授权).
*
- * @param redirectURI
- * @param authType
- * @param bizAppid
- * @return
- * @throws WxErrorException
+ * @param redirectUri .
+ * @param authType .
+ * @param bizAppid .
+ * @return .
+ * @throws WxErrorException .
*/
- String getMobilePreAuthUrl(String redirectURI, String authType, String bizAppid) throws WxErrorException;
+ String getMobilePreAuthUrl(String redirectUri, String authType, String bizAppid) throws WxErrorException;
String route(WxOpenXmlMessage wxMessage) throws WxErrorException;
/**
- * 使用授权码换取公众号或小程序的接口调用凭据和授权信息
+ * 使用授权码换取公众号或小程序的接口调用凭据和授权信息.
*/
WxOpenQueryAuthResult getQueryAuth(String authorizationCode) throws WxErrorException;
/**
- * 获取授权方的帐号基本信息
+ * 获取授权方的帐号基本信息.
*/
WxOpenAuthorizerInfoResult getAuthorizerInfo(String authorizerAppid) throws WxErrorException;
/**
- * 获取授权方的选项设置信息
+ * 获取授权方的选项设置信息.
*/
WxOpenAuthorizerOptionResult getAuthorizerOption(String authorizerAppid, String optionName) throws WxErrorException;
/**
- * 获取所有授权方列表
+ * 获取所有授权方列表.
*/
WxOpenAuthorizerListResult getAuthorizerList(int begin, int len) throws WxErrorException;
/**
- * 设置授权方的选项信息
+ * 设置授权方的选项信息.
*/
void setAuthorizerOption(String authorizerAppid, String optionName, String optionValue) throws WxErrorException;
@@ -142,13 +163,12 @@ public interface WxOpenComponentService {
WxMpOAuth2AccessToken oauth2refreshAccessToken(String appid, String refreshToken) throws WxErrorException;
- String oauth2buildAuthorizationUrl(String appid, String redirectURI, String scope, String state);
+ String oauth2buildAuthorizationUrl(String appid, String redirectUri, String scope, String state);
WxMaJscode2SessionResult miniappJscode2Session(String appId, String jsCode) throws WxErrorException;
/**
- * 代小程序实现业务
- *
+ * 代小程序实现业务.
* 小程序代码模版库管理:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1506504150_nMMh6&token=&lang=zh_CN
* access_token 为 component_access_token
*/
@@ -158,7 +178,7 @@ public interface WxOpenComponentService {
String DELETE_TEMPLATE_URL = "https://api.weixin.qq.com/wxa/deletetemplate";
/**
- * 获取草稿箱内的所有临时代码草稿
+ * 获取草稿箱内的所有临时代码草稿.
*
* @return 草稿箱代码模板列表(draftId)
* @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
@@ -166,7 +186,7 @@ public interface WxOpenComponentService {
List getTemplateDraftList() throws WxErrorException;
/**
- * 获取代码模版库中的所有小程序代码模版
+ * 获取代码模版库中的所有小程序代码模版.
*
* @return 小程序代码模版列表(templateId)
* @throws WxErrorException 获取失败时返回,具体错误码请看此接口的注释文档
@@ -174,7 +194,7 @@ public interface WxOpenComponentService {
List getTemplateList() throws WxErrorException;
/**
- * 将草稿箱的草稿选为小程序代码模版
+ * 将草稿箱的草稿选为小程序代码模版.
*
* @param draftId 草稿ID,本字段可通过“获取草稿箱内的所有临时代码草稿”接口获得
* @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
@@ -183,7 +203,7 @@ public interface WxOpenComponentService {
void addToTemplate(long draftId) throws WxErrorException;
/**
- * 删除指定小程序代码模版
+ * 删除指定小程序代码模版.
*
* @param templateId 要删除的模版ID
* @throws WxErrorException 操作失败时抛出,具体错误码请看此接口的注释文档
@@ -193,45 +213,71 @@ public interface WxOpenComponentService {
/**
* https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1498704199_1bcax&token=6df5e3650041eff2cd3ec3662425ad8d7beec8d9&lang=zh_CN
- * 创建 开放平台帐号并绑定公众号/小程序
- *
+ * 创建 开放平台帐号并绑定公众号/小程序.
* https://api.weixin.qq.com/cgi-bin/open/create
*
* @param appId 公众号/小程序的appId
- * @return
+ * @return .
*/
WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException;
+
+ /**
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/bind.html
+ * 将公众号/小程序绑定到开放平台帐号下
+ *
+ * @param appId 公众号/小程序的appId
+ * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回
+ */
+ Boolean bindOpenAccount(String appId, String openAppid) throws WxErrorException;
+
+
+ /**
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/unbind.html
+ * 将公众号/小程序从开放平台帐号下解绑
+ *
+ * @param appId 公众号/小程序的appId
+ * @param openAppid 开放平台帐号 appid,由创建开发平台帐号接口返回
+ */
+ Boolean unbindOpenAccount(String appId, String openAppid) throws WxErrorException;
+
+
/**
- * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
- * 第三方平台快速创建小程序
- *
- * 注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞
- *
- * @param name 企业名(需与工商部门登记信息一致)
- * @param code 企业代码
- * @param codeType 企业代码类型 1:统一社会信用代码(18位) 2:组织机构代码(9位xxxxxxxx-x) 3:营业执照注册号(15位)
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html
+ * 获取公众号/小程序所绑定的开放平台帐号
+ *
+ * @param appId 公众号/小程序的appId
+ * @return 开放平台帐号 appid,由创建开发平台帐号接口返回
+ */
+ WxOpenGetResult getOpenAccount(String appId) throws WxErrorException;
+
+ /**
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
+ * 第三方平台快速创建小程序.
+ * 注意:创建任务逻辑串行,单次任务结束后才可以使用相同信息下发第二次任务,请注意规避任务阻塞
+ *
+ * @param name 企业名(需与工商部门登记信息一致)
+ * @param code 企业代码
+ * @param codeType 企业代码类型 1:统一社会信用代码(18位) 2:组织机构代码(9位xxxxxxxx-x) 3:营业执照注册号(15位)
* @param legalPersonaWechat 法人微信号
- * @param legalPersonaName 法人姓名(绑定银行卡)
- * @param componentPhone 第三方联系电话(方便法人与第三方联系)
- * @return
- * @throws WxErrorException
+ * @param legalPersonaName 法人姓名(绑定银行卡)
+ * @param componentPhone 第三方联系电话(方便法人与第三方联系)
+ * @return .
+ * @throws WxErrorException .
*/
WxOpenResult fastRegisterWeapp(String name, String code, String codeType, String legalPersonaWechat, String legalPersonaName, String componentPhone) throws WxErrorException;
/**
- * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
- * 查询第三方平台快速创建小程序的任务状态
- *
- * 注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。
- * 小程序的成功状态可在第三方服务器中自行对账、查询。
- * 不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato
- *
+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21538208049W8uwq&token=&lang=zh_CN
+ * 查询第三方平台快速创建小程序的任务状态
+ * 注意:该接口只提供当下任务结果查询,不建议过分依赖该接口查询所创建小程序。
+ * 小程序的成功状态可在第三方服务器中自行对账、查询。
+ * 不要频繁调用search接口,消息接收需通过服务器查看。调用search接口会消耗接口整体调用quato
*
- * @param name 企业名(需与工商部门登记信息一致)
+ * @param name 企业名(需与工商部门登记信息一致)
* @param legalPersonaWechat 法人微信号
- * @param legalPersonaName 法人姓名(绑定银行卡)
- * @throws WxErrorException
+ * @param legalPersonaName 法人姓名(绑定银行卡)
+ * @throws WxErrorException .
*/
WxOpenResult fastRegisterWeappSearch(String name, String legalPersonaWechat, String legalPersonaName) throws WxErrorException;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
index c6fd7671..8710689c 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenFastMaService.java
@@ -2,7 +2,7 @@ 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.ma.WxFastMaCategory;
import me.chanjar.weixin.open.bean.result.*;
import java.util.List;
@@ -18,39 +18,38 @@ import java.util.List;
* @date 2019/01/23
*/
public interface WxOpenFastMaService extends WxMaService {
-
/**
- * 1 获取帐号基本信息
+ * 1 获取帐号基本信息.
*/
String OPEN_GET_ACCOUNT_BASIC_INFO = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo";
/**
- * 2 小程序名称设置及改名
+ * 2 小程序名称设置及改名.
*/
String OPEN_SET_NICKNAME = "https://api.weixin.qq.com/wxa/setnickname";
/**
- * 3 小程序改名审核状态查询
+ * 3 小程序改名审核状态查询.
*/
String OPEN_API_WXA_QUERYNICKNAME = "https://api.weixin.qq.com/wxa/api_wxa_querynickname";
/**
- * 4 微信认证名称检测
+ * 4 微信认证名称检测.
*/
String OPEN_CHECK_WX_VERIFY_NICKNAME = "https://api.weixin.qq.com/cgi-bin/wxverify/checkwxverifynickname";
/**
- * 5 修改头像
+ * 5 修改头像.
*/
String OPEN_MODIFY_HEADIMAGE = "https://api.weixin.qq.com/cgi-bin/account/modifyheadimage";
/**
- * 6修改功能介绍
+ * 6修改功能介绍.
*/
String OPEN_MODIFY_SIGNATURE = "https://api.weixin.qq.com/cgi-bin/account/modifysignature";
/**
- * 7 换绑小程序管理员接口
+ * 7 换绑小程序管理员接口.
*/
String OPEN_COMPONENT_REBIND_ADMIN = "https://api.weixin.qq.com/cgi-bin/account/componentrebindadmin";
@@ -79,37 +78,43 @@ public interface WxOpenFastMaService extends WxMaService {
/**
* 1.获取小程序的信息
*
- * @return
- * @throws WxErrorException
+ * @return .
+ * @throws WxErrorException .
*/
WxFastMaAccountBasicInfoResult getAccountBasicInfo() throws WxErrorException;
/**
* 2.小程序名称设置及改名
- *
+ *
* 若接口未返回audit_id,说明名称已直接设置成功,无需审核;若返回audit_id则名称正在审核中。
*
- * @param nickname 昵称
- * @param idCard 身份证照片–临时素材mediaid(个人号必填)
- * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
+ *
+ * @param nickname 昵称
+ * @param idCard 身份证照片–临时素材mediaid(个人号必填)
+ * @param license 组织机构代码证或营业执照–临时素材mediaid(组织号必填)
* @param namingOtherStuff1 其他证明材料---临时素材 mediaid
* @param namingOtherStuff2 其他证明材料---临时素材 mediaid
- * @throws WxErrorException
+ * @return .
+ * @throws WxErrorException .
*/
- WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1, String namingOtherStuff2) throws WxErrorException;
+ WxFastMaSetNickameResult setNickname(String nickname, String idCard, String license, String namingOtherStuff1,
+ String namingOtherStuff2) throws WxErrorException;
/**
* 3 小程序改名审核状态查询
+ *
* @param auditId 审核单id
- * @return
- * @throws WxErrorException
+ * @return .
+ * @throws WxErrorException .
*/
WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException;
/**
* 4. 微信认证名称检测
+ *
* @param nickname 名称
- * @throws WxErrorException
+ * @return .
+ * @throws WxErrorException .
*/
WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException;
@@ -119,29 +124,34 @@ public interface WxOpenFastMaService extends WxMaService {
* 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M
* 注:实际头像始终为正方形
*
+ *
* @param headImgMediaId 头像素材media_id
- * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
- * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
- * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
- * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
- * @throws WxErrorException
+ * @param x1 裁剪框左上角x坐标(取值范围:[0, 1])
+ * @param y1 裁剪框左上角y坐标(取值范围:[0, 1])
+ * @param x2 裁剪框右下角x坐标(取值范围:[0, 1])
+ * @param y2 裁剪框右下角y坐标(取值范围:[0, 1])
+ * @return .
+ * @throws WxErrorException .
*/
WxOpenResult modifyHeadImage(String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException;
/**
* 6.修改功能介绍
+ *
* @param signature 简介:4-120字
- * @throws WxErrorException
+ * @return .
+ * @throws WxErrorException .
*/
WxOpenResult modifySignature(String signature) throws WxErrorException;
/**
* 7.3 管理员换绑
- * @param taskid 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
- * @return
- * @throws WxErrorException
+ *
+ * @param taskId 换绑管理员任务序列号(公众平台最终点击提交回跳到第三方平台时携带)
+ * @return .
+ * @throws WxErrorException .
*/
- WxOpenResult componentRebindAdmin(String taskid) throws WxErrorException;
+ WxOpenResult componentRebindAdmin(String taskId) throws WxErrorException;
/**
* 8.1 获取账号可以设置的所有类目
@@ -150,38 +160,45 @@ public interface WxOpenFastMaService extends WxMaService {
* 目前没有完整的类目信息数据
* 为保证兼容性,放弃将response转换为实体
*
- * @return
+ *
+ * @return .
+ * @throws WxErrorException .
*/
String getAllCategories() throws WxErrorException;
/**
- *8.2添加类目
- * @return
- * @throws WxErrorException
+ * 8.2添加类目
+ *
+ * @param categoryList 类目列表
+ * @return .
+ * @throws WxErrorException .
*/
WxOpenResult addCategory(List+ * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=21517799059ZSEMr&token=6f965b5daf30a98a6bbd2a386faea5c934e929bf&lang=zh_CN + *
+ */ + + /** + * 1. 设置小程序隐私设置(是否可被搜索) + */ + String API_CHANGE_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/changewxasearchstatus"; + + /** + * 2. 查询小程序当前隐私设置(是否可被搜索) + */ + String API_GET_WXA_SEARCH_STATUS = "https://api.weixin.qq.com/wxa/getwxasearchstatus"; + + /** + * 3.1. 获取展示的公众号信息 + */ + String API_GET_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/getshowwxaitem"; + + /** + * 3.2 设置展示的公众号 + */ + String API_UPDATE_SHOW_WXA_ITEM = "https://api.weixin.qq.com/wxa/updateshowwxaitem"; + + /** * 以下接口为三方平台代小程序实现的代码管理功能 *@@ -139,10 +167,33 @@ public interface WxOpenMaService extends WxMaService { /** * 14.设置小程序“扫普通链接二维码打开小程序”能力 - *
- * TODO 暂时不实现 - *
+ * + * https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html + */ + /** + * 14.1 增加或修改二维码规则 + */ + String API_QRCODE_JUMP_ADD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd"; + + /** + * 14.2 获取已设置的二维码规则 + */ + String API_QRCODE_JUMP_GET = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpget"; + + /** + * 14.3 获取校验文件名称及内容 */ + String API_QRCODE_JUMP_DOWNLOAD = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdownload"; + + /** + * 14.4 删除已设置的二维码规则 + */ + String API_QRCODE_JUMP_DELETE = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdelete"; + + /** + * 14.5 发布已设置的二维码规则 + */ + String API_QRCODE_JUMP_PUBLISH = "https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumppublish"; /** * 15.小程序审核撤回 @@ -168,6 +219,17 @@ public interface WxOpenMaService extends WxMaService { String API_GET_GRAY_RELEASE_PLAN = "https://api.weixin.qq.com/wxa/getgrayreleaseplan"; + /** + * 查询服务商的当月提审限额和加急次数(Quota) + */ + String API_QUERY_QUOTA = "https://api.weixin.qq.com/wxa/queryquota"; + + /** + * 加急审核申请 + */ + String API_SPEED_AUDIT = "https://api.weixin.qq.com/wxa/speedupaudit"; + + /** * 获得小程序的域名配置信息 */ @@ -187,6 +249,13 @@ public interface WxOpenMaService extends WxMaService { */ String getWebViewDomain() throws WxErrorException; + /** + * 获取小程序的业务域名 + * + * @return + */ + public WxOpenMaWebDomainResult getWebViewDomainInfo() throws WxErrorException; + /** * 设置小程序的业务域名 * @@ -195,6 +264,16 @@ public interface WxOpenMaService extends WxMaService { */ String setWebViewDomain(String action, List- * 注意:这里不能直接用小程序的access_token - *- * - * @return - * @throws WxErrorException - */ @Override - public WxFastMaAccountBasicInfoResult getAccountBasicInfo () throws WxErrorException { - String response = get (OPEN_GET_ACCOUNT_BASIC_INFO, ""); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaAccountBasicInfoResult.class); + 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); + 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); + public WxFastMaQueryNicknameStatusResult querySetNicknameStatus(String auditId) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("audit_id", auditId); + String response = post(OPEN_API_WXA_QUERYNICKNAME, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaQueryNicknameStatusResult.class); } - /** - * 4. 微信认证名称检测 - *
- * 命中关键字策略时返回命中关键字的说明描述 - *- * - * @param nickname 名称 - * @throws WxErrorException - */ @Override - public WxFastMaCheckNickameResult checkWxVerifyNickname (String nickname) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("nick_name", nickname); - String response = post (OPEN_CHECK_WX_VERIFY_NICKNAME, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxFastMaCheckNickameResult.class); + public WxFastMaCheckNickameResult checkWxVerifyNickname(String nickname) throws WxErrorException { + JsonObject params = new JsonObject(); + params.addProperty("nick_name", nickname); + String response = post(OPEN_CHECK_WX_VERIFY_NICKNAME, GSON.toJson(params)); + return WxOpenGsonBuilder.create().fromJson(response, WxFastMaCheckNickameResult.class); } - /** - * 5.修改头像 - *
- * 图片格式只支持:BMP、JPEG、JPG、GIF、PNG,大小不超过2M - * 注:实际头像始终为正方形 - *- * - * @param headImgMediaId 头像素材media_id - * @param x1 裁剪框左上角x坐标(取值范围:[0, 1]) - * @param y1 裁剪框左上角y坐标(取值范围:[0, 1]) - * @param x2 裁剪框右下角x坐标(取值范围:[0, 1]) - * @param y2 裁剪框右下角y坐标(取值范围:[0, 1]) - * @throws WxErrorException - */ @Override - public WxOpenResult modifyHeadImage (String headImgMediaId, float x1, float y1, float x2, float y2) throws WxErrorException { - JsonObject params = new JsonObject (); - params.addProperty ("head_img_media_id", headImgMediaId); - params.addProperty ("x1", x1); - params.addProperty ("y1", y1); - params.addProperty ("x2", x2); - params.addProperty ("y2", y2); - String response = post (OPEN_MODIFY_HEADIMAGE, GSON.toJson (params)); - return WxOpenGsonBuilder.create ().fromJson (response, WxOpenResult.class); + 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); + 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); + 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, ""); + public String getAllCategories() throws WxErrorException { + return get(OPEN_GET_ALL_CATEGORIES, ""); } - /** - * 8.2添加类目 - * - * @param categoryList - * @return - * @throws WxErrorException - */ @Override - public WxOpenResult addCategory (List
@@ -139,6 +163,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return response;
}
+
/**
* 绑定小程序体验者
*
@@ -147,11 +172,11 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
* @throws WxErrorException
*/
@Override
- public WxOpenResult bindTester(String wechatid) throws WxErrorException {
+ public WxOpenMaBindTesterResult bindTester(String wechatid) throws WxErrorException {
JsonObject paramJson = new JsonObject();
paramJson.addProperty("wechatid", wechatid);
String response = post(API_BIND_TESTER, GSON.toJson(paramJson));
- return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaBindTesterResult.class);
}
/**
@@ -183,6 +208,57 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return WxMaGsonBuilder.create().fromJson(response, WxOpenMaTesterListResult.class);
}
+
+ /**
+ * 设置小程序隐私设置(是否可被搜索)
+ *
+ * @param status 1表示不可搜索,0表示可搜索
+ */
+ @Override
+ public WxOpenResult changeWxaSearchStatus(Integer status) throws WxErrorException {
+ JsonObject paramJson = new JsonObject();
+ paramJson.addProperty("status", status);
+ String response = post(API_CHANGE_WXA_SEARCH_STATUS, GSON.toJson(paramJson));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
+ /**
+ * 2. 查询小程序当前隐私设置(是否可被搜索)
+ */
+ @Override
+ public WxOpenMaSearchStatusResult getWxaSearchStatus() throws WxErrorException {
+ String response = get(API_GET_WXA_SEARCH_STATUS, null);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaSearchStatusResult.class);
+ }
+
+
+ /**
+ * 3.1 获取展示的公众号信息
+ */
+ @Override
+ public WxOpenMaShowItemResult getShowWxaItem() throws WxErrorException {
+ String response = get(API_GET_SHOW_WXA_ITEM, null);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaShowItemResult.class);
+ }
+
+
+ /**
+ * 3.2 设置展示的公众号
+ *
+ * @param flag 0 关闭,1 开启
+ * @param mpappid 如果开启,需要传新的公众号appid
+ */
+ @Override
+ public WxOpenResult updateShowwxaitem(Integer flag, String mpappid) throws WxErrorException {
+ JsonObject paramJson = new JsonObject();
+ paramJson.addProperty("wxa_subscribe_biz_flag", flag);
+ paramJson.addProperty("appid", mpappid);
+ String response = post(API_UPDATE_SHOW_WXA_ITEM, GSON.toJson(paramJson));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
/**
* 1、为授权的小程序帐号上传小程序代码
*
@@ -302,6 +378,23 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+
+ /**
+ * 10. 修改小程序线上代码的可见状态(仅供第三方代小程序调用)
+ *
+ * @param action 设置可访问状态,发布后默认可访问,close为不可见,open为可见
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult changeVisitstatus(String action) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("action", action);
+ String response = post(API_CHANGE_VISITSTATUS, GSON.toJson(params));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
/**
* 11. 小程序版本回退(仅供第三方代小程序调用)
*
@@ -314,6 +407,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
}
+
/**
* 15. 小程序审核撤回
*
@@ -330,7 +424,7 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
}
/**
- * 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用)
+ * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用)
*
* @return
* @throws WxErrorException
@@ -342,8 +436,21 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return response;
}
+
/**
- * 设置最低基础库版本(仅供第三方代小程序调用)
+ * 12. 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用)
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenMaWeappSupportVersionResult getSupportVersionInfo() throws WxErrorException {
+ String response = this.getSupportVersion();
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaWeappSupportVersionResult.class);
+ }
+
+ /**
+ * 13. 设置最低基础库版本(仅供第三方代小程序调用)
*
* @param version
* @return
@@ -357,6 +464,152 @@ public class WxOpenMaServiceImpl extends WxMaServiceImpl implements WxOpenMaServ
return response;
}
+
+ /**
+ * 13. 设置最低基础库版本(仅供第三方代小程序调用)
+ *
+ * @param version
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult setSupportVersionInfo(String version) throws WxErrorException {
+ String response = this.setSupportVersion(version);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
+ /**
+ * 16. 小程序分阶段发布 - 1)分阶段发布接口
+ *
+ * @param grayPercentage 灰度的百分比,1到100的整数
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult grayrelease(Integer grayPercentage) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("gray_percentage", grayPercentage);
+ String response = post(API_GRAY_RELEASE, GSON.toJson(params));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
+ /**
+ * 16. 小程序分阶段发布 - 2)取消分阶段发布
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+
+ public WxOpenResult revertgrayrelease() throws WxErrorException {
+ String response = get(API_REVERT_GRAY_RELEASE, null);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+
+ /**
+ * 16. 小程序分阶段发布 - 3)查询当前分阶段发布详情
+ *
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenMaGrayReleasePlanResult getgrayreleaseplan() throws WxErrorException {
+ String response = get(API_GET_GRAY_RELEASE_PLAN, null);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaGrayReleasePlanResult.class);
+ }
+
+
+ /**
+ * 查询服务商的当月提审限额和加急次数(Quota)
+ * https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/code/query_quota.html
+ */
+ @Override
+ public WxOpenMaQueryQuotaResult queryQuota() throws WxErrorException {
+ String response = get(API_QUERY_QUOTA, null);
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenMaQueryQuotaResult.class);
+ }
+
+
+
+ /**
+ * 加急审核申请
+ * 有加急次数的第三方可以通过该接口,对已经提审的小程序进行加急操作,加急后的小程序预计2-12小时内审完。
+ */
+ @Override
+ public Boolean speedAudit(Long auditid) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("auditid", auditid);
+ String response = post(API_SPEED_AUDIT, GSON.toJson(params));
+ WxOpenResult result = WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ return result.isSuccess();
+ }
+
+
+ /**
+ * (1)增加或修改二维码规则
+ * @param wxQrcodeJumpRule
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult addQrcodeJump(WxQrcodeJumpRule wxQrcodeJumpRule) throws WxErrorException {
+ String response = post(API_QRCODE_JUMP_ADD, GSON.toJson(wxQrcodeJumpRule));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ /**
+ * (2)获取已设置的二维码规则
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxGetQrcodeJumpResult getQrcodeJump() throws WxErrorException {
+ String response = post(API_QRCODE_JUMP_GET, "{}");
+ return WxMaGsonBuilder.create().fromJson(response, WxGetQrcodeJumpResult.class);
+ }
+
+ /**
+ * (3)获取校验文件名称及内容
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxDownlooadQrcodeJumpResult downloadQrcodeJump() throws WxErrorException {
+ String response = post(API_QRCODE_JUMP_DOWNLOAD, "{}");
+ return WxMaGsonBuilder.create().fromJson(response, WxDownlooadQrcodeJumpResult.class);
+ }
+
+ /**
+ * (4)删除已设置的二维码规则
+ * @param prefix
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult deleteQrcodeJump(String prefix) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("prefix", prefix);
+ String response = post(API_QRCODE_JUMP_DELETE, GSON.toJson(params));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
+ /**
+ * (5)发布已设置的二维码规则
+ * @param prefix
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public WxOpenResult publishQrcodeJump(String prefix) throws WxErrorException {
+ JsonObject params = new JsonObject();
+ params.addProperty("prefix", prefix);
+ String response = post(API_QRCODE_JUMP_PUBLISH, GSON.toJson(params));
+ return WxMaGsonBuilder.create().fromJson(response, WxOpenResult.class);
+ }
+
/**
* 将字符串对象转化为GsonArray对象
*
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
index 65dfef6e..b7084c9e 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenServiceAbstractImpl.java
@@ -1,10 +1,6 @@
package me.chanjar.weixin.open.api.impl;
-import java.io.IOException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestExecutor;
@@ -12,6 +8,10 @@ import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.open.api.WxOpenComponentService;
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
import me.chanjar.weixin.open.api.WxOpenService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
/**
* @author 007
@@ -44,7 +44,7 @@ public abstract class WxOpenServiceAbstractImpl implements WxOpenService,
protected synchronized T execute(RequestExecutor executor, String uri, E data) throws WxErrorException {
try {
- T result = executor.execute(uri, data);
+ T result = executor.execute(uri, data, WxType.Open);
this.log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uri, data, result);
return result;
} catch (WxErrorException e) {
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java
new file mode 100644
index 00000000..3fb380ed
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenGetResult.java
@@ -0,0 +1,27 @@
+package me.chanjar.weixin.open.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+
+import java.io.Serializable;
+
+/**
+ * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/api/account/get.html
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxOpenGetResult extends WxOpenResult implements Serializable {
+
+ private static final long serialVersionUID = -1196242565823312696L;
+
+ @SerializedName("open_appid")
+ private String openAppid;
+
+ public static WxOpenGetResult fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxOpenGetResult.class);
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java
similarity index 54%
rename from weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java
rename to weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java
index 1c0cbeb3..3c0d2bab 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/fastma/WxFastMaCategory.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxFastMaCategory.java
@@ -1,4 +1,4 @@
-package me.chanjar.weixin.open.bean.fastma;
+package me.chanjar.weixin.open.bean.ma;
import lombok.Data;
@@ -6,30 +6,32 @@ import java.io.Serializable;
import java.util.List;
/**
+ * 修改更新类目所需实体.
+ *
* @author Hipple
- * @description 修改更新类目所需实体
* @since 2019/1/25 10:49
*/
@Data
public class WxFastMaCategory implements Serializable {
+ private static final long serialVersionUID = 1595589596066509155L;
/**
- * 一级类目ID
+ * 一级类目ID.
*/
private int first;
/**
- * 二级类目ID
+ * 二级类目ID.
*/
private int second;
/**
- * 资质信息
+ * 资质信息.
*/
- private List certicates;
+ private List certicates;
@Data
- public static class certicaty {
+ public static class Certificate {
private String key;
private String value;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
index 66aebec3..e7a43894 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitExtInfo.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.open.bean.ma;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
@@ -14,6 +15,8 @@ import java.util.Map;
* 微信小程序三方平台代上传代码提交额外信息对象
*
* 如果代码中已经有配置,则配置的合并规则为:除了pages和tabBar.list直接覆盖原配置,其他都为插入或同级覆盖。
+ * extjson 详细说明
+ * https://developers.weixin.qq.com/miniprogram/dev/devtools/ext.html#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF%E5%BC%80%E5%8F%91
*
*
* @author yqx
@@ -31,6 +34,16 @@ public class WxMaOpenCommitExtInfo implements Serializable {
*/
private String extAppid;
+ /**
+ * 配置 ext.json 是否生效
+ */
+ private Boolean extEnable = Boolean.TRUE;
+
+ /**
+ * 是否直接提交到待审核列表
+ */
+ private Boolean directCommit = Boolean.FALSE;
+
@SerializedName("ext")
private Map extMap;
@@ -99,4 +112,8 @@ public class WxMaOpenCommitExtInfo implements Serializable {
public static WxMaOpenCommitExtInfo INSTANCE() {
return new WxMaOpenCommitExtInfo();
}
+
+ public String toJson() {
+ return WxOpenGsonBuilder.create().toJson(this);
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java
index 68d7cacb..48e1044d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenTab.java
@@ -18,4 +18,17 @@ public class WxMaOpenTab implements Serializable {
private String text;
private String iconPath;
private String selectedIconPath;
+
+ public WxMaOpenTab(@NonNull String pagePath, @NonNull String text) {
+ this.pagePath = pagePath;
+ this.text = text;
+ }
+
+
+ public WxMaOpenTab(@NonNull String pagePath, @NonNull String text, String iconPath, String selectedIconPath) {
+ this.pagePath = pagePath;
+ this.text = text;
+ this.iconPath = iconPath;
+ this.selectedIconPath = selectedIconPath;
+ }
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java
index 9c5fc4cc..f5f68df1 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxOpenMaCategory.java
@@ -1,11 +1,11 @@
package me.chanjar.weixin.open.bean.ma;
-import java.io.Serializable;
-
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+import java.io.Serializable;
+
/**
* 微信小程序分类目录.
*
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java
index a8d806b3..51698a9c 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenMaSubmitAuditMessage.java
@@ -16,6 +16,21 @@ import java.util.List;
@Data
public class WxOpenMaSubmitAuditMessage implements Serializable {
+ /**
+ * 提交审核项的一个列表(至少填写1项,至多填写5项)
+ */
@SerializedName("item_list")
private List itemList;
+
+ /**
+ * 反馈内容,不超过200字
+ */
+ @SerializedName("feedback_info")
+ private String feedbackInfo;
+
+ /**
+ * 图片media_id列表,中间用“丨”分割,xx丨yy丨zz,不超过5张图片, 其中 media_id 可以通过新增临时素材接口上传而得到
+ */
+ @SerializedName("feedback_stuff")
+ private String feedbackStuff;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
index 0473cc3c..bef7d16d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/message/WxOpenXmlMessage.java
@@ -58,48 +58,48 @@ public class WxOpenXmlMessage implements Serializable {
// 以下为快速创建小程序接口推送的的信息
- @XStreamAlias ("appid")
+ @XStreamAlias("appid")
private String registAppId;
- @XStreamAlias ("status")
+ @XStreamAlias("status")
private int status;
- @XStreamAlias ("auth_code")
+ @XStreamAlias("auth_code")
private String authCode;
- @XStreamAlias ("msg")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("msg")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String msg;
- @XStreamAlias ("info")
+ @XStreamAlias("info")
private Info info = new Info();
- @XStreamAlias ("info")
+ @XStreamAlias("info")
@Data
public static class Info implements Serializable {
private static final long serialVersionUID = 7706235740094081194L;
- @XStreamAlias ("name")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("name")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String name;
- @XStreamAlias ("code")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("code")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String code;
- @XStreamAlias ("code_type")
+ @XStreamAlias("code_type")
private int codeType;
- @XStreamAlias ("legal_persona_wechat")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("legal_persona_wechat")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String legalPersonaWechat;
- @XStreamAlias ("legal_persona_name")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("legal_persona_name")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String legalPersonaName;
- @XStreamAlias ("component_phone")
- @XStreamConverter (value = XStreamCDataConverter.class)
+ @XStreamAlias("component_phone")
+ @XStreamConverter(value = XStreamCDataConverter.class)
private String componentPhone;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java
new file mode 100644
index 00000000..3bdc532b
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxDownlooadQrcodeJumpResult.java
@@ -0,0 +1,30 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+
+/**
+ * 二维码规则的校验文件名称及内容
+ *
+ * @author hanwei59
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxDownlooadQrcodeJumpResult extends WxOpenResult {
+
+ //文件名称
+ @SerializedName("file_name")
+ private String fileName;
+
+ //文件内容
+ @SerializedName("file_content")
+ private String fileContent;
+
+ @Override
+ public String toString() {
+ return WxOpenGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
index b8bf8d83..11382889 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaAccountBasicInfoResult.java
@@ -5,60 +5,61 @@ 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;
+@EqualsAndHashCode(callSuper = true)
+public class WxFastMaAccountBasicInfoResult extends WxOpenResult {
+ private static final long serialVersionUID = -8713680081353954208L;
/**
* 小程序ID
*/
- @SerializedName ("appid")
+ @SerializedName("appid")
private String appId;
/**
* 帐号类型(1:订阅号,2:服务号,3:小程序)
*/
- @SerializedName ("account_type")
+ @SerializedName("account_type")
private Integer accountType;
/**
* 主体类型(1:企业)
*/
- @SerializedName ("principal_type")
+ @SerializedName("principal_type")
private Integer principalType;
/**
* 主体名称
*/
- @SerializedName ("principal_name")
+ @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")
+ @SerializedName("realname_status")
private Integer realnameStatus;
/**
* 微信认证信息
*/
- @SerializedName ("wx_verify_info")
+ @SerializedName("wx_verify_info")
private WxVerifyInfo wxVerifyInfo;
/**
* 功能介绍信息
*/
- @SerializedName ("signature_info")
+ @SerializedName("signature_info")
private SignatureInfo signatureInfo;
/**
* 头像信息
*/
- @SerializedName ("head_image_info")
+ @SerializedName("head_image_info")
private HeadImageInfo headImageInfo;
@Data
@@ -66,29 +67,29 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{
/**
* 是否资质认证(true:是,false:否)若是,拥有微信认证相关的权限
*/
- @SerializedName ("qualification_verify")
+ @SerializedName("qualification_verify")
private Boolean qualificationVerify;
/**
* 是否名称认证(true:是,false:否)对于公众号(订阅号、服务号),是名称认证,微信客户端才会有微信认证打勾的标识。
*/
- @SerializedName ("naming_verify")
+ @SerializedName("naming_verify")
private Boolean namingVerify;
/**
* 是否需要年审(true:是,false:否)(qualification_verify = true时才有该字段)
*/
- @SerializedName ("annual_review")
+ @SerializedName("annual_review")
private Boolean annualReview;
/**
* 年审开始时间,时间戳(qualification_verify = true时才有该字段)
*/
- @SerializedName ("annual_review_begin_time")
+ @SerializedName("annual_review_begin_time")
private String annualReviewBeginTime;
/**
* 年审截止时间,时间戳(qualification_verify = true时才有该字段)
*/
- @SerializedName ("annual_review_end_time")
+ @SerializedName("annual_review_end_time")
private String annualReviewEndTime;
}
@@ -98,17 +99,17 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{
/**
* 功能介绍
*/
- @SerializedName ("signature")
+ @SerializedName("signature")
private String signature;
/**
* 头像已使用修改次数(本月)
*/
- @SerializedName ("modify_used_count")
+ @SerializedName("modify_used_count")
private Integer modifyUsedCount;
/**
* 头像修改次数总额度(本月)
*/
- @SerializedName ("modify_quota")
+ @SerializedName("modify_quota")
private Integer modifyQuota;
}
@@ -118,18 +119,18 @@ public class WxFastMaAccountBasicInfoResult extends WxOpenResult{
/**
* 头像url
*/
- @SerializedName ("head_image_url")
+ @SerializedName("head_image_url")
private String headImageUrl;
/**
* 头像已使用修改次数(本月)
*/
- @SerializedName ("modify_used_count")
+ @SerializedName("modify_used_count")
private Integer modifyUsedCount;
/**
* 头像修改次数总额度(本月)
*/
- @SerializedName ("modify_quota")
+ @SerializedName("modify_quota")
private Integer modifyQuota;
}
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
index 11d6693c..825285a1 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaBeenSetCategoryResult.java
@@ -7,34 +7,35 @@ import lombok.EqualsAndHashCode;
import java.util.List;
/**
+ * 获取小程序已经设置的类目结果类.
+ *
* @author Hipple
- * @description 获取小程序已经设置的类目结果类
* @since 2019/1/26 18:27
*/
@Data
-@EqualsAndHashCode (callSuper = true)
+@EqualsAndHashCode(callSuper = true)
public class WxFastMaBeenSetCategoryResult extends WxOpenResult {
- private static final long serialVersionUID = - 7662344448437700644L;
+ private static final long serialVersionUID = -7662344448437700644L;
/**
* 一个更改周期内可以设置类目的次数
*/
- @SerializedName ("limit")
+ @SerializedName("limit")
private int limit;
/**
* 本更改周期内还可以设置类目的次数
*/
- @SerializedName ("quota")
+ @SerializedName("quota")
private int quota;
/**
* 最多可以设置的类目数量
*/
- @SerializedName ("category_limit")
+ @SerializedName("category_limit")
private int categoryLimit;
/**
* 类目
*/
- @SerializedName ("categories")
+ @SerializedName("categories")
private List categories;
@Data
@@ -42,32 +43,32 @@ public class WxFastMaBeenSetCategoryResult extends WxOpenResult {
/**
* 一级类目ID
*/
- @SerializedName ("first")
+ @SerializedName("first")
private int first;
/**
* 一级类目名称
*/
- @SerializedName ("first_name")
+ @SerializedName("first_name")
private String firstName;
/**
* 二级类目ID
*/
- @SerializedName ("second")
+ @SerializedName("second")
private int second;
/**
* 二级类目名称
*/
- @SerializedName ("second_name")
+ @SerializedName("second_name")
private String secondName;
/**
* 审核状态(1审核中 2审核不通过 3审核通过)
*/
- @SerializedName ("audit_status")
+ @SerializedName("audit_status")
private int auditStatus;
/**
* 审核不通过原因
*/
- @SerializedName ("audit_reason")
+ @SerializedName("audit_reason")
private String auditReason;
}
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
index 59d1f456..b3d0dd9d 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCanSetCategoryResult.java
@@ -2,25 +2,29 @@ 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:43
*/
@Data
+@EqualsAndHashCode(callSuper = false)
public class WxFastMaCanSetCategoryResult extends WxOpenResult {
- private static final long serialVersionUID = - 2469386233538980102L;
- @SerializedName ("errcode")
- private int errcodeX;
- @SerializedName ("categories_list")
+ private static final long serialVersionUID = -2469386233538980102L;
+ @SerializedName("errcode")
+ private int errCode;
+ @SerializedName("categories_list")
private CategoriesListBean categoriesList;
@Data
public static class CategoriesListBean {
private List categories;
+
@Data
public static class CategoriesBean {
private int id;
@@ -28,29 +32,29 @@ public class WxFastMaCanSetCategoryResult extends WxOpenResult {
private String name;
private int level;
private int father;
- @SerializedName ("sensitive_type")
+ @SerializedName("sensitive_type")
private int sensitiveType;
- @SerializedName ("available_for_plugin")
+ @SerializedName("available_for_plugin")
private boolean availableForPlugin;
- @SerializedName ("is_hidden")
+ @SerializedName("is_hidden")
private boolean isHidden;
private String type;
- @SerializedName ("need_report")
+ @SerializedName("need_report")
private int needReport;
- @SerializedName ("can_use_cityserivce")
- private int canUseCityserivce;
+ @SerializedName("can_use_cityserivce")
+ private int canUseCityService;
private List children;
- @SerializedName ("type_list")
+ @SerializedName("type_list")
private List> typeList;
- @SerializedName ("available_api_list")
+ @SerializedName("available_api_list")
private List> availableApiList;
private List> apis;
@Data
public static class QualifyBean {
private String remark;
- @SerializedName ("exter_list")
- private List> exterList;
+ @SerializedName("exter_list")
+ private List> externalList;
}
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
index 943645e3..eed76934 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaCheckNickameResult.java
@@ -5,25 +5,26 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
/**
+ * 微信认证名称检测结果类.
+ *
* @author Hipple
- * @description 微信认证名称检测结果类
* @since 2019/1/26 17:39
*/
@Data
-@EqualsAndHashCode (callSuper = true)
+@EqualsAndHashCode(callSuper = true)
public class WxFastMaCheckNickameResult extends WxOpenResult {
private static final long serialVersionUID = 8022192589710319473L;
/**
* 审核编号.
*/
- @SerializedName ("hit_condition")
+ @SerializedName("hit_condition")
boolean hitCondition;
/**
* 材料说明
*/
- @SerializedName ("wording")
+ @SerializedName("wording")
String wording;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
index 6594c483..fa8fd1d5 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaQueryNicknameStatusResult.java
@@ -5,11 +5,12 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
/**
+ * 查询改名状态实体类.
+ *
* @author Hipple
- * @description 查询改名状态实体类
* @since 2019/1/26 17:52
*/
-@EqualsAndHashCode (callSuper = true)
+@EqualsAndHashCode(callSuper = true)
@Data
public class WxFastMaQueryNicknameStatusResult extends WxOpenResult {
@@ -18,26 +19,26 @@ public class WxFastMaQueryNicknameStatusResult extends WxOpenResult {
/**
* 审核昵称
*/
- @SerializedName ("nickname")
+ @SerializedName("nickname")
private String nickname;
/**
* 审核状态,1:审核中,2:审核失败,3:审核成功
*/
- @SerializedName ("audit_stat")
+ @SerializedName("audit_stat")
private int auditStat;
/**
* 失败原因
*/
- @SerializedName ("fail_reason")
+ @SerializedName("fail_reason")
private String failReason;
/**
* 审核提交时间
*/
- @SerializedName ("create_time")
+ @SerializedName("create_time")
private String createTime;
/**
* 审核提交时间
*/
- @SerializedName ("audit_time")
+ @SerializedName("audit_time")
private String auditTime;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
index 7a2cab23..3beee9b2 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxFastMaSetNickameResult.java
@@ -5,25 +5,26 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
/**
+ * 设置小程序名称结果类.
+ *
* @author Hipple
- * @description 设置小程序名称结果类
* @since 2019/1/26 17:39
*/
@Data
-@EqualsAndHashCode (callSuper = true)
+@EqualsAndHashCode(callSuper = true)
public class WxFastMaSetNickameResult extends WxOpenResult {
private static final long serialVersionUID = 8022192589710319473L;
/**
* 审核编号.
*/
- @SerializedName ("audit_id")
+ @SerializedName("audit_id")
Long auditId;
/**
* 材料说明
*/
- @SerializedName ("wording")
+ @SerializedName("wording")
String wording;
}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java
new file mode 100644
index 00000000..f47e8be6
--- /dev/null
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxGetQrcodeJumpResult.java
@@ -0,0 +1,40 @@
+package me.chanjar.weixin.open.bean.result;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;
+
+import java.util.List;
+
+/**
+ * 已设置的二维码规则信息
+ *
+ * @author hanwei59
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WxGetQrcodeJumpResult extends WxOpenResult {
+
+ //二维码规则详情,数组形式
+ @SerializedName("rule_list")
+ List ruleList;
+
+ //是否已经打开二维码跳转链接设置
+ @SerializedName("qrcodejump_open")
+ private String qrcodejumpOpen;
+
+ //本月还可发布的次数
+ @SerializedName("qrcodejump_pub_quota")
+ private Integer qrcodejumpPubQuota;
+
+ //二维码规则数量
+ @SerializedName("list_size")
+ private Integer listSize;
+
+ @Override
+ public String toString() {
+ return WxOpenGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java
index afe9ea94..19f3ebde 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/result/WxOpenAuthorizerListResult.java
@@ -11,5 +11,5 @@ import java.util.Map;
@Data
public class WxOpenAuthorizerListResult {
private int totalCount;
- private List