基于Java 实现 IM 业务回调

article/2025/6/30 12:20:55

1.什么是业务回调

image.png

2.腾讯云回调的类型

功能角度

  • 在线状态回调

  • 资料关系链回调

  • 单聊消息回调

  • 群组系统回调

处理角度

  • 事件发生之前回调:回调的主要目的在于让 App 后台可以干预该事件的处理逻辑,即时通信 IM 会根据回调返回码确定后续处理流程(例如发送群消息之前回调)

  • 事件发生之后通知:回调的主要目的在于让 App 后台实现必要的数据同步,即时通信 IM 忽略回调返回码(例如群组成员退群之后通知)

3.业务执行之前回调

业务执行之前的回调是可以干涉业务是否继续执行的,但是业务之后回调不行,所以这里单独说一下

image.png

4.腾讯云即时通讯IM对于业务回调

介绍

image.png

回调协议

图示

image.png

回调示例请求示例
POST /?SdkAppid=888888&CallbackCommand=Group.CallbackAfterNewMemberJoin&contenttype=json&ClientIP=$ClientIP&OptPlatform=$OptPlatform HTTP/1.1
Host: www.example.com
Content-Length: 337
{"CallbackCommand": "Group.CallbackAfterNewMemberJoin", "GroupId": "@TGS#2J4SZEAEL", "Type": "Public", "JoinType": "Apply", "Operator_Account": "leckie", "NewMemberList": [{"Member_Account": "jared"}, {"Member_Account": "tommy"}]
}
回调应答示例

HTTP/1.1 200 OK
Server: nginx/1.7.10
Date: Fri, 09 Oct 2015 02:59:55 GMT
Content-Length: 75
{"ActionStatus": "OK", "ErrorInfo": "", "ErrorCode": 0
}

回调超时时间及重试

image.png

事件发生之前回调超时的处理策略

image.png

回调安全考虑

介绍

即时通信 IM 同时支持 HTTP/HTTPS 回调,其中 HTTPS 回调需要在App 后台的 WebServer 配置 CA 机构签发的证书或即时通信 IM 免费签发的证书

安全性问题
  • HTTP 是明文传输,数据的保密性无法保证,建议使用HTTPS

  • 无法验证回调请求是否真正来自于即时通信 IM

解决方案
  • 支持回调鉴权(推荐)

  • 支持 HTTPS 双向认证

支持回调鉴权

image.png

支持HTTPS回调

image.png

回调不通的常见原因

image.png

5.实践

推荐使用AOP来实现回调

/*** @description: 回调注解* @author:sgy* @date: 2023-08-22*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Callback {/*** 回调业务命令*/CallbackCommandEnum command();/*** 是否存在之后回调* @return*/boolean after() default true;/*** 是否存在之前回调* @return*/boolean before() default false;/*** appId* @return*/String appId();
}

/*** @description:业务回调切面* @author:sgy* @date: 2023-08-22*/
@Aspect
@Slf4j
@Component
public class CallbackAspect {@Resourceprivate ICallbackService callbackService;/*** 使用AOP在方法之前拦截请求*/@Around("@annotation(cn.sgy.im.system.service.aop.callback.Callback)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {// 根据连接点获取方法上的Callback注解Callback callback = getCallback(joinPoint);// 业务之前的回调Result result = executeBeforeCallback(callback, joinPoint.getArgs()[0]);// 校验是否允许继续执行,如果允许继续执行才执行业务if (checkBeforeResult(result)) {Object proceed = joinPoint.proceed();// 业务执行后回调executeAfterCallback(callback, proceed);return proceed;} else {return null;}}/*** 业务执行回调*/private void executeAfterCallback(Callback callback, Object obj) {// 基本属性获取boolean after = callback.after();CallbackCommandEnum command = callback.command();int appId = Convert.toInt(callback.appId());// 如果存在之后回调if (after) {callbackService.afterCallback(appId, command.getCommand(), obj);}}/*** 检查之前回调结果是否允许继续执行* - 结果不符合格式允许继续执行* - 结果允许继续执行* - 结果不允许继续执行* - 是NULL允许继续执行* - 等等** @param result* @return*/private boolean checkBeforeResult(Result result) {return true;}/*** 执行之前回调** @param callback*/private Result executeBeforeCallback(Callback callback, Object obj) {// 基本属性获取boolean before = callback.before();CallbackCommandEnum command = callback.command();int appId = Convert.toInt(callback.appId());// 如果存在之前回调if (before) {return callbackService.beforeCallback(appId, command.getCommand(), obj);}return null;}/*** 根据连接点获取方法上的Callback注解** @param joinPoint* @return*/private Callback getCallback(ProceedingJoinPoint joinPoint) throws Exception {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();Method targetMethod = joinPoint.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), methodSignature.getMethod().getParameterTypes());return targetMethod.getAnnotation(Callback.class);}}

 

/*** @description:回调服务* @author:sgy* @date: 2023-08-22*/
public interface ICallbackService {/*** 业务之前回调* @param appId appId* @param callbackCommand 回调类型* @param obj 回调具体的数据* @return*/Result beforeCallback(Integer appId,String callbackCommand,Object obj);/*** 业务之后回调* @param appId appId* @param callbackCommand 回调类型* @param obj 回调具体的数据* @return*/void afterCallback(Integer appId,String callbackCommand,Object obj);
}


/*** @description:业务回调实现类,不完善* @author:sgy* @date: 2023-08-22*/
@Service
@Slf4j
public class CallbackServiceImpl implements ICallbackService {@Resourceprivate TcpServiceCallbackConfig tcpServiceCallbackConfig;@Resourceprivate RestTemplate restTemplate;@Overridepublic Result beforeCallback(Integer appId, String callbackCommand, Object obj) {try {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<String> requestEntity = new HttpEntity<String>(JSONUtil.toJsonStr(obj), headers);ResponseEntity<Result> resultResponseEntity = restTemplate.exchange(tcpServiceCallbackConfig.getCallbackUrl(), HttpMethod.POST, requestEntity, Result.class);return resultResponseEntity.getBody();} catch (Exception e) {log.error("callback 之前 回调{} : {}出现异常 : {} ", callbackCommand, appId, e);return Results.success();}}@Overridepublic void afterCallback(Integer appId, String callbackCommand, Object obj) {
//        shareThreadPool.submit(() -> {
//            try {
//                httpRequestUtils.doPost(appConfig.getCallbackUrl(),Object.class,builderUrlParams(appId,callbackCommand),
//                        jsonBody,null);
//            }catch (Exception e){
//                logger.error("callback 回调{} : {}出现异常 : {} ",callbackCommand , appId, e.getMessage());
//            }
//        });}
}

http://www.hkcw.cn/article/PomMbdYJSO.shtml

相关文章

印度空军高官不满:“国产战机”到底何时能交货

据俄罗斯卫星通讯社5月29日报道,印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,称印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。辛格指出,根据2021年与印度斯坦航空有限公司签订的价值4…

澳贸易部长谈美国进口钢铝关税 反对不合理加征

5月30日,美国总统特朗普宣布,自6月4日起,将把钢铁和铝的进口关税从25%提高至50%。次日,澳大利亚贸易部长法瑞尔对此作出回应,表示澳大利亚的立场始终明确且一致。他认为这些关税措施既不合理,也不符合朋友之间的行为准则。法瑞尔指出,这种做法是一种经济上的自我伤害,不…

水上竞渡 绿道长安 ‘艇’进未来

为推动文旅赋能“百千万工程”,加快落实文化强市建设任务,东莞市长安镇即将举办一场精彩的文旅盛宴。5月29日至31日,“绿道长安 ‘艇’进未来”2025年长安镇水上竞渡活动将在莲花山风景区水上活动中心举行。活动期间,水上活动中心、莲花湖绿道生态停车场、莲花湖绿道三大场…

保安27层高空索降盗窃67块玉石 现实版“疯狂的石头”

电影《疯狂的石头》中盗贼们盯上价值连城的翡翠并化身“蜘蛛人”空降盗窃的情节,在新疆乌鲁木齐某大厦真实上演。5月23日凌晨,该市一玉石展厅内共计67块玉石被盗,估价约1亿元。警方勘查现场发现门锁完好,但23楼窗户玻璃被砸,外侧有使用绳索痕迹。大厦顶层27层平台处发现了…

python出租车计费 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

python出租车计费 2023全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

陪酒坠楼女孩母亲称没收到主犯赔偿 赔偿未到位加剧家庭困境

四川女孩丹丹在成都鑫银汇KTV从事有偿陪侍工作。2023年8月26日凌晨,15岁的她酒后从KTV所在的三楼坠下,全身多处受伤入院。此后,涉事的鑫银汇KTV因组织未成年人进行有偿陪侍活动被立案侦查。案件二审已经终结,KTV负责人彭某及无业人员陈某某、林某等三人均被判刑。一审判决书…

原县委书记花上千万建10座公厕被查 豪华装修超预算

刚摘掉深度贫困县的帽子,时任县委书记李德明就斥资上千万元建了10个水冲公厕,内部装修豪华。吉林省纪委监委日前公开通报4起形式主义、官僚主义典型问题,其中提到省农业农村厅原厅长、白城市通榆县委原书记李德明搞劳民伤财的“形象工程”。李德明出生于1970年7月,曾任白城…

特朗普政府给哈佛30天提出异议 政策争议持续升级

当地时间29日,美国马萨诸塞州联邦地区法院法官艾莉森伯勒斯批准了哈佛大学提出的初步禁令请求,暂停了特朗普政府取消哈佛大学招收外国学生资质的政策。听证会后,法院决定此前发布的临时限制令将继续有效,直至各方协商并提交提议供法官审议。本月22日,美国国土安全部宣布取…

原县委书记搞形象工程建140平厕所 豪华装修引争议

刚摘掉深度贫困县帽子的通榆县,时任县委书记李德明便斥资上千万元建造了10个豪华装修的水冲公厕。日前,吉林省纪委监委公开通报了4起形式主义、官僚主义典型问题,其中就包括李德明搞劳民伤财的“形象工程”。李德明出生于1970年7月,曾任白城市住建局局长,2019年4月出任通榆…

级联的if else

级联的if else——if else嵌套的另一写法 /* 分段函数 f(x) -1 ; x < 0 0 ; x 0 2x ; x > 0 */ #include <stdio.h> int main() {int x,f;printf("请输入x的值&#xff1a;\n");scanf("%d",&x);getchar();if (x < 0) {f -1;} els…

宿茂臻携泰山队球员送儿童节祝福 签名送礼表心意

山东体育休闲频道报道,泰山足球俱乐部总经理宿茂臻携泰山队球员为小朋友们送上了六一节的祝福。宿茂臻及刘彬彬、张弛等泰山球员在球衣上签名并送去了礼物。宿茂臻表示:“六一儿童节来了,在这里代表山东泰山俱乐部向济南市、山东省以及全国的少年儿童说一句,祝你们六一儿童…

“他就是恶意的!”全运会球员遭对手从背后犯规暴力踢断腿,伤者发声 要求赔偿所有损失

第十五届全国运动会期间,七人制男子足球比赛中发生了一起严重事件。北京代表队的运动员曹某某在比赛中恶意踢伤了上海队的一名球员,导致对方左腿骨折。曹某某因此被罚停赛6场,并被要求限期离开佛山赛区。此外,北京代表队也受到了通报批评。受伤球员蔡先生对这一行为表示强烈…

法国升级改造空军基地有何目的 增强核威慑力量

法国已开始斥资17亿美元对吕克瑟伊空军基地进行现代化改造,以部署携带核武器的“阵风”战机。这一举措反映了欧洲安全局势的紧张情绪日益加剧。改造工作将耗时十年,从2035年起,吕克瑟伊空军基地的面积将扩大到现在的两倍,并将成为法国第四个也是最现代化的核武器储存基地。…

世界反兴奋剂机构主席驳斥美国指责 美体系存缺陷

世界反兴奋剂机构主席班卡在获得连任后表示,美国无端指责世界反兴奋剂机构,却无视自身存在的严重问题。他将继续大胆指出美国反兴奋剂体系的缺陷。在接受媒体采访时,班卡提到美国代表曾试图削弱他在世界反兴奋剂机构的领导地位,并试图更换领导人。由于美国政府停止了对世界…

男子疑似因疲劳驾驶连撞13车 马路变成碰碰车乐园

5月29日晚,台北某路口发生了一起惊心动魄的连环撞车事件。一位司机因疲劳驾驶,在晚高峰时段将马路变成了碰碰车乐园,连续撞击了13辆无辜车辆。监控画面显示,当时路口车水马龙,这位司机显然已经极度疲劳,车子像失控的野牛一样横冲直撞。先是撞上一辆出租车,接着追尾多辆车…

“美国施压台在野党:别挡路,买我武器要紧”

【文/观察者网 张菁娟】在中美贸易摩擦暂时“冻结”之际,美国总统特朗普又企图打“台湾牌”。路透社30日援引两名美国官员的话报道称,美国计划将对台军售提升至超过特朗普首个任期的水平,以强化对中国大陆的威慑力。与此同时,美方正施压台湾在野党,要求他们在增加防务预算…

王者荣耀铠动画剧集开播 颜值暴击震撼来袭

我宣布从今天开始铠爹就是我在峡谷最爱的,这动画太帅了吧,一出场直接颜值暴击!被画质震撼了!露娜也好美好美!我甚至看得清披风和铠甲的细节!但是怎么一上来就是大刀啊啊啊啊啊责任编辑:zx0001

你想看的福建舰又出镜了!“龙舟”竞渡硬核现场

var chan_v_w = 960,chan_v_h = 540,chan_v_p = https://mts-audio.huawangzhixun.com/image/20250531/news/4e87f4bc-b28b-436e-ab35-fa250691ec58.jpg,chan_v_s = https://vmts.china.com/api/video/onaliyun/query?id=3101098&ttype=mp4;谁说龙舟用桨划?战舰列阵引擎轰…

大V:普京用黄金换来了伊朗的强援 换取无人机技术支持

普京开始兑现承诺,将4吨黄金陆续送到盟友手中。在俄乌冲突爆发后,俄罗斯面临严峻挑战时,这些黄金帮助换取了伊朗的支持,为俄罗斯争取到了宝贵的喘息之机。据报道,普京政府向伊朗政府主导的“撒哈拉雷霆”公司转移了至少1.8吨黄金,以支付购买伊朗“沙赫德”系列自杀式无人…

电影《长夜将尽》入围上影节金爵奖 聚焦老龄化社会议题

电影《长夜将尽》今日官宣全阵容,导演饶晓志首次主演电影。该片入围了第二十七届上海国际电影节金爵奖主竞赛单元。《长夜将尽》聚焦老龄化社会,讲述杀手保姆叶晓霖伪装进入老人家庭实施杀害,其间与饲养员马德勇的相遇打破了原有生活平衡,他们的命运交织而变幻着。影片通过…