From 038a16dbdcf9e0ecb0fc766282087bf6822db6eb Mon Sep 17 00:00:00 2001 From: 3y Date: Thu, 17 Aug 2023 21:36:33 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E8=8E=B7=E5=8F=96access?= =?UTF-8?q?Token=E7=9A=84=E4=BB=A3=E7=A0=81=202.=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E6=B8=A0=E9=81=93=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=9F=8B=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/AccessTokenPrefixConstant.java | 32 - .../austin/common/enums/AnchorState.java | 1137 ++++++++++++++++- .../austin/common/enums/ChannelType.java | 40 +- .../RefreshDingDingAccessTokenHandler.java | 8 +- .../RefreshGeTuiAccessTokenHandler.java | 8 +- .../impl/DingDingWorkNoticeHandler.java | 32 +- .../handler/impl/EnterpriseWeChatHandler.java | 8 +- .../impl/EnterpriseWeChatRobotHandler.java | 7 +- .../impl/MiniProgramAccountHandler.java | 31 +- .../handler/impl/OfficialAccountHandler.java | 11 +- .../handler/handler/impl/PushHandler.java | 28 +- .../austin/support/domain/ChannelAccount.java | 3 +- .../eventbus/EventBusSendMqServiceImpl.java | 1 - .../support/utils/AccessTokenUtils.java | 69 +- .../austin/support/utils/AccountUtils.java | 6 +- .../web/service/impl/MaterialServiceImpl.java | 12 +- 16 files changed, 1296 insertions(+), 137 deletions(-) delete mode 100644 austin-common/src/main/java/com/java3y/austin/common/constant/AccessTokenPrefixConstant.java diff --git a/austin-common/src/main/java/com/java3y/austin/common/constant/AccessTokenPrefixConstant.java b/austin-common/src/main/java/com/java3y/austin/common/constant/AccessTokenPrefixConstant.java deleted file mode 100644 index 61fe588..0000000 --- a/austin-common/src/main/java/com/java3y/austin/common/constant/AccessTokenPrefixConstant.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.java3y.austin.common.constant; - - -/** - * 发送账号的常量信息汇总 - * - * @author 3y - */ -public class AccessTokenPrefixConstant { - - /** - * 钉钉 工作应用消息 账号 - */ - public static final String DING_DING_ACCESS_TOKEN_PREFIX = "ding_ding_access_token_"; - - /** - * 个推PUSH 消息账号 - */ - public static final String GE_TUI_ACCESS_TOKEN_PREFIX = "ge_tui_access_token_"; - - /** - * 微信服务号 - */ - public static final String OFFICIAL_ACCOUNT_ACCESS_TOKEN_PREFIX = "official_account"; - - /** - * 微信小程序 - */ - public static final String MINI_PROGRAM_TOKEN_PREFIX = "mini_program"; - - -} diff --git a/austin-common/src/main/java/com/java3y/austin/common/enums/AnchorState.java b/austin-common/src/main/java/com/java3y/austin/common/enums/AnchorState.java index 6211313..9be2841 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/enums/AnchorState.java +++ b/austin-common/src/main/java/com/java3y/austin/common/enums/AnchorState.java @@ -15,6 +15,17 @@ import lombok.ToString; @AllArgsConstructor public enum AnchorState implements PowerfulEnum { + /** + * ************************************************************************************************ + * ************************************************************************************************ + * + * + * Austin系统内部的点位 + * + * ************************************************************************************************ + * ************************************************************************************************ + */ + /** * 消息接收成功(获取到请求) */ @@ -57,7 +68,1131 @@ public enum AnchorState implements PowerfulEnum { * 点击(下发的消息被点击) */ CLICK(64, "消息被点击"), - ; + + + /** + * ************************************************************************************************ + * ************************************************************************************************ + *

+ *

+ * 微信平台的点位 + *

+ * ************************************************************************************************ + * ************************************************************************************************ + */ + CODE_40001(40001, "不合法的secret参数;secret在应用详情/通讯录管理助手可查看"), + /** + * 无效的UserID. + */ + CODE_40003(40003, "无效的UserID"), + /** + * 不合法的媒体文件类型;不满足系统文件要求。参考:上传的媒体文件限制. + */ + CODE_40004(40004, "不合法的媒体文件类型;不满足系统文件要求。参考:上传的媒体文件限制"), + /** + * 不合法的type参数;合法的type取值,参考:上传临时素材. + */ + CODE_40005(40005, "不合法的type参数;合法的type取值,参考:上传临时素材"), + /** + * 不合法的文件大小;系统文件要求,参考:上传的媒体文件限制. + */ + CODE_40006(40006, "不合法的文件大小;系统文件要求,参考:上传的媒体文件限制"), + /** + * 不合法的media_id参数. + */ + CODE_40007(40007, "不合法的media_id参数"), + /** + * 不合法的msgtype参数;合法的msgtype取值,参考:消息类型. + */ + CODE_40008(40008, "不合法的msgtype参数;合法的msgtype取值,参考:消息类型"), + /** + * 上传图片大小不是有效值;图片大小的系统限制,参考上传的媒体文件限制. + */ + CODE_40009(40009, "上传图片大小不是有效值;图片大小的系统限制,参考上传的媒体文件限制"), + /** + * 上传视频大小不是有效值;视频大小的系统限制,参考上传的媒体文件限制. + */ + CODE_40011(40011, "上传视频大小不是有效值;视频大小的系统限制,参考上传的媒体文件限制"), + /** + * 不合法的CorpID;需确认CorpID是否填写正确,在 web管理端-设置 可查看. + */ + CODE_40013(40013, "不合法的CorpID;需确认CorpID是否填写正确,在 web管理端-设置 可查看"), + /** + * 不合法的access_token. + */ + CODE_40014(40014, "不合法的access_token"), + /** + * 不合法的按钮个数;菜单按钮1-3个. + */ + CODE_40016(40016, "不合法的按钮个数;菜单按钮1-3个"), + /** + * 不合法的按钮类型;支持的类型,参考:按钮类型. + */ + CODE_40017(40017, "不合法的按钮类型;支持的类型,参考:按钮类型"), + /** + * 不合法的按钮名字长度;长度应不超过16个字节. + */ + CODE_40018(40018, "不合法的按钮名字长度;长度应不超过16个字节"), + /** + * 不合法的按钮KEY长度;长度应不超过128字节. + */ + CODE_40019(40019, "不合法的按钮KEY长度;长度应不超过128字节"), + /** + * 不合法的按钮URL长度;长度应不超过1024字节. + */ + CODE_40020(40020, "不合法的按钮URL长度;长度应不超过1024字节"), + /** + * 不合法的子菜单级数;只能包含一级菜单和二级菜单. + */ + CODE_40022(40022, "不合法的子菜单级数;只能包含一级菜单和二级菜单"), + /** + * 不合法的子菜单按钮个数;子菜单按钮1-5个. + */ + CODE_40023(40023, "不合法的子菜单按钮个数;子菜单按钮1-5个"), + /** + * 不合法的子菜单按钮类型;支持的类型,参考:按钮类型. + */ + CODE_40024(40024, "不合法的子菜单按钮类型;支持的类型,参考:按钮类型"), + /** + * 不合法的子菜单按钮名字长度;支持的类型,参考:按钮类型. + */ + CODE_40025(40025, "不合法的子菜单按钮名字长度;支持的类型,参考:按钮类型"), + /** + * 不合法的子菜单按钮KEY长度;长度应不超过60个字节. + */ + CODE_40026(40026, "不合法的子菜单按钮KEY长度;长度应不超过60个字节"), + /** + * 不合法的子菜单按钮URL长度;长度应不超过1024字节. + */ + CODE_40027(40027, "不合法的子菜单按钮URL长度;长度应不超过1024字节"), + /** + * 不合法的oauth_code. + */ + CODE_40029(40029, "不合法的oauth_code"), + /** + * 不合法的UserID列表;指定的UserID列表,至少存在一个UserID不在通讯录中. + */ + CODE_40031(40031, "不合法的UserID列表;指定的UserID列表,至少存在一个UserID不在通讯录中"), + /** + * 不合法的UserID列表长度. + */ + CODE_40032(40032, "不合法的UserID列表长度"), + /** + * 不合法的请求字符;不能包含\\uxxxx格式的字符. + */ + CODE_40033(40033, "不合法的请求字符;不能包含\\uxxxx格式的字符"), + /** + * 不合法的参数. + */ + CODE_40035(40035, "不合法的参数"), + /** + * chatid不存在;会话需要先创建后,才可修改会话详情或者发起聊天. + */ + CODE_40050(40050, "chatid不存在;会话需要先创建后,才可修改会话详情或者发起聊天"), + /** + * 不合法的子菜单url域名. + */ + CODE_40054(40054, "不合法的子菜单url域名"), + /** + * 不合法的菜单url域名. + */ + CODE_40055(40055, "不合法的菜单url域名"), + /** + * 不合法的agentid. + */ + CODE_40056(40056, "不合法的agentid"), + /** + * 不合法的callbackurl或者callbackurl验证失败;可自助到开发调试工具重现. + */ + CODE_40057(40057, "不合法的callbackurl或者callbackurl验证失败;可自助到开发调试工具重现"), + /** + * 不合法的参数;传递参数不符合系统要求,需要参照具体API接口说明. + */ + CODE_40058(40058, "不合法的参数;传递参数不符合系统要求,需要参照具体API接口说明"), + /** + * 不合法的上报地理位置标志位;开关标志位只能填 0 或者 1. + */ + CODE_40059(40059, "不合法的上报地理位置标志位;开关标志位只能填 0 或者 1"), + /** + * 参数为空. + */ + CODE_40063(40063, "参数为空"), + /** + * 不合法的部门列表;部门列表为空,或者至少存在一个部门ID不存在于通讯录中. + */ + CODE_40066(40066, "不合法的部门列表;部门列表为空,或者至少存在一个部门ID不存在于通讯录中"), + /** + * 不合法的标签ID;标签ID未指定,或者指定的标签ID不存在. + */ + CODE_40068(40068, "不合法的标签ID;标签ID未指定,或者指定的标签ID不存在"), + /** + * 指定的标签范围结点全部无效. + */ + CODE_40070(40070, "指定的标签范围结点全部无效"), + /** + * 不合法的标签名字;标签名字已经存在. + */ + CODE_40071(40071, "不合法的标签名字;标签名字已经存在"), + /** + * 不合法的标签名字长度;不允许为空,最大长度限制为32个字(汉字或英文字母). + */ + CODE_40072(40072, "不合法的标签名字长度;不允许为空,最大长度限制为32个字(汉字或英文字母)"), + /** + * 不合法的openid;openid不存在,需确认获取来源. + */ + CODE_40073(40073, "不合法的openid;openid不存在,需确认获取来源"), + /** + * news消息不支持保密消息类型;图文消息支持保密类型需改用mpnews. + */ + CODE_40074(40074, "news消息不支持保密消息类型;图文消息支持保密类型需改用mpnews"), + /** + * 不合法的pre_auth_code参数;预授权码不存在,参考:获取预授权码. + */ + CODE_40077(40077, "不合法的pre_auth_code参数;预授权码不存在,参考:获取预授权码"), + /** + * 不合法的auth_code参数;需确认获取来源,并且只能消费一次. + */ + CODE_40078(40078, "不合法的auth_code参数;需确认获取来源,并且只能消费一次"), + /** + * 不合法的suite_secret;套件secret可在第三方管理端套件详情查看. + */ + CODE_40080(40080, "不合法的suite_secret;套件secret可在第三方管理端套件详情查看"), + /** + * 不合法的suite_token. + */ + CODE_40082(40082, "不合法的suite_token"), + /** + * 不合法的suite_id;suite_id不存在. + */ + CODE_40083(40083, "不合法的suite_id;suite_id不存在"), + /** + * 不合法的permanent_code参数. + */ + CODE_40084(40084, "不合法的permanent_code参数"), + /** + * 不合法的的suite_ticket参数;suite_ticket不存在或者已失效. + */ + CODE_40085(40085, "不合法的的suite_ticket参数;suite_ticket不存在或者已失效"), + /** + * 不合法的第三方应用appid;至少有一个不存在应用id. + */ + CODE_40086(40086, "不合法的第三方应用appid;至少有一个不存在应用id"), + /** + * jobid不存在;请检查 jobid 来源. + */ + CODE_40088(40088, "jobid不存在;请检查 jobid 来源"), + /** + * 批量任务的结果已清理;系统仅保存最近5次批量任务的结果。可在通讯录查看实际导入情况. + */ + CODE_40089(40089, "批量任务的结果已清理;系统仅保存最近5次批量任务的结果。可在通讯录查看实际导入情况"), + /** + * secret不合法;可能用了别的企业的secret. + */ + CODE_40091(40091, "secret不合法;可能用了别的企业的secret"), + /** + * 导入文件存在不合法的内容. + */ + CODE_40092(40092, "导入文件存在不合法的内容"), + /** + * 不合法的jsapi_ticket参数;ticket已失效,或者拼写错误. + */ + CODE_40093(40093, "不合法的jsapi_ticket参数;ticket已失效,或者拼写错误"), + /** + * 不合法的URL;缺少主页URL参数,或者URL不合法(链接需要带上协议头,以 http:// 或者 https:// 开头). + */ + CODE_40094(40094, "不合法的URL;缺少主页URL参数,或者URL不合法(链接需要带上协议头,以 http:// 或者 https:// 开头)"), + /** + * 不合法的外部联系人userid + */ + CODE_40096(40096, "不合法的外部联系人userid"), + /** + * 缺少access_token参数. + */ + CODE_41001(41001, "缺少access_token参数"), + /** + * 缺少corpid参数. + */ + CODE_41002(41002, "缺少corpid参数"), + /** + * 缺少secret参数. + */ + CODE_41004(41004, "缺少secret参数"), + /** + * 缺少media_id参数;media_id为调用接口必填参数,请确认是否有传递. + */ + CODE_41006(41006, "缺少media_id参数;media_id为调用接口必填参数,请确认是否有传递"), + /** + * 缺少auth code参数. + */ + CODE_41008(41008, "缺少auth code参数"), + /** + * 缺少userid参数. + */ + CODE_41009(41009, "缺少userid参数"), + /** + * 缺少url参数. + */ + CODE_41010(41010, "缺少url参数"), + /** + * 缺少agentid参数. + */ + CODE_41011(41011, "缺少agentid参数"), + /** + * 缺少 description 参数;发送文本卡片消息接口,description 是必填字段. + */ + CODE_41033(41033, "缺少 description 参数;发送文本卡片消息接口,description 是必填字段"), + /** + * 缺少title参数;发送图文消息,标题是必填参数。请确认参数是否有传递. + */ + CODE_41016(41016, "缺少title参数;发送图文消息,标题是必填参数。请确认参数是否有传递。"), + /** + * 缺少 department 参数. + */ + CODE_41019(41019, "缺少 department 参数"), + /** + * 缺少tagid参数. + */ + CODE_41017(41017, "缺少tagid参数"), + /** + * 缺少suite_id参数. + */ + CODE_41021(41021, "缺少suite_id参数"), + /** + * 缺少suite_access_token参数. + */ + CODE_41022(41022, "缺少suite_access_token参数"), + /** + * 缺少suite_ticket参数. + */ + CODE_41023(41023, "缺少suite_ticket参数"), + /** + * 缺少secret参数. + */ + CODE_41024(41024, "缺少secret参数"), + /** + * 缺少permanent_code参数. + */ + CODE_41025(41025, "缺少permanent_code参数"), + /** + * access_token已过期;access_token有时效性,需要重新获取一次. + */ + CODE_42001(42001, "access_token已过期;access_token有时效性,需要重新获取一次"), + /** + * pre_auth_code已过期;pre_auth_code有时效性,需要重新获取一次. + */ + CODE_42007(42007, "pre_auth_code已过期;pre_auth_code有时效性,需要重新获取一次"), + /** + * suite_access_token已过期;suite_access_token有时效性,需要重新获取一次. + */ + CODE_42009(42009, "suite_access_token已过期;suite_access_token有时效性,需要重新获取一次"), + /** + * 指定的userid未绑定微信或未关注微信插件;需要成员使用微信登录企业微信或者关注微信插件才能获取openid. + */ + CODE_43004(43004, "指定的userid未绑定微信或未关注微信插件;需要成员使用微信登录企业微信或者关注微信插件才能获取openid"), + /** + * 多媒体文件为空;上传格式参考:上传临时素材,确认header和body的内容正确. + */ + CODE_44001(44001, "多媒体文件为空;上传格式参考:上传临时素材,确认header和body的内容正确。"), + /** + * 文本消息content参数为空;发文本消息content为必填参数,且不能为空. + */ + CODE_44004(44004, "文本消息content参数为空;发文本消息content为必填参数,且不能为空"), + /** + * 多媒体文件大小超过限制;图片不可超过5M;音频不可超过5M;文件不可超过20M. + */ + CODE_45001(45001, "多媒体文件大小超过限制;图片不可超过5M;音频不可超过5M;文件不可超过20M"), + /** + * 消息内容大小超过限制. + */ + CODE_45002(45002, "消息内容大小超过限制"), + /** + * 应用description参数长度不符合系统限制;设置应用若带有description参数,则长度必须为4至120个字符. + */ + CODE_45004(45004, "应用description参数长度不符合系统限制;设置应用若带有description参数,则长度必须为4至120个字符"), + /** + * 语音播放时间超过限制;语音播放时长不能超过60秒. + */ + CODE_45007(45007, "语音播放时间超过限制;语音播放时长不能超过60秒"), + /** + * 图文消息的文章数量不符合系统限制;图文消息的文章数量不能超过8条. + */ + CODE_45008(45008, "图文消息的文章数量不符合系统限制;图文消息的文章数量不能超过8条"), + /** + * 接口调用超过限制. + */ + CODE_45009(45009, "接口调用超过限制"), + /** + * 应用name参数长度不符合系统限制;设置应用若带有name参数,则不允许为空,且不超过32个字符. + */ + CODE_45022(45022, "应用name参数长度不符合系统限制;设置应用若带有name参数,则不允许为空,且不超过32个字符"), + /** + * 帐号数量超过上限. + */ + CODE_45024(45024, "帐号数量超过上限"), + /** + * 触发删除用户数的保护;限制参考:全量覆盖成员. + */ + CODE_45026(45026, "触发删除用户数的保护;限制参考:全量覆盖成员"), + /** + * 图文消息author参数长度超过限制;最长64个字节. + */ + CODE_45032(45032, "图文消息author参数长度超过限制;最长64个字节"), + /** + * 接口并发调用超过限制. + */ + CODE_45033(45033, "接口并发调用超过限制"), + /** + * 菜单未设置;菜单需发布后才能获取到数据. + */ + CODE_46003(46003, "菜单未设置;菜单需发布后才能获取到数据"), + /** + * 指定的用户不存在;需要确认指定的用户存在于通讯录中. + */ + CODE_46004(46004, "指定的用户不存在;需要确认指定的用户存在于通讯录中"), + /** + * API接口无权限调用. + */ + CODE_48002(48002, "API接口无权限调用"), + /** + * 不合法的suite_id;确认suite_access_token由指定的suite_id生成. + */ + CODE_48003(48003, "不合法的suite_id;确认suite_access_token由指定的suite_id生成"), + /** + * 授权关系无效;可能是无授权或授权已被取消. + */ + CODE_48004(48004, "授权关系无效;可能是无授权或授权已被取消"), + /** + * API接口已废弃;接口已不再支持,建议改用新接口或者新方案. + */ + CODE_48005(48005, "API接口已废弃;接口已不再支持,建议改用新接口或者新方案"), + /** + * redirect_url未登记可信域名. + */ + CODE_50001(50001, "redirect_url未登记可信域名"), + /** + * 成员不在权限范围;请检查应用或管理组的权限范围. + */ + CODE_50002(50002, "成员不在权限范围;请检查应用或管理组的权限范围"), + /** + * 应用已禁用;禁用的应用无法使用API接口。可在”管理端-企业应用”启用应用. + */ + CODE_50003(50003, "应用已禁用;禁用的应用无法使用API接口。可在”管理端-企业应用”启用应用"), + /** + * 部门长度不符合限制;部门名称不能为空且长度不能超过32个字. + */ + CODE_60001(60001, "部门长度不符合限制;部门名称不能为空且长度不能超过32个字"), + /** + * 部门ID不存在;需要确认部门ID是否有带,并且存在通讯录中. + */ + CODE_60003(60003, "部门ID不存在;需要确认部门ID是否有带,并且存在通讯录中"), + /** + * 父部门不存在;需要确认父亲部门ID是否有带,并且存在通讯录中. + */ + CODE_60004(60004, "父部门不存在;需要确认父亲部门ID是否有带,并且存在通讯录中"), + /** + * 部门下存在成员;不允许删除有成员的部门. + */ + CODE_60005(60005, "部门下存在成员;不允许删除有成员的部门"), + /** + * 部门下存在子部门;不允许删除有子部门的部门. + */ + CODE_60006(60006, "部门下存在子部门;不允许删除有子部门的部门"), + /** + * 不允许删除根部门. + */ + CODE_60007(60007, "不允许删除根部门"), + /** + * 部门已存在;部门ID或者部门名称已存在. + */ + CODE_60008(60008, "部门已存在;部门ID或者部门名称已存在"), + /** + * 部门名称含有非法字符;不能含有 \\:?*“< >| 等字符. + */ + CODE_60009(60009, "部门名称含有非法字符;不能含有 \\ :?*“< >| 等字符"), + /** + * 部门存在循环关系. + */ + CODE_60010(60010, "部门存在循环关系"), + /** + * 指定的成员/部门/标签参数无权限. + */ + CODE_60011(60011, "指定的成员/部门/标签参数无权限"), + /** + * 不允许删除默认应用;默认应用的id为0. + */ + CODE_60012(60012, "不允许删除默认应用;默认应用的id为0"), + /** + * 访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表. + */ + CODE_60020(60020, "访问ip不在白名单之中;请确认访问ip是否在服务商白名单IP列表"), + /** + * 不允许修改第三方应用的主页 URL;第三方应用类型,不允许通过接口修改该应用的主页 URL. + */ + CODE_60028(60028, "不允许修改第三方应用的主页 URL;第三方应用类型,不允许通过接口修改该应用的主页 URL"), + /** + * UserID已存在. + */ + CODE_60102(60102, "UserID已存在"), + /** + * 手机号码不合法;长度不超过32位,字符仅支持数字,加号和减号. + */ + CODE_60103(60103, "手机号码不合法;长度不超过32位,字符仅支持数字,加号和减号"), + /** + * 手机号码已存在;同一个企业内,成员的手机号不能重复。建议更换手机号,或者更新已有的手机记录. + */ + CODE_60104(60104, "手机号码已存在;同一个企业内,成员的手机号不能重复。建议更换手机号,或者更新已有的手机记录。"), + /** + * 邮箱不合法;长度不超过64位,且为有效的email格式. + */ + CODE_60105(60105, "邮箱不合法;长度不超过64位,且为有效的email格式"), + /** + * 邮箱已存在;同一个企业内,成员的邮箱不能重复。建议更换邮箱,或者更新已有的邮箱记录. + */ + CODE_60106(60106, "邮箱已存在;同一个企业内,成员的邮箱不能重复。建议更换邮箱,或者更新已有的邮箱记录。"), + /** + * 微信号不合法;微信号格式由字母、数字、”-“、”_“组成,长度为 3-20 字节,首字符必须是字母或”-“或”_“. + */ + CODE_60107(60107, "微信号不合法;微信号格式由字母、数字、”-“、”_“组成,长度为 3-20 字节,首字符必须是字母或”-“或”_“"), + /** + * 用户所属部门数量超过限制;用户同时归属部门不超过20个. + */ + CODE_60110(60110, "用户所属部门数量超过限制;用户同时归属部门不超过20个"), + /** + * UserID不存在;UserID参数为空,或者不存在通讯录中. + */ + CODE_60111(60111, "UserID不存在;UserID参数为空,或者不存在通讯录中"), + /** + * 成员name参数不合法;不能为空,且不能超过64字符. + */ + CODE_60112(60112, "成员name参数不合法;不能为空,且不能超过64字符"), + /** + * 无效的部门id;部门不存在通讯录中. + */ + CODE_60123(60123, "无效的部门id;部门不存在通讯录中"), + /** + * 无效的父部门id;父部门不存在通讯录中. + */ + CODE_60124(60124, "无效的父部门id;父部门不存在通讯录中"), + /** + * 非法部门名字;不能为空,且不能超过64字节,且不能含有\\:*?”< >|等字符. + */ + CODE_60125(60125, "非法部门名字;不能为空,且不能超过64字节,且不能含有\\:*?”< >|等字符"), + /** + * 缺少department参数. + */ + CODE_60127(60127, "缺少department参数"), + /** + * 成员手机和邮箱都为空;成员手机和邮箱至少有个非空. + */ + CODE_60129(60129, "成员手机和邮箱都为空;成员手机和邮箱至少有个非空"), + /** + * 发票已被其他公众号锁定. + */ + CODE_72023(72023, "发票已被其他公众号锁定"), + /** + * 发票状态错误;reimburse_status状态错误,参考:更新发票状态. + */ + CODE_72024(72024, "发票状态错误;reimburse_status状态错误,参考:更新发票状态"), + /** + * 存在发票不属于该用户;只能批量更新该openid的发票,参考:批量更新发票状态. + */ + CODE_72037(72037, "存在发票不属于该用户;只能批量更新该openid的发票,参考:批量更新发票状态"), + /** + * 可信域名不正确,或者无ICP备案. + */ + CODE_80001(80001, "可信域名不正确,或者无ICP备案"), + /** + * 部门下的结点数超过限制(3W). + */ + CODE_81001(81001, "部门下的结点数超过限制(3W)"), + /** + * 部门最多15层. + */ + CODE_81002(81002, "部门最多15层"), + /** + * 无权限操作标签. + */ + CODE_81011(81011, "无权限操作标签"), + /** + * UserID、部门ID、标签ID全部非法或无权限. + */ + CODE_81013(81013, "UserID、部门ID、标签ID全部非法或无权限"), + /** + * 标签添加成员,单次添加user或party过多. + */ + CODE_81014(81014, "标签添加成员,单次添加user或party过多"), + /** + * 指定的成员/部门/标签全部无效. + */ + CODE_82001(82001, "指定的成员/部门/标签全部无效"), + /** + * 不合法的PartyID列表长度;发消息,单次不能超过100个部门. + */ + CODE_82002(82002, "不合法的PartyID列表长度;发消息,单次不能超过100个部门"), + /** + * 不合法的TagID列表长度;发消息,单次不能超过100个标签. + */ + CODE_82003(82003, "不合法的TagID列表长度;发消息,单次不能超过100个标签"), + /** + * 成员票据过期. + */ + CODE_84014(84014, "成员票据过期"), + /** + * 成员票据无效;确认user_ticket参数来源是否正确。参考接口:根据code获取成员信息. + */ + CODE_84015(84015, "成员票据无效;确认user_ticket参数来源是否正确。参考接口:根据code获取成员信息"), + /** + * 缺少templateid参数. + */ + CODE_84019(84019, "缺少templateid参数"), + /** + * templateid不存在;确认参数是否有带,并且已创建. + */ + CODE_84020(84020, "templateid不存在;确认参数是否有带,并且已创建"), + /** + * 缺少register_code参数. + */ + CODE_84021(84021, "缺少register_code参数"), + /** + * 无效的register_code参数. + */ + CODE_84022(84022, "无效的register_code参数"), + /** + * 不允许调用设置通讯录同步完成接口. + */ + CODE_84023(84023, "不允许调用设置通讯录同步完成接口"), + /** + * 无注册信息. + */ + CODE_84024(84024, "无注册信息"), + /** + * 不符合的state参数;必须是[a-zA-Z0-9]的参数值,长度不可超过128个字节. + */ + CODE_84025(84025, "不符合的state参数;必须是[a-zA-Z0-9]的参数值,长度不可超过128个字节"), + /** + * 缺少caller参数. + */ + CODE_84052(84052, "缺少caller参数"), + /** + * 缺少callee参数. + */ + CODE_84053(84053, "缺少callee参数"), + /** + * 缺少auth_corpid参数. + */ + CODE_84054(84054, "缺少auth_corpid参数"), + /** + * 超过拨打公费电话频率。排查方法:同一个客服5秒内只能调用api拨打一次公费电话 + */ + CODE_84055(84055, "超过拨打公费电话频率。排查方法:同一个客服5秒内只能调用api拨打一次公费电话"), + /** + * 被拨打用户安装应用时未授权拨打公费电话权限. + */ + CODE_84056(84056, "被拨打用户安装应用时未授权拨打公费电话权限"), + /** + * 公费电话余额不足. + */ + CODE_84057(84057, "公费电话余额不足"), + /** + * caller + */ + CODE_84058(84058, "caller 呼叫号码不支持"), + /** + * 号码非法. + */ + CODE_84059(84059, "号码非法"), + /** + * callee + */ + CODE_84060(84060, "callee 呼叫号码不支持"), + /** + * 不存在外部联系人的关系. + */ + CODE_84061(84061, "不存在外部联系人的关系"), + /** + * 未开启公费电话应用. + */ + CODE_84062(84062, "未开启公费电话应用"), + /** + * caller不存在. + */ + CODE_84063(84063, "caller不存在"), + /** + * callee不存在. + */ + CODE_84064(84064, "callee不存在"), + /** + * caller跟callee电话号码一致。排查方法:不允许自己拨打给自己 + */ + CODE_84065(84065, "caller跟callee电话号码一致。排查方法:不允许自己拨打给自己"), + /** + * 服务商拨打次数超过限制。排查方法:单个企业管理员,在一天(以上午10 + */ + CODE_84066(84066, "服务商拨打次数超过限制。排查方法:单个企业管理员,在一天(以上午10:00为起始时间)内,对应单个服务商,只能被呼叫【4】次。"), + /** + * 管理员收到的服务商公费电话个数超过限制。排查方法:单个企业管理员,在一天(以上午10 + */ + CODE_84067(84067, "管理员收到的服务商公费电话个数超过限制。排查方法:单个企业管理员,在一天(以上午10:00为起始时间)内,一共只能被【3】个服务商成功呼叫。"), + /** + * 拨打方被限制拨打公费电话. + */ + CODE_84069(84069, "拨打方被限制拨打公费电话"), + /** + * 不支持的电话号码。排查方法:拨打方或者被拨打方电话号码不支持 + */ + CODE_84070(84070, "不支持的电话号码。排查方法:拨打方或者被拨打方电话号码不支持"), + /** + * 不合法的外部联系人授权码。排查方法:非法或者已经消费过 + */ + CODE_84071(84071, "不合法的外部联系人授权码。排查方法:非法或者已经消费过"), + /** + * 应用未配置客服. + */ + CODE_84072(84072, "应用未配置客服"), + /** + * 客服userid不在应用配置的客服列表中. + */ + CODE_84073(84073, "客服userid不在应用配置的客服列表中"), + /** + * 没有外部联系人权限. + */ + CODE_84074(84074, "没有外部联系人权限"), + /** + * 不合法或过期的authcode. + */ + CODE_84075(84075, "不合法或过期的authcode"), + /** + * 缺失authcode. + */ + CODE_84076(84076, "缺失authcode"), + /** + * 订单价格过高,无法受理. + */ + CODE_84077(84077, "订单价格过高,无法受理"), + /** + * 购买人数不正确. + */ + CODE_84078(84078, "购买人数不正确"), + /** + * 价格策略不存在. + */ + CODE_84079(84079, "价格策略不存在"), + /** + * 订单不存在. + */ + CODE_84080(84080, "订单不存在"), + /** + * 存在未支付订单. + */ + CODE_84081(84081, "存在未支付订单"), + /** + * 存在申请退款中的订单. + */ + CODE_84082(84082, "存在申请退款中的订单"), + /** + * 非服务人员. + */ + CODE_84083(84083, "非服务人员"), + /** + * 非跟进用户. + */ + CODE_84084(84084, "非跟进用户"), + /** + * 应用已下架. + */ + CODE_84085(84085, "应用已下架"), + /** + * 订单人数超过可购买最大人数. + */ + CODE_84086(84086, "订单人数超过可购买最大人数"), + /** + * 打开订单支付前禁止关闭订单. + */ + CODE_84087(84087, "打开订单支付前禁止关闭订单"), + /** + * 禁止关闭已支付的订单. + */ + CODE_84088(84088, "禁止关闭已支付的订单"), + /** + * 订单已支付. + */ + CODE_84089(84089, "订单已支付"), + /** + * 缺失user_ticket. + */ + CODE_84090(84090, "缺失user_ticket"), + /** + * 订单价格不可低于下限. + */ + CODE_84091(84091, "订单价格不可低于下限"), + /** + * 无法发起代下单操作. + */ + CODE_84092(84092, "无法发起代下单操作"), + /** + * 代理关系已占用,无法代下单. + */ + CODE_84093(84093, "代理关系已占用,无法代下单"), + /** + * 该应用未配置代理分润规则,请先联系应用服务商处理. + */ + CODE_84094(84094, "该应用未配置代理分润规则,请先联系应用服务商处理"), + /** + * 免费试用版,无法扩容. + */ + CODE_84095(84095, "免费试用版,无法扩容"), + /** + * 免费试用版,无法续期. + */ + CODE_84096(84096, "免费试用版,无法续期"), + /** + * 当前企业有未处理订单. + */ + CODE_84097(84097, "当前企业有未处理订单"), + /** + * 固定总量,无法扩容. + */ + CODE_84098(84098, "固定总量,无法扩容"), + /** + * 非购买状态,无法扩容. + */ + CODE_84099(84099, "非购买状态,无法扩容"), + /** + * 未购买过此应用,无法续期. + */ + CODE_84100(84100, "未购买过此应用,无法续期"), + /** + * 企业已试用付费版本,无法全新购买. + */ + CODE_84101(84101, "企业已试用付费版本,无法全新购买"), + /** + * 企业当前应用状态已过期,无法扩容. + */ + CODE_84102(84102, "企业当前应用状态已过期,无法扩容"), + /** + * 仅可修改未支付订单. + */ + CODE_84103(84103, "仅可修改未支付订单"), + /** + * 订单已支付,无法修改. + */ + CODE_84104(84104, "订单已支付,无法修改"), + /** + * 订单已被取消,无法修改. + */ + CODE_84105(84105, "订单已被取消,无法修改"), + /** + * 企业含有该应用的待支付订单,无法代下单. + */ + CODE_84106(84106, "企业含有该应用的待支付订单,无法代下单"), + /** + * 企业含有该应用的退款中订单,无法代下单. + */ + CODE_84107(84107, "企业含有该应用的退款中订单,无法代下单"), + /** + * 企业含有该应用的待生效订单,无法代下单. + */ + CODE_84108(84108, "企业含有该应用的待生效订单,无法代下单"), + /** + * 订单定价不能未0. + */ + CODE_84109(84109, "订单定价不能未0"), + /** + * 新安装应用不在试用状态,无法升级为付费版. + */ + CODE_84110(84110, "新安装应用不在试用状态,无法升级为付费版"), + /** + * 无足够可用优惠券. + */ + CODE_84111(84111, "无足够可用优惠券"), + /** + * 无法关闭未支付订单. + */ + CODE_84112(84112, "无法关闭未支付订单"), + /** + * 无付费信息. + */ + CODE_84113(84113, "无付费信息"), + /** + * 虚拟版本不支持下单. + */ + CODE_84114(84114, "虚拟版本不支持下单"), + /** + * 虚拟版本不支持扩容. + */ + CODE_84115(84115, "虚拟版本不支持扩容"), + /** + * 虚拟版本不支持续期. + */ + CODE_84116(84116, "虚拟版本不支持续期"), + /** + * 在虚拟正式版期内不能扩容. + */ + CODE_84117(84117, "在虚拟正式版期内不能扩容"), + /** + * 虚拟正式版期内不能变更版本. + */ + CODE_84118(84118, "虚拟正式版期内不能变更版本"), + /** + * 当前企业未报备,无法进行代下单. + */ + CODE_84119(84119, "当前企业未报备,无法进行代下单"), + /** + * 当前应用版本已删除. + */ + CODE_84120(84120, "当前应用版本已删除"), + /** + * 应用版本已删除,无法扩容. + */ + CODE_84121(84121, "应用版本已删除,无法扩容"), + /** + * 应用版本已删除,无法续期. + */ + CODE_84122(84122, "应用版本已删除,无法续期"), + /** + * 非虚拟版本,无法升级. + */ + CODE_84123(84123, "非虚拟版本,无法升级"), + /** + * 非行业方案订单,不能添加部分应用版本的订单. + */ + CODE_84124(84124, "非行业方案订单,不能添加部分应用版本的订单"), + /** + * 购买人数不能少于最少购买人数. + */ + CODE_84125(84125, "购买人数不能少于最少购买人数"), + /** + * 购买人数不能多于最大购买人数. + */ + CODE_84126(84126, "购买人数不能多于最大购买人数"), + /** + * 无应用管理权限. + */ + CODE_84127(84127, "无应用管理权限"), + /** + * 无该行业方案下全部应用的管理权限. + */ + CODE_84128(84128, "无该行业方案下全部应用的管理权限"), + /** + * 付费策略已被删除,无法下单. + */ + CODE_84129(84129, "付费策略已被删除,无法下单"), + /** + * 订单生效时间不合法. + */ + CODE_84130(84130, "订单生效时间不合法"), + /** + * 文件转译解析错误。排查方法:只支持utf8文件转译,可能是不支持的文件类型或者格式 + */ + CODE_84200(84200, "文件转译解析错误。排查方法:只支持utf8文件转译,可能是不支持的文件类型或者格式"), + /** + * 包含不合法的词语. + */ + CODE_85002(85002, "包含不合法的词语"), + /** + * 每企业每个月设置的可信域名不可超过20个. + */ + CODE_85004(85004, "每企业每个月设置的可信域名不可超过20个"), + /** + * 可信域名未通过所有权校验. + */ + CODE_85005(85005, "可信域名未通过所有权校验"), + /** + * 参数 chatid 不合法. + */ + CODE_86001(86001, "参数 chatid 不合法"), + /** + * 参数 chatid 不存在. + */ + CODE_86003(86003, "参数 chatid 不存在"), + /** + * 参数 群名不合法. + */ + CODE_86004(86004, "参数 群名不合法"), + /** + * 参数 群主不合法. + */ + CODE_86005(86005, "参数 群主不合法"), + /** + * 群成员数过多或过少. + */ + CODE_86006(86006, "群成员数过多或过少"), + /** + * 不合法的群成员. + */ + CODE_86007(86007, "不合法的群成员"), + /** + * 非法操作非自己创建的群. + */ + CODE_86008(86008, "非法操作非自己创建的群"), + /** + * 存在非法会话成员ID. + */ + CODE_86216(86216, "存在非法会话成员ID"), + /** + * 会话发送者不在会话成员列表中;会话的发送者,必须是会话的成员列表之一. + */ + CODE_86217(86217, "会话发送者不在会话成员列表中;会话的发送者,必须是会话的成员列表之一"), + /** + * 指定的会话参数不合法. + */ + CODE_86220(86220, "指定的会话参数不合法"), + /** + * 未认证摇一摇周边. + */ + CODE_90001(90001, "未认证摇一摇周边"), + /** + * 缺少摇一摇周边ticket参数. + */ + CODE_90002(90002, "缺少摇一摇周边ticket参数"), + /** + * 摇一摇周边ticket参数不合法. + */ + CODE_90003(90003, "摇一摇周边ticket参数不合法"), + /** + * 非法的对外属性类型. + */ + CODE_90100(90100, "非法的对外属性类型"), + /** + * 对外属性:文本类型长度不合法;文本长度不可超过12个UTF8字符. + */ + CODE_90101(90101, "对外属性:文本类型长度不合法;文本长度不可超过12个UTF8字符"), + /** + * 对外属性:网页类型标题长度不合法;标题长度不可超过12个UTF8字符. + */ + CODE_90102(90102, "对外属性:网页类型标题长度不合法;标题长度不可超过12个UTF8字符"), + /** + * 对外属性:网页url不合法. + */ + CODE_90103(90103, "对外属性:网页url不合法"), + /** + * 对外属性:小程序类型标题长度不合法;标题长度不可超过12个UTF8字符. + */ + CODE_90104(90104, "对外属性:小程序类型标题长度不合法;标题长度不可超过12个UTF8字符"), + /** + * 对外属性:小程序类型pagepath不合法. + */ + CODE_90105(90105, "对外属性:小程序类型pagepath不合法"), + /** + * 对外属性:请求参数不合法. + */ + CODE_90106(90106, "对外属性:请求参数不合法"), + /** + * 获取ticket的类型无效. + */ + CODE_91040(91040, "获取ticket的类型无效"), + /** + * 无权限操作指定的应用. + */ + CODE_301002(301002, "无权限操作指定的应用"), + /** + * 不允许删除创建者;创建者不允许从通讯录中删除。如果需要删除该成员,需要先在WEB管理端转移创建者身份. + */ + CODE_301005(301005, "不允许删除创建者;创建者不允许从通讯录中删除。如果需要删除该成员,需要先在WEB管理端转移创建者身份。"), + /** + * 参数 position 不合法;长度不允许超过128个字符. + */ + CODE_301012(301012, "参数 position 不合法;长度不允许超过128个字符"), + /** + * 参数 telephone 不合法;telephone必须由1-32位的纯数字或’-‘号组成. + */ + CODE_301013(301013, "参数 telephone 不合法;telephone必须由1-32位的纯数字或’-‘号组成。"), + /** + * 参数 english_name 不合法;参数如果有传递,不允许为空字符串,同时不能超过64字节,只能是由字母、数字、点(.)、减号(-)、空格或下划线(_)组成. + */ + CODE_301014(301014, "参数 english_name 不合法;参数如果有传递,不允许为空字符串,同时不能超过64字节,只能是由字母、数字、点(.)、减号(-)、空格或下划线(_)组成"), + /** + * 参数 mediaid 不合法;请检查 mediaid 来源,应该通过上传临时素材的图片类型获得mediaid. + */ + CODE_301015(301015, "参数 mediaid 不合法;请检查 mediaid 来源,应该通过上传临时素材的图片类型获得mediaid"), + /** + * 上传语音文件不符合系统要求;语音文件的系统限制,参考上传的媒体文件限制. + */ + CODE_301016(301016, "上传语音文件不符合系统要求;语音文件的系统限制,参考上传的媒体文件限制"), + /** + * 上传语音文件仅支持AMR格式;语音文件的系统限制,参考上传的媒体文件限制. + */ + CODE_301017(301017, "上传语音文件仅支持AMR格式;语音文件的系统限制,参考上传的媒体文件限制"), + /** + * 参数 userid 无效;至少有一个userid不存在于通讯录中. + */ + CODE_301021(301021, "参数 userid 无效;至少有一个userid不存在于通讯录中"), + /** + * 获取打卡数据失败;系统失败,可重试处理. + */ + CODE_301022(301022, "获取打卡数据失败;系统失败,可重试处理"), + /** + * useridlist非法或超过限额;列表数量不能为0且不超过100. + */ + CODE_301023(301023, "useridlist非法或超过限额;列表数量不能为0且不超过100"), + /** + * 获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天. + */ + CODE_301024(301024, "获取打卡记录时间间隔超限;保证开始时间大于0 且结束时间大于 0 且结束时间大于开始时间,且间隔少于93天"), + /** + * 提交审批单请求参数错误 + */ + CODE_301025(301025, "提交审批单请求参数错误"), + /** + * 不允许更新该用户的userid. + */ + CODE_301036(301036, "不允许更新该用户的userid"), + /** + * 无审批应用权限,或者提单者不在审批应用/自建应用的可见范围 + */ + CODE_301055(301055, "无审批应用权限,或者提单者不在审批应用/自建应用的可见范围"), + /** + * 审批应用已停用 + */ + CODE_301056(301056, "审批应用已停用"), + /** + * 通用错误码,提交审批单内部接口失败 + */ + CODE_301057(301057, "通用错误码,提交审批单内部接口失败"), + /** + * 输入userid无对应成员 + */ + CODE_301069(301069, "输入userid无对应成员"), + /** + * 系统错误,请稍后再试 + */ + CODE_301070(301070, "系统错误,请稍后再试"), + /** + * 企业内有其他人员有相似人脸,此情况下人脸仍然会录入成功 + */ + CODE_301071(301071, "企业内有其他人员有相似人脸,此情况下人脸仍然会录入成功"), + /** + * 人脸图像数据错误请更换图片 + */ + CODE_301072(301072, "企业内有其他人员有相似人脸,此情况下人脸仍然会录入成功"), + /** + * 输入参数错误 + */ + CODE_301075(301075, "输入参数错误"), + /** + * 批量导入任务的文件中userid有重复. + */ + CODE_302003(302003, "批量导入任务的文件中userid有重复"), + /** + * 组织架构不合法(1不是一棵树,2 多个一样的partyid,3 partyid空,4 partyid name 空,5 同一个父节点下有两个子节点 部门名字一样 可能是以上情况,请一一排查). + */ + CODE_302004(302004, "组织架构不合法(1不是一棵树,2 多个一样的partyid,3 partyid空,4 partyid name 空,5 同一个父节点下有两个子节点 部门名字一样 可能是以上情况,请一一排查)"), + /** + * 批量导入系统失败,请重新尝试导入. + */ + CODE_302005(302005, "批量导入系统失败,请重新尝试导入"), + /** + * 批量导入任务的文件中partyid有重复. + */ + CODE_302006(302006, "批量导入任务的文件中partyid有重复"), + /** + * 批量导入任务的文件中,同一个部门下有两个子部门名字一样. + */ + CODE_302007(302007, "批量导入任务的文件中,同一个部门下有两个子部门名字一样"), + /** + * CorpId参数无效;指定的CorpId不存在. + */ + CODE_2000002(2000002, "CorpId参数无效;指定的CorpId不存在"); private final Integer code; diff --git a/austin-common/src/main/java/com/java3y/austin/common/enums/ChannelType.java b/austin-common/src/main/java/com/java3y/austin/common/enums/ChannelType.java index 2fe1f5c..78a2ae7 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/enums/ChannelType.java +++ b/austin-common/src/main/java/com/java3y/austin/common/enums/ChannelType.java @@ -23,51 +23,54 @@ public enum ChannelType implements PowerfulEnum { /** * IM(站内信) -- 未实现该渠道 */ - IM(10, "IM(站内信)", ImContentModel.class, "im"), + IM(10, "IM(站内信)", ImContentModel.class, "im", null, null), /** * push(通知栏) --安卓 已接入 个推 */ - PUSH(20, "push(通知栏)", PushContentModel.class, "push"), + PUSH(20, "push(通知栏)", PushContentModel.class, "push", "ge_tui_access_token_", 3600 * 24L), /** * sms(短信) -- 腾讯云、云片 */ - SMS(30, "sms(短信)", SmsContentModel.class, "sms"), + SMS(30, "sms(短信)", SmsContentModel.class, "sms", null, null), /** * email(邮件) -- QQ、163邮箱 */ - EMAIL(40, "email(邮件)", EmailContentModel.class, "email"), + EMAIL(40, "email(邮件)", EmailContentModel.class, "email", null, null), /** - * officialAccounts(微信服务号) -- 官方测试账号 + * officialAccounts(微信服务号) -- + * accessToken 交由 weixin-java-mp 组件管理,所以不设置expireTime */ - OFFICIAL_ACCOUNT(50, "officialAccounts(服务号)", OfficialAccountsContentModel.class, "official_accounts"), + OFFICIAL_ACCOUNT(50, "officialAccounts(服务号)", OfficialAccountsContentModel.class, "official_accounts", "official_account_", null), /** * miniProgram(微信小程序) + * accessToken 交由 weixin-java-miniapp 组件管理,所以不设置expireTime */ - MINI_PROGRAM(60, "miniProgram(小程序)", MiniProgramContentModel.class, "mini_program"), + MINI_PROGRAM(60, "miniProgram(小程序)", MiniProgramContentModel.class, "mini_program", "mini_program_", null), + /** * enterpriseWeChat(企业微信) */ - ENTERPRISE_WE_CHAT(70, "enterpriseWeChat(企业微信)", EnterpriseWeChatContentModel.class, "enterprise_we_chat"), + ENTERPRISE_WE_CHAT(70, "enterpriseWeChat(企业微信)", EnterpriseWeChatContentModel.class, "enterprise_we_chat", null, null), /** * dingDingRobot(钉钉机器人) */ - DING_DING_ROBOT(80, "dingDingRobot(钉钉机器人)", DingDingRobotContentModel.class, "ding_ding_robot"), + DING_DING_ROBOT(80, "dingDingRobot(钉钉机器人)", DingDingRobotContentModel.class, "ding_ding_robot", null, null), /** * dingDingWorkNotice(钉钉工作通知) */ - DING_DING_WORK_NOTICE(90, "dingDingWorkNotice(钉钉工作通知)", DingDingWorkContentModel.class, "ding_ding_work_notice"), + DING_DING_WORK_NOTICE(90, "dingDingWorkNotice(钉钉工作通知)", DingDingWorkContentModel.class, "ding_ding_work_notice", "ding_ding_access_token_", 3600 * 2L), /** * enterpriseWeChat(企业微信机器人) */ - ENTERPRISE_WE_CHAT_ROBOT(100, "enterpriseWeChat(企业微信机器人)", EnterpriseWeChatRobotContentModel.class, "enterprise_we_chat_robot"), + ENTERPRISE_WE_CHAT_ROBOT(100, "enterpriseWeChat(企业微信机器人)", EnterpriseWeChatRobotContentModel.class, "enterprise_we_chat_robot", null, null), /** * feiShuRoot(飞书机器人) */ - FEI_SHU_ROBOT(110, "feiShuRoot(飞书机器人)", FeiShuRobotContentModel.class, "fei_shu_robot"), + FEI_SHU_ROBOT(110, "feiShuRoot(飞书机器人)", FeiShuRobotContentModel.class, "fei_shu_robot", null, null), /** * alipayMiniProgram(支付宝小程序) */ - ALIPAY_MINI_PROGRAM(120, "alipayMiniProgram(支付宝小程序)", AlipayMiniProgramContentModel.class, "alipay_mini_program"), + ALIPAY_MINI_PROGRAM(120, "alipayMiniProgram(支付宝小程序)", AlipayMiniProgramContentModel.class, "alipay_mini_program", null, null), ; /** @@ -90,6 +93,17 @@ public enum ChannelType implements PowerfulEnum { */ private final String codeEn; + /** + * accessToken prefix + */ + private final String accessTokenPrefix; + + /** + * accessToken expire + * 单位秒 + */ + private final Long accessTokenExpire; + /** * 通过code获取class * diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java index c908130..e45c9c2 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshDingDingAccessTokenHandler.java @@ -2,7 +2,6 @@ package com.java3y.austin.cron.handler; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; import com.java3y.austin.common.enums.ChannelType; @@ -36,6 +35,9 @@ public class RefreshDingDingAccessTokenHandler { @Autowired private ChannelAccountDao channelAccountDao; + @Autowired + private AccessTokenUtils accessTokenUtils; + /** * 每小时请求一次接口刷新(以防失效) @@ -47,9 +49,9 @@ public class RefreshDingDingAccessTokenHandler { List accountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.DING_DING_WORK_NOTICE.getCode()); for (ChannelAccount channelAccount : accountList) { DingDingWorkNoticeAccount account = JSON.parseObject(channelAccount.getAccountConfig(), DingDingWorkNoticeAccount.class); - String accessToken = AccessTokenUtils.getDingDingAccessToken(account); + String accessToken = accessTokenUtils.getAccessToken(ChannelType.DING_DING_WORK_NOTICE.getCode(), channelAccount.getId().intValue(), account, true); if (StrUtil.isNotBlank(accessToken)) { - redisTemplate.opsForValue().set(AccessTokenPrefixConstant.DING_DING_ACCESS_TOKEN_PREFIX + channelAccount.getId(), accessToken); + redisTemplate.opsForValue().set(ChannelType.DING_DING_WORK_NOTICE.getAccessTokenPrefix() + channelAccount.getId(), accessToken); } } }); diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java index 300ebbb..f4b374d 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/handler/RefreshGeTuiAccessTokenHandler.java @@ -2,7 +2,6 @@ package com.java3y.austin.cron.handler; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.dto.account.GeTuiAccount; import com.java3y.austin.common.enums.ChannelType; @@ -36,6 +35,9 @@ public class RefreshGeTuiAccessTokenHandler { @Autowired private ChannelAccountDao channelAccountDao; + @Autowired + private AccessTokenUtils accessTokenUtils; + /** * 每小时请求一次接口刷新(以防失效) @@ -47,9 +49,9 @@ public class RefreshGeTuiAccessTokenHandler { List accountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.PUSH.getCode()); for (ChannelAccount channelAccount : accountList) { GeTuiAccount account = JSON.parseObject(channelAccount.getAccountConfig(), GeTuiAccount.class); - String accessToken = AccessTokenUtils.getGeTuiAccessToken(account); + String accessToken = accessTokenUtils.getAccessToken(ChannelType.PUSH.getCode(), channelAccount.getId().intValue(), account, true); if (StrUtil.isNotBlank(accessToken)) { - redisTemplate.opsForValue().set(AccessTokenPrefixConstant.GE_TUI_ACCESS_TOKEN_PREFIX + channelAccount.getId(), accessToken); + redisTemplate.opsForValue().set(ChannelType.PUSH.getAccessTokenPrefix() + channelAccount.getId(), accessToken); } } }); diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java index 10d19c4..840c26e 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java @@ -13,7 +13,6 @@ import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response; import com.dingtalk.api.response.OapiMessageCorpconversationGetsendresultResponse; import com.dingtalk.api.response.OapiMessageCorpconversationRecallResponse; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.AustinConstant; import com.java3y.austin.common.constant.SendChanelUrlConstant; import com.java3y.austin.common.domain.LogParam; @@ -54,6 +53,8 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { @Autowired private AccountUtils accountUtils; @Autowired + private AccessTokenUtils accessTokenUtils; + @Autowired private StringRedisTemplate redisTemplate; @Autowired private LogUtils logUtils; @@ -69,8 +70,9 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { public boolean handler(TaskInfo taskInfo) { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), DingDingWorkNoticeAccount.class); + String accessToken = accessTokenUtils.getAccessToken(taskInfo.getSendChannel(), taskInfo.getSendAccount(), account, false); + OapiMessageCorpconversationAsyncsendV2Request request = assembleParam(account, taskInfo); - String accessToken = getAccessToken(account, Long.valueOf(taskInfo.getSendAccount())); OapiMessageCorpconversationAsyncsendV2Response response = new DefaultDingTalkClient(SendChanelUrlConstant.DING_DING_SEND_URL).execute(request, accessToken); // 发送成功后记录TaskId,用于消息撤回(支持当天的) @@ -179,7 +181,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { public void pull(Long accountId) { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(accountId.intValue(), DingDingWorkNoticeAccount.class); - String accessToken = getAccessToken(account, accountId); + String accessToken = accessTokenUtils.getAccessToken(ChannelType.DING_DING_WORK_NOTICE.getCode(), accountId.intValue(), account, false); DingTalkClient client = new DefaultDingTalkClient(SendChanelUrlConstant.DING_DING_PULL_URL); OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest(); req.setAgentId(Long.valueOf(account.getAgentId())); @@ -205,7 +207,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { try { DingDingWorkNoticeAccount account = accountUtils.getAccountById(recallTaskInfo.getSendAccount(), DingDingWorkNoticeAccount.class); - String accessToken = getAccessToken(account, Long.valueOf(recallTaskInfo.getSendAccount())); + String accessToken = accessTokenUtils.getAccessToken(recallTaskInfo.getSendChannel(), recallTaskInfo.getSendAccount(), account, false); // 优先去除messageId,如果未传入messageId,则按照模板id去除 if (CollUtil.isNotEmpty(recallTaskInfo.getRecallMessageId())) { @@ -241,27 +243,5 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { OapiMessageCorpconversationRecallResponse rsp = client.execute(req, accessToken); logUtils.print(LogParam.builder().bizType(RECALL_BIZ_TYPE).object(JSON.toJSONString(rsp)).build()); } - - /** - * 获取第三方token - * - * @param account 钉钉工作消息 账号信息 - * @param accountId 账号ID - * @return token - */ - private String getAccessToken(DingDingWorkNoticeAccount account, Long accountId) { - String accessToken = redisTemplate.opsForValue().get(AccessTokenPrefixConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); - if (StrUtil.isNotBlank(accessToken)) { - return accessToken; - } - accessToken = AccessTokenUtils.getDingDingAccessToken(account); - if (StrUtil.isNotBlank(accessToken)) { - redisTemplate.opsForValue().set(AccessTokenPrefixConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId, accessToken); - } else { - log.error("DingDingWorkNoticeHandler#getAccessToken fail accessToken{} accountId{} ", accessToken, accountId); - } - return accessToken; - } - } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatHandler.java index 9e2c136..2a71b06 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatHandler.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; import com.java3y.austin.common.constant.AustinConstant; import com.java3y.austin.common.constant.CommonConstant; +import com.java3y.austin.common.domain.AnchorInfo; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.model.EnterpriseWeChatContentModel; @@ -13,6 +14,7 @@ import com.java3y.austin.common.enums.SendMessageType; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.utils.AccountUtils; +import com.java3y.austin.support.utils.LogUtils; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxMpErrorMsgEnum; import me.chanjar.weixin.cp.api.WxCpService; @@ -40,6 +42,8 @@ public class EnterpriseWeChatHandler extends BaseHandler implements Handler { @Autowired private AccountUtils accountUtils; + @Autowired + private LogUtils logUtils; public EnterpriseWeChatHandler() { channelCode = ChannelType.ENTERPRISE_WE_CHAT.getCode(); @@ -54,8 +58,8 @@ public class EnterpriseWeChatHandler extends BaseHandler implements Handler { if (Integer.valueOf(WxMpErrorMsgEnum.CODE_0.getCode()).equals(result.getErrCode())) { return true; } - // 常见的错误 应当 关联至 AnchorState,由austin后台统一透出失败原因 - log.error("EnterpriseWeChatHandler#handler fail!result:{},params:{}", JSON.toJSONString(result), JSON.toJSONString(taskInfo)); + logUtils.print(AnchorInfo.builder().bizId(taskInfo.getBizId()).messageId(taskInfo.getMessageId()).businessId(taskInfo.getBusinessId()) + .ids(taskInfo.getReceiver()).state(result.getErrCode()).build()); } catch (Exception e) { log.error("EnterpriseWeChatHandler#handler fail:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo)); diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatRobotHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatRobotHandler.java index d6b3d34..b6838a0 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatRobotHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/EnterpriseWeChatRobotHandler.java @@ -5,6 +5,7 @@ import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; +import com.java3y.austin.common.domain.AnchorInfo; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.account.EnterpriseWeChatRobotAccount; @@ -16,6 +17,7 @@ import com.java3y.austin.handler.domain.wechat.robot.EnterpriseWeChatRootResult; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.utils.AccountUtils; +import com.java3y.austin.support.utils.LogUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -33,6 +35,8 @@ public class EnterpriseWeChatRobotHandler extends BaseHandler implements Handler @Autowired private AccountUtils accountUtils; + @Autowired + private LogUtils logUtils; public EnterpriseWeChatRobotHandler() { channelCode = ChannelType.ENTERPRISE_WE_CHAT_ROBOT.getCode(); @@ -51,7 +55,8 @@ public class EnterpriseWeChatRobotHandler extends BaseHandler implements Handler if (weChatRootResult.getErrcode() == 0) { return true; } - log.error("EnterpriseWeChatRobotHandler#handler fail! result:{},params:{}", JSON.toJSONString(weChatRootResult), JSON.toJSONString(taskInfo)); + logUtils.print(AnchorInfo.builder().bizId(taskInfo.getBizId()).messageId(taskInfo.getMessageId()).businessId(taskInfo.getBusinessId()) + .ids(taskInfo.getReceiver()).state(weChatRootResult.getErrcode()).build()); } catch (Exception e) { log.error("EnterpriseWeChatRobotHandler#handler fail!e:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo)); } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/MiniProgramAccountHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/MiniProgramAccountHandler.java index 8539e5b..5fcc04c 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/MiniProgramAccountHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/MiniProgramAccountHandler.java @@ -4,6 +4,8 @@ import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; +import com.google.common.collect.Sets; +import com.java3y.austin.common.domain.AnchorInfo; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.model.MiniProgramContentModel; @@ -11,7 +13,9 @@ import com.java3y.austin.common.enums.ChannelType; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.utils.AccountUtils; +import com.java3y.austin.support.utils.LogUtils; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -29,6 +33,8 @@ import java.util.Set; public class MiniProgramAccountHandler extends BaseHandler implements Handler { @Autowired private AccountUtils accountUtils; + @Autowired + private LogUtils logUtils; public MiniProgramAccountHandler() { channelCode = ChannelType.MINI_PROGRAM.getCode(); @@ -36,17 +42,24 @@ public class MiniProgramAccountHandler extends BaseHandler implements Handler { @Override public boolean handler(TaskInfo taskInfo) { - MiniProgramContentModel contentModel = (MiniProgramContentModel) taskInfo.getContentModel(); - WxMaService wxMaService = accountUtils.getAccountById(taskInfo.getSendAccount(), WxMaService.class); - List wxMaSubscribeMessages = assembleReq(taskInfo.getReceiver(), contentModel); - for (WxMaSubscribeMessage message : wxMaSubscribeMessages) { - try { - wxMaService.getSubscribeService().sendSubscribeMsg(message); - } catch (Exception e) { - log.info("MiniProgramAccountHandler#handler fail! param:{},e:{}", JSON.toJSONString(taskInfo), Throwables.getStackTraceAsString(e)); + try { + MiniProgramContentModel contentModel = (MiniProgramContentModel) taskInfo.getContentModel(); + WxMaService wxMaService = accountUtils.getAccountById(taskInfo.getSendAccount(), WxMaService.class); + List wxMaSubscribeMessages = assembleReq(taskInfo.getReceiver(), contentModel); + for (WxMaSubscribeMessage message : wxMaSubscribeMessages) { + try { + wxMaService.getSubscribeService().sendSubscribeMsg(message); + } catch (WxErrorException e) { + logUtils.print(AnchorInfo.builder().bizId(taskInfo.getBizId()).messageId(taskInfo.getMessageId()).businessId(taskInfo.getBusinessId()) + .ids(Sets.newHashSet(message.getToUser())).state(e.getError().getErrorCode()).build()); + } } + return true; + } catch (Exception e) { + log.error("MiniProgramAccountHandler#handler fail:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo)); } - return true; + + return false; } /** diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java index fcd1e37..799fa17 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/OfficialAccountHandler.java @@ -2,6 +2,8 @@ package com.java3y.austin.handler.handler.impl; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; +import com.google.common.collect.Sets; +import com.java3y.austin.common.domain.AnchorInfo; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.model.OfficialAccountsContentModel; @@ -9,7 +11,9 @@ import com.java3y.austin.common.enums.ChannelType; import com.java3y.austin.handler.handler.BaseHandler; import com.java3y.austin.handler.handler.Handler; import com.java3y.austin.support.utils.AccountUtils; +import com.java3y.austin.support.utils.LogUtils; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; @@ -31,6 +35,8 @@ public class OfficialAccountHandler extends BaseHandler implements Handler { @Autowired private AccountUtils accountUtils; + @Autowired + private LogUtils logUtils; public OfficialAccountHandler() { channelCode = ChannelType.OFFICIAL_ACCOUNT.getCode(); @@ -45,8 +51,9 @@ public class OfficialAccountHandler extends BaseHandler implements Handler { for (WxMpTemplateMessage message : messages) { try { wxMpService.getTemplateMsgService().sendTemplateMsg(message); - } catch (Exception e) { - log.info("OfficialAccountHandler#handler fail! param:{},e:{}", JSON.toJSONString(taskInfo), Throwables.getStackTraceAsString(e)); + } catch (WxErrorException e) { + logUtils.print(AnchorInfo.builder().bizId(taskInfo.getBizId()).messageId(taskInfo.getMessageId()).businessId(taskInfo.getBusinessId()) + .ids(Sets.newHashSet(message.getToUser())).state(e.getError().getErrorCode()).build()); } } return true; diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java index ce7bcf1..a402c6d 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java @@ -2,13 +2,11 @@ package com.java3y.austin.handler.handler.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.http.ContentType; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.SendChanelUrlConstant; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; @@ -25,7 +23,6 @@ import com.java3y.austin.support.utils.AccessTokenUtils; import com.java3y.austin.support.utils.AccountUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.Set; @@ -48,7 +45,7 @@ public class PushHandler extends BaseHandler implements Handler { @Autowired private AccountUtils accountUtils; @Autowired - private StringRedisTemplate redisTemplate; + private AccessTokenUtils accessTokenUtils; @Override @@ -56,7 +53,7 @@ public class PushHandler extends BaseHandler implements Handler { try { GeTuiAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), GeTuiAccount.class); - String token = getAccessToken(taskInfo, account); + String token = accessTokenUtils.getAccessToken(taskInfo.getSendChannel(), taskInfo.getSendAccount(), account, false); PushParam pushParam = PushParam.builder().token(token).appId(account.getAppId()).taskInfo(taskInfo).build(); String result; @@ -143,27 +140,6 @@ public class PushHandler extends BaseHandler implements Handler { return taskId; } - /** - * 获取第三方token - * - * @param taskInfo 发送任务信息 - * @param account 个推账号时的元信息 - * @return token - */ - private String getAccessToken(TaskInfo taskInfo, GeTuiAccount account) { - String token = redisTemplate.opsForValue().get(AccessTokenPrefixConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); - if (StrUtil.isNotBlank(token)) { - return token; - } - token = AccessTokenUtils.getGeTuiAccessToken(account); - if (StrUtil.isNotBlank(token)) { - redisTemplate.opsForValue().set(AccessTokenPrefixConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount(), token); - } else { - log.error("PushHandler#getAccessToken fail taskInfo:{} account:{}", taskInfo, account); - } - return token; - } - private SendPushParam assembleParam(PushContentModel pushContentModel) { return assembleParam(pushContentModel, null); } diff --git a/austin-support/src/main/java/com/java3y/austin/support/domain/ChannelAccount.java b/austin-support/src/main/java/com/java3y/austin/support/domain/ChannelAccount.java index be0047e..fc72ccf 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/domain/ChannelAccount.java +++ b/austin-support/src/main/java/com/java3y/austin/support/domain/ChannelAccount.java @@ -30,7 +30,8 @@ public class ChannelAccount { /** * 发送渠道 - * 枚举值:com.java3y.austin.common.enums.ChannelType + * + * @see com.java3y.austin.common.enums.ChannelType */ private Integer sendChannel; diff --git a/austin-support/src/main/java/com/java3y/austin/support/mq/eventbus/EventBusSendMqServiceImpl.java b/austin-support/src/main/java/com/java3y/austin/support/mq/eventbus/EventBusSendMqServiceImpl.java index 04ffbf2..e5d3a28 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/mq/eventbus/EventBusSendMqServiceImpl.java +++ b/austin-support/src/main/java/com/java3y/austin/support/mq/eventbus/EventBusSendMqServiceImpl.java @@ -5,7 +5,6 @@ import com.google.common.eventbus.EventBus; import com.java3y.austin.common.domain.RecallTaskInfo; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.support.constans.MessageQueuePipeline; -import com.java3y.austin.support.domain.MessageTemplate; import com.java3y.austin.support.mq.SendMqService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java b/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java index 2a0417a..a88a00c 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/AccessTokenUtils.java @@ -1,5 +1,6 @@ package com.java3y.austin.support.utils; +import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.ContentType; import cn.hutool.http.Header; @@ -14,9 +15,16 @@ import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.constant.SendChanelUrlConstant; import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; import com.java3y.austin.common.dto.account.GeTuiAccount; +import com.java3y.austin.common.enums.ChannelType; +import com.java3y.austin.common.enums.EnumUtil; import com.java3y.austin.support.dto.GeTuiTokenResultDTO; import com.java3y.austin.support.dto.QueryTokenParamDTO; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; /** * 获取第三发token工具类 @@ -24,21 +32,65 @@ import lombok.extern.slf4j.Slf4j; * @author wuhui */ @Slf4j +@Component public class AccessTokenUtils { + @Autowired + private StringRedisTemplate redisTemplate; + + /** + * 获取 对应渠道的accessToken + * 1,redis存在,则直接从redis取 + * 2,redis不存在,调用底层方法去获取accessToken,并加入到redis中 + * + * @param sendChannel + * @param accountId 账号Id(数据库的主键) + * @param account 渠道的对应的账号详情 + * @param refresh 是否要强制刷新现有的缓存accessToken + * @return + * @see com.java3y.austin.common.enums.ChannelType + */ + public String getAccessToken(Integer sendChannel, Integer accountId, Object account, Boolean refresh) { + String resultToken = ""; + + // expireTime跟渠道的accessToken失效有关(个推accessToken默认有效是1天,钉钉工作消息默认有效是2小时) + String accessTokenPrefix = EnumUtil.getEnumByCode(sendChannel, ChannelType.class).getAccessTokenPrefix(); + Long expireTime = EnumUtil.getEnumByCode(sendChannel, ChannelType.class).getAccessTokenExpire(); + + try { + resultToken = redisTemplate.opsForValue().get(accessTokenPrefix + accountId); + if (StrUtil.isNotBlank(resultToken) && !refresh) { + return resultToken; + } + if (ChannelType.DING_DING_WORK_NOTICE.getCode().equals(sendChannel)) { + resultToken = getDingDingAccessToken(account); + } else if (ChannelType.PUSH.getCode().equals(sendChannel)) { + resultToken = getGeTuiAccessToken(account); + } + if (StrUtil.isNotBlank(resultToken)) { + redisTemplate.opsForValue().set(accessTokenPrefix + accountId, resultToken, expireTime, TimeUnit.SECONDS); + } + } catch (Exception e) { + log.error("AccessTokenUtils#getAccessToken fail,sendChannel:[{}],accountId:[{}],error mgs:{}", sendChannel, accountId, Throwables.getStackTraceAsString(e)); + } + return resultToken; + + } + /** * 获取钉钉 access_token * * @param account 钉钉工作消息 账号信息 * @return 钉钉 access_token */ - public static String getDingDingAccessToken(DingDingWorkNoticeAccount account) { + private String getDingDingAccessToken(Object account) { String accessToken = ""; try { + DingDingWorkNoticeAccount dingWorkNoticeAccount = (DingDingWorkNoticeAccount) account; DingTalkClient client = new DefaultDingTalkClient(SendChanelUrlConstant.DING_DING_TOKEN_URL); OapiGettokenRequest req = new OapiGettokenRequest(); - req.setAppkey(account.getAppKey()); - req.setAppsecret(account.getAppSecret()); + req.setAppkey(dingWorkNoticeAccount.getAppKey()); + req.setAppsecret(dingWorkNoticeAccount.getAppSecret()); req.setHttpMethod(CommonConstant.REQUEST_METHOD_GET); OapiGettokenResponse rsp = client.execute(req); accessToken = rsp.getAccessToken(); @@ -54,20 +106,21 @@ public class AccessTokenUtils { * @param account 创建个推账号时的元信息 * @return 个推的 access_token */ - public static String getGeTuiAccessToken(GeTuiAccount account) { + private String getGeTuiAccessToken(Object account) { String accessToken = ""; try { - String url = SendChanelUrlConstant.GE_TUI_BASE_URL + account.getAppId() + SendChanelUrlConstant.GE_TUI_AUTH; + GeTuiAccount geTuiAccount = (GeTuiAccount) account; + String url = SendChanelUrlConstant.GE_TUI_BASE_URL + geTuiAccount.getAppId() + SendChanelUrlConstant.GE_TUI_AUTH; String time = String.valueOf(System.currentTimeMillis()); - String digest = SecureUtil.sha256().digestHex(account.getAppKey() + time + account.getMasterSecret()); + String digest = SecureUtil.sha256().digestHex(geTuiAccount.getAppKey() + time + geTuiAccount.getMasterSecret()); QueryTokenParamDTO param = QueryTokenParamDTO.builder() .timestamp(time) - .appKey(account.getAppKey()) + .appKey(geTuiAccount.getAppKey()) .sign(digest).build(); String body = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue()) .body(JSON.toJSONString(param)) - .timeout(20000) + .timeout(2000) .execute().body(); GeTuiTokenResultDTO geTuiTokenResultDTO = JSON.parseObject(body, GeTuiTokenResultDTO.class); if (geTuiTokenResultDTO.getCode().equals(0)) { diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java index f2a983a..df910e6 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java @@ -6,7 +6,6 @@ import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.dto.account.WeChatMiniProgramAccount; import com.java3y.austin.common.dto.account.WeChatOfficialAccount; @@ -16,7 +15,6 @@ import com.java3y.austin.support.dao.ChannelAccountDao; import com.java3y.austin.support.domain.ChannelAccount; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; - import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; @@ -121,7 +119,7 @@ public class AccountUtils { */ public WxMpService initOfficialAccountService(WeChatOfficialAccount officialAccount) { WxMpService wxMpService = new WxMpServiceImpl(); - WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(redisTemplateWxRedisOps(), AccessTokenPrefixConstant.OFFICIAL_ACCOUNT_ACCESS_TOKEN_PREFIX); + WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(redisTemplateWxRedisOps(), ChannelType.ENTERPRISE_WE_CHAT.getAccessTokenPrefix()); config.setAppId(officialAccount.getAppId()); config.setSecret(officialAccount.getSecret()); config.setToken(officialAccount.getToken()); @@ -138,7 +136,7 @@ public class AccountUtils { */ private WxMaService initMiniProgramService(WeChatMiniProgramAccount miniProgramAccount) { WxMaService wxMaService = new WxMaServiceImpl(); - WxMaRedisBetterConfigImpl config = new WxMaRedisBetterConfigImpl(redisTemplateWxRedisOps(), AccessTokenPrefixConstant.MINI_PROGRAM_TOKEN_PREFIX); + WxMaRedisBetterConfigImpl config = new WxMaRedisBetterConfigImpl(redisTemplateWxRedisOps(), ChannelType.MINI_PROGRAM.getAccessTokenPrefix()); config.setAppid(miniProgramAccount.getAppId()); config.setSecret(miniProgramAccount.getAppSecret()); config.useStableAccessToken(true); diff --git a/austin-web/src/main/java/com/java3y/austin/web/service/impl/MaterialServiceImpl.java b/austin-web/src/main/java/com/java3y/austin/web/service/impl/MaterialServiceImpl.java index d24faeb..bf07014 100644 --- a/austin-web/src/main/java/com/java3y/austin/web/service/impl/MaterialServiceImpl.java +++ b/austin-web/src/main/java/com/java3y/austin/web/service/impl/MaterialServiceImpl.java @@ -9,15 +9,17 @@ import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiMediaUploadRequest; import com.dingtalk.api.response.OapiMediaUploadResponse; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AccessTokenPrefixConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.constant.SendChanelUrlConstant; +import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; import com.java3y.austin.common.dto.account.EnterpriseWeChatRobotAccount; +import com.java3y.austin.common.enums.ChannelType; import com.java3y.austin.common.enums.EnumUtil; import com.java3y.austin.common.enums.FileType; import com.java3y.austin.common.enums.RespStatusEnum; import com.java3y.austin.common.vo.BasicResultVO; import com.java3y.austin.handler.domain.wechat.robot.EnterpriseWeChatRootResult; +import com.java3y.austin.support.utils.AccessTokenUtils; import com.java3y.austin.support.utils.AccountUtils; import com.java3y.austin.web.service.MaterialService; import com.java3y.austin.web.utils.SpringFileUtils; @@ -39,18 +41,18 @@ import org.springframework.web.multipart.MultipartFile; @Slf4j @Service public class MaterialServiceImpl implements MaterialService { - - @Autowired - private StringRedisTemplate redisTemplate; @Autowired private AccountUtils accountUtils; + @Autowired + private AccessTokenUtils accessTokenUtils; @Override public BasicResultVO dingDingMaterialUpload(MultipartFile file, String sendAccount, String fileType) { OapiMediaUploadResponse rsp; try { - String accessToken = redisTemplate.opsForValue().get(AccessTokenPrefixConstant.DING_DING_ACCESS_TOKEN_PREFIX + sendAccount); + DingDingWorkNoticeAccount account = accountUtils.getAccountById(Integer.valueOf(sendAccount), DingDingWorkNoticeAccount.class); + String accessToken = accessTokenUtils.getAccessToken(ChannelType.DING_DING_WORK_NOTICE.getCode(), Integer.valueOf(sendAccount), account, false); DingTalkClient client = new DefaultDingTalkClient(SendChanelUrlConstant.DING_DING_UPLOAD_URL); OapiMediaUploadRequest req = new OapiMediaUploadRequest(); FileItem item = new FileItem(new StringBuilder().append(IdUtil.fastSimpleUUID()).append(file.getOriginalFilename()).toString(),