PHP之后台开发需要做什么——即时通信IM

article/2025/10/23 7:03:03
关于“即时通信IM”,腾讯云的官方文档,是这样介绍的:即时通信(Instant Messaging,IM)基于QQ 底层 IM 能力开发,仅需植入 SDK 即可轻松集成聊天、会话、群组、资料管理能力,帮助您实现文字、图片、短语音、短视频等富媒体消息收发,全面满足通信需要。

即时通信IM的简单述说

官方的解释,通常都很官方,我一开始,也是不明白这个东西是做什么的,直到后来,跟APP端配合做着做着,才大概看清楚它的样子。即时通信IM,还是先从字面意思理解,就是你说一句,我立马就能回你,这就叫即时通信,而不是,我发一个信息,半天后,你看到了再回我,那叫短信。现在的社会,节奏快,没人愿意等,聊天也是一样。当然,直播间更是了,谁都想立即得到回应,不希望被忽略。所以呢,这东西说白了,就是应用于,你进入直播间,跟主播互动打字聊天的那块功能,不光用户,包括主播,都有IM账号,才能相互之间进行互动,否则,连直播间可能都进不去。云直播和即时通信IM虽然是两个完全独立的产品,但是,只有结合到一块,才能发挥出最强效应。其实,直播间里的互动,就类似QQ建了个群,你们在这个群聊天互动,就是建立在即时通信IM的基础上的。当然,具体到点,肯定不止这些,比如,登录、用户字段、好友字段、群字段、群组管理等等的,好多,但主要的,还是围绕“通信”这一块,进行展开。

开启即时通信IM

那接下来,我们首先说说,如何开启即时通信IM。登录腾讯云账号,进入控制台,找到“即时通信IM”

点击“即时通信IM”首页,点击“+添加应用”,输入应用名称,确认添加,进入“基本配置”页面。

进入到这个页面,你能看到“基本信息”、“账号管理员”两个模块,

基本信息里,要注意SDKAppID、秘钥,尽量先保存起来,后面,代码里会用到,APP端也会用到。

账号管理这里,要记住管理员的用户名,保存起来,后面的代码里也会用到。还有一个地方“业务版本”,一开始,你这里可能就是试用版,组、成员等数量上都有限制,等到最后,当这些已经无法满足你实际业务需求的时候,你就需要从这里进行升级,切记,别升级到别的SDKAppID里,否则,前后端都得改相应的配置,虽然,无伤大雅,但可能招骂,因此,操作需谨慎。“即时通信IM”控制台,两主要菜单
“功能配置”里的“登录与消息”
1、这里有三个需要注意的地方,首先是“登录设置”

注意“多端登录类型”是“双端登录”

2、其次,是“历史消息存储时长”

七天免费,这个根据业务而定吧,有参考文档,具体根据实际需要来即可。
3、最后,是“消息撤回设置”

这个功能,就类似微信的消息撤回功能,具体时长,亦可根据实际需要而定。
“群组管理”
点进去,就能看到所有的群组数据

注意,这里的群组名称,对应的应该是直播间的名称,而群主,就是主播的IM账号。
点击“查看详情”,会看到

还有

通常,从这里,就可以查询到每个直播间的消息数据,注意这里的用户名,就是用户的IM账户。主播有IM账号,用户有IM账号,这两个账号,可并非从腾讯云控制台生成,而是,需要我们将业务数据里的主播和用户的账号以特定的形式导入到即时通信IM.

如何将后台账户数据导入到即时通信IM

那,后台的数据账号,究竟需要怎么导入到即时通信IM呢?肯定的通过接口呀,是的,这块有接口的。文档地址:https://cloud.tencent.com/document/product/269进入这个文档,从左侧的“服务端API”进入,点击“REST API”,会看到“账号管理”,在账号管理有“导入单个账号”和“导入多个账号”,没错,就是这个,我们要导入即时通信账号的不二法门。不过,这两个接口,除了导入个数不同之外,还有个不同之处,那就是数据参数。“导入单个账号”有三个参数:用户名、用户昵称、头像;而“导入多个账号”,仅有一个Accounts参数,且是个数组的JSON串,数组里直接是用“,”隔开的不超过32位的用户名(其实,这里的用户名可以看成是ID也可以)。那么,究竟该如何操作,进入账号导入呢?首先,我们先来看几个地方,因为了解了这些,才是你代码实现的前提:1、首先,接口调取的域名,https://console.tim.qq.com/,这个仅在示例中展示了一下,并未明显标记,需注意。2、然后,是几个参数需要简单说一下:sdkappid在哪找,前文有提到;identifier,就是管理的名称,前文也有提到;random随机数,这个参数只要你不超过0 - 4294967295这个范围,就没问题了。3、其次,就是usersig签名的生成,这个可能稍微注意一下了,虽然有示例代码,但是,还是要注意封装,因为,后面的很多地方可能会用到,尽量灵活一点。4、另外,这个接口的调用频率是每秒200次,通常情况,是足够了(有钱就是牛逼)。5、应答包的返回,文档里有,就不说了,但,注意一下,文档下面的错误码说明,这里仅列出了一部分,可能有的人报出的错误码,在当前文档页面没有搜索到,但点开错误码文档,就是另一片天地。https://cloud.tencent.com/document/product/269/1671

相关代码部分

/*** APP账号导入即时通信IM - 单个 - API*/
public function account_import()
{$userid = $this->request['userid'] ? $this->request['userid'] : '';$nickname = $this->request['nickname'] ? $this->request['nickname'] : '';$head_img = $this->request['head_img'] ? $this->request['head_img'] : '';if(!$userid || !$nickname || !$head_img){return ['error_code'=>201, 'error_msg'=>'用户昵称或头像为空'];}$data = ['Identifier'=>$userid, 'Nick'=>$nickname, 'FaceUrl'=>$head_img];$result = $this->import_common('account_import', $data);if($result['ActionStatus']=='OK' && $result['ErrorCode']==0){return ['error_code'=>200, 'error_msg'=>'单个-导入成功','data'=>[$data]];}return ['error_code'=>201, 'error_msg'=>'单个-导入失败','data'=>[]];
}/*** APP用户导入到通信IM - 公共部分* @param string $func* @param array $data* @return mixed*/
private function import_common($func, $data)
{$domain = 'https://console.tim.qq.com/';$action = 'v4/im_open_login_svc/'.$func.'?';$params['sdkappid'] = $this->im[self::SDK_APPID]['sdkappid'];$params['identifier'] = $this->im[self::SDK_APPID]['identifier'];$params['usersig'] = $this->get_usersig($params['sdkappid'], $this->im[self::SDK_APPID]['imsecretkey'], $params['identifier']);$params['random'] = rand(0, 4294967295);$params_http_build = $this->params_http_build($params);$url = $domain.$action.$params_http_build.'contenttype=json';$res = $this->restRequst($url, json_encode($data));return json_decode($res, true);
}/*** APP账号导入即时通信IM - 多个 - API*/
public function multiaccount_import()
{$accounts = $this->request['accounts'] ? $this->request['accounts'] : '';if(!$accounts){return ['error_code'=>201, 'error_msg'=>'多个账号数据为空'];}$data = ['Accounts'=>explode(',',$accounts)];$result = $this->import_common('multiaccount_import', $data);if($result['ActionStatus']=='OK' && $result['ErrorCode']==0){return ['error_code'=>200, 'error_msg'=>'多个-导入成功','data'=>[$accounts]];}return ['error_code'=>201, 'error_msg'=>'多个-导入失败','data'=>[]];
}/*** APP账号导入即时通信IM - 删除*/
public function account_delete()
{$useridStr = $this->request['useridStr'] ? $this->request['useridStr'] : '';if(!$useridStr){return ['error_code'=>201, 'error_msg'=>'要删除UserId为空'];}$data = ['DeleteItem'=>$this->add_key(explode(',',$useridStr),'UserID')];$result = $this->import_common('account_delete', $data);if($result['ActionStatus']=='OK' && $result['ErrorCode']==0){return ['error_code'=>200, 'error_msg'=>'删除成功','data'=>[$data]];}return ['error_code'=>201, 'error_msg'=>'删除失败','data'=>[]];
}/*** 数据配置KEY* @param array $data* @param string $k_name* @return array*/
private function add_key($data, $k_name)
{$res = [];foreach ($data as $key=>$val) {$res[$key][$k_name] = $val;}return $res;
}/*** 生成 UserSig*/
public function get_usersig($sdkappid, $imsecretkey, $string)
{//echo $sdkappid.'-'.$imsecretkey.'-'.$string;exit();require_once (APPPATH."/libraries/live_sign/src/TLSSigAPIv2.php");$api = new \Tencent\TLSSigAPIv2($sdkappid, $imsecretkey);return $api->genSig($string);
}

何时导入账号至即时通信IM合适

知道怎么导入账号了,但是,不知道大家有没有想过何时导入呢?通常,数据的导入,这里,主要分为两类,一类是新用户,一类是老用户。一个新的模块开发完毕,使用的肯定有老用户和新用户,我们既要保证新用户使用无误,更要老用户顺畅运行。因此,通常的处理方式都是使用批量导入,进行老用户的导入,而新用户在生成的时候,即为其导入即时通信IM账号。但是,老用户的导入,真的使用批量导入就好么?可能,答案不是肯定的。批量导入的用户,没有昵称和头像,在直播间显示的时候,会有点突兀,一旦还需要完善用户昵称和头像,你可能就的返重工;另外,考虑到网络的因素,你的批量导入,数据量大的时候,一次可能导不全,丢了数据,你都可能还不知道是哪个;就算你记录了,还不是得再来一遍,或两遍。因此,综上考虑,我们的处理方式是当用户每次登录进入小程序的时候,我们都会将用户当做是一个新的用户,进行账号导入到即时通信IM的操作。每次登录都导入?会不会有重复?答案,肯定是不会,这里,我们已经做过反复验证,只要第一次导入成功,后续只作更新,而且,一旦我们更改用户的头像和昵称,登录的时候还能及时同步信息到“即时通信IM”,另外,这样操作,还可以保证成功率,这个接口的使用频率是200次/秒,足够满足我们的需求。可谓一举三得!

导入账号应该使用什么作为ID

关于这个问题,我觉得得根据具体业务来定。通常,你使用,user_id来作为identifier“用户名”的值,都是可以的。但是,如果,当你的用户表里,有多个用户身份的数据时,判断不当,使用userid的话,可能就会出现串的情况。你比如说,我们一开始处理的时候,就是使用用户ID的,可是,后来忽然发现,原本一个用户,有用户身份和司机身份两条数据,结果因为注册的时候,控制不当,导致一个用户出现存在大于两条数据的情况。这样一个用户5条数据,他们有相同的手机号,这样当你用其中的第三条登录的时候,理应是取第三条的ID,作为即时通信IM的“用户名”,但可能就取成第一条数据的ID了,这样,就对不上了,后期,可能会出现聊天串直播间的等一系列未知的问题。后来,我们的解决方案是,使用手机号加下划线加身份类型码作为即时通信IM的“用户名”,不管你用哪条数据登录,你的手机号始终是唯一的,并且,数据对应的身份也能确定,这样,就能保证用户即时通信IM账号的唯一性了。当你切换成用户,你的IM账户,就是类似“18000000000_1”,而当你切换成司机,那就是“18000000000_2”了。经验证,这样确实是可行的,后期,也没有再出现类似直播间聊天串播的情况。还有一点,通过此,你还可以直接快速地定位到用户!
好了,“即时通信IM”相关的东西,就简单说到这里,个中其他,可能并非我所说的这么简单,这里就当是引路好了,具体的,大家可以在实践中,根据具体情况,具体处理,还是那句话,仅供参考!下篇,我们就说说剩下的其他,算作当前直播系列文章的扫尾!
The END!                                                                                2020/04/20 20:15:15

http://chatgpt.dhexx.cn/article/fGAd02Bm.shtml

相关文章

通过数据泵expdp、impdp方式备份与还原(导出与导入)Oracle数据库

作者专注于Java、架构、Linux、小程序、爬虫、自动化等技术。 工作期间含泪整理出一些资料,微信搜索【程序员高手之路】,回复 【java】【黑客】【爬虫】【小程序】【面试】等关键字免费获取资料。 目录 前言 一、备份 step1:使用system登…

expdp的用法

exp/imp与expdp/impdp的用法区别 1:把用户usera的对象导到用户userb,用法区别在于fromuserusera touseruserb ,remap_schemausera:usera 。例如 imp system/passwd fromuserusera touseruserb file/oracle/exp.dmp log/oracle/exp.log; impdp system/passwd directo…

expdp/impdp 详细参数解释

数据泵导出实用程序提供了一种用于在 Oracle 数据库之间传输 数据对象的机制。该实用程序可以使用以下命令进行调用: 示例: expdp scott/tiger DIRECTORYdmpdir DUMPFILEscott.dmp 您可以控制导出的运行方式。具体方法是: 在 expdp 命令后输入 各种参数。要指定各参数, 请使用关…

Oracle详解:exp/imp和expdp/impdp的区别

Oracle详解:exp/imp和expdp/impdp的区别 结论: 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具,从10g开始,不仅保留了原有的EXP和IMP工具,还提供了数据泵导出导入工具EXPDP和IMPDP。 1、exp和expdp最明显的区…

使用expdp(非本地)远程导出数据

背景: 前段时间,需要从异地一个测试数据库中将测试数据(一张表)导入本地库,表数据量大约500万,字段160多个,开始用了exp/imp方式,速度奇慢,不能忍,于是转而使用expdp/impdp方式。 e…

运维 —— expdp、impdp

一、exp/imp与expdp/impdp 1)exp和imp是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。 2)expdp和impdp是服务端的工具程序,他们只能在ORACLE服务端使用, 不能在客户端使用。 3)字符集的问题到expdp/impdp数据泵已经消除…

expdp / impdp 用法详解

一、注意事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。 EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。 IMP只适用于EXP导出的文件,不适…

expdp/impdp 数据泵导入导出

业务场景: 在工作中,涉及到oracle数据库迁移,使用navicat等其他工具 容易报错,一系列问题很麻烦,今天记录一下操作流程及个人理解(文章参考了很多文档和博客); EXPDP数据导出 请自…

rest_framework--过滤器filters--搜索

rest_framework–过滤器filters–搜索 view from rest_framework.pagination import PageNumberPagination from rest_framework import mixins from rest_framework import viewsets from rest_framework import filtersfrom .models import Goods from .serializers import G…

gateway整合filters

Unable to find GatewayFilterFactory with name AddRequestParamter 首先确定你要做的是用nacos整合gateway,然后使用gateway配置filters对请求进行修改。 一、首先在gateway微服务的application.yml或者bootstrap.yml文件进行filter的配置 // A code block ser…

php apply filters,WordPress学习——apply_filters()详解

前两天学习了 add_filters() 函数,详见>>> WordPress学习——add_filter()详解 ,今天趁热打铁再来学习下它的使用。一般情况下 add_filters() 有两种方式触发,一种是当程序运行到特定时候 WordPress 程序会判断用户是否对某些参数做了新的定义,如果有则优先使用用…

filters过滤器

这是通过过滤器写的一个只显示10个字的效果图。 1):什么时候用到过滤器? 绑定一些复杂数据类型的时候用到过滤器 2):以下两种方式定义过滤器: 第一种:Vue.filter()定义全局过滤器&#xff0…

vue filters的使用

filters 过滤器:「Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示&…

【前端】Vue---过滤器filters详解

一、认识过滤器: 格式化数据的一个工具 过滤器的作用:用于文本格式化,仅仅作为格式化操作,不做复杂的业务处理过滤器的使用方式:通过管道符号(|)来使用过滤器的使用位置:mustache插值和v-bing的表达式 二、过滤器的使用 //如何使用使用过滤器?我们用一个叫做管道…

Fiddler工具 — Fiddler过滤器(Filters)详解

1、Filters介绍 Filters:过滤器,帮助我们过滤请求。 如果需要过滤掉与测试项目无关的抓包请求,更加精准的展现抓到的请求,而不是杂乱的一堆,那功能强大的 Filters 过滤器能帮到你。 总结:Filters过滤器的…

Vue项目中过滤器(filters)的用法

过滤器使用场景 在调取接口的返回数据的时候,我们经常能够得到各种Number类型的数据。 这种格式的数据,很多时候都是表明对应的类型。 如果直接返回到页面上展示,对于操作人员来讲,没有任何意义。 所以,一般的情况…

vue初学篇----过滤器(filters)

过滤器使用&#xff0c;直接上代码 <template><div class"filters"><h1 v-text"filtersTitle"></h1><input v-model"filtersText"/><div>{{filtersText | filtersTextChange}}</div></div> <…

mysql删掉数据库失败_如何删除MySQL数据库?

mysql删掉数据库失败 MySQL is a very popular opensource database it is used by a lot of different types and size companies. In this post, we will look at how to drop or delete MySQL databases? MySQL是一种非常流行的开源数据库,许多类型和规模的公司都在使用它…

数据库如何删除数据

1、drop (删除表)&#xff1a;删除内容和定义&#xff0c;释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。 drop语句将删除表的结构被依赖的约束&#xff08;constrain),触发器&#xff08;trigger)索引&#xff08;index);依赖于该表的存储过程…

Mongo删除数据库/集合

Mongo 删除数据库/集合 1.使用mongo 连接数据库 2.show dbs 查看所有的数据库 3.删除mongo数据库 1.先切换到mongo数据库 use mongo 2.执行 db.dropDatabase()命令 结果:{ "dropped" : "mongo", "ok" : 1 } 3.执行show dbs 发现mongo库已被删…