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

关于“即时通信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账号。
点击“查看详情”,会看到

还有

扫描二维码关注公众号,回复: 11056582 查看本文章
通常,从这里,就可以查询到每个直播间的消息数据,注意这里的用户名,就是用户的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
发布了74 篇原创文章 · 获赞 2 · 访问量 7374

猜你喜欢

转载自blog.csdn.net/LDR1109/article/details/105644014