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賬號。
點擊“查看詳情”,會看到

還有

通常,從這裏,就可以查詢到每個直播間的消息數據,注意這裏的用戶名,就是用戶的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章