話不多說 直接上代碼
<?php
/**
* Created by PhpStorm.
* User: lhl
* Date: 2019/4/10
* Time: 17:38
*/
namespace app\api\controller;
class Nim
{
private $app_key;
private $app_secret;
private $code_msg = [
200=>"操作成功",
201=>"客戶端版本錯誤,請升級SDK!",
301=>"被封禁",
302=>"用戶名或密碼錯誤",
316=>"IP限制",
403=>"非法操作或權限不足",
404=>"對象不存在",
405=>"參數長度過長",
406=>"對象只讀",
408=>"客戶端請求超時",
413=>"短信驗證失敗",
414=>"參數錯誤",
415=>"客戶端網絡問題",
416=>"頻率控制",
417=>"重復操作",
418=>"短信通道不可用",
419=>"數量超過上限",
422=>"賬戶被禁用",
423=>"賬號被禁言",
431=>"HTTP請求重復",
500=>"服務器內部錯誤",
503=>"服務器繁忙",
508=>"消息撤回時間超限",
509=>"無效協議",
514=>"服務不可用",
998=>"解包錯誤",
999=>"打包錯誤",
//音視頻、白板、通話
9102=>"通道失效",
9103=>"已在其他端對呼叫響應過",
11001=>"通話不可達,對方已離線。",
//聊天室
13001=>"IM主連接狀態異常",
13002=>"聊天室狀態異常",
13003=>"黑名單賬號,禁止進入聊天室!",
13004=>"禁言賬號,禁止發言!",
13005=>"用戶的聊天室昵稱、頭像等已被發垃圾",
];
public function __construct($app_key, $app_secret)
{
$this->app_key = $app_key;
$this->app_secret = $app_secret;
}
/*獲取隨機數*/
private function getNonce($size = 128)
{
$nonce = "";
$hexDigits = "0123456789abcdef";
//隨機字符串最大128個字符,也可以小於該數
for($i=0;$i<$size;$i++){
$nonce.= $hexDigits[rand(0,15)];
}
return $nonce;
}
/*計算並獲取CheckSum*/
private function getCheckSum($nonce, $curtime)
{
$app_secret = $this->app_secret;
$check_sum = sha1($app_secret.$nonce.$curtime);
return $check_sum;
}
/*生成Header頭信息*/
private function buildHeader()
{
$app_key = $this->app_key;
$nonce = $this->getNonce();
$curtime = time();
$check_sum = $this->getCheckSum($nonce, $curtime);
$header = [];
$header[] = "AppKey:".$app_key;
$header[] = "Nonce:".$nonce;
$header[] = "CurTime:".$curtime;
$header[] = "CheckSum:".$check_sum;
$header[]= "Content-Type:application/x-www-form-urlencoded;charset=utf8";
return $header;
}
/*生成HTTP POST提交的字段*/
private function buildPostFields($data)
{
$ret = "";
if(is_array($data) && count($data)>0){
$arr = [];
foreach($data as $k=>$v){
array_push($arr, $k."=".urlencode($v));
}
$ret = join("&", $arr);
}
return $ret;
}
/*使用CURL進行遠程數據提交*/
private function curlPost($url, $fields, $header, $timeout=5000)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if($result === false){
$result = curl_errno($ch);
}
return $result;
}
/*使用HTTP POST提交數據*/
private function httpPost($url, $data)
{
$header = $this->buildHeader();
$fields = $this->buildPostFields($data);
$json = $this->curlPost($url, $fields, $header);
$ret = json_decode($json, true);
return $ret;
}
private function toJson($var)
{
$arr = [];
if(is_array($var) && count($var) > 0){
$arr = $var;
}else if(is_string($var) && strpos($var, ",")){
$arr = explode(",", trim($var, ","));
}else{
$arr[] = $var;
}
$json = json_encode($arr);
return $json;
}
/**
* 創建網易雲通信ID
* 描述:
* 1.第三方帳號導入到網易雲通信平台;
* 2.注意accid,name長度以及考慮管理token。
* 參數:
* @param String $accid 必須 網易雲通信ID,最大長度32字符,必須保證一個 APP內唯一(只允許字母、數字、半角下划線_、@、半角點以及半角-組成,不區分大小寫,會統一小寫處理
* @param String $name 可選 網易雲通信ID昵稱,最大長度64字符,用來PUSH推送時顯示的昵稱
* @param String $icon 可選 網易雲通信ID頭像URL,第三方可選填,最大長度1024
*/
public function createUser($data)
{
$fields = [];
//網易雲通信ID,最大長度32字符,必須保證一個 APP內唯一(只允許字母、數字、半角下划線_、@、半角點以及半角-組成,不區分大小寫,會統一小寫處理
if(!isset($data["accid"]) || empty($data["accid"])){
return false;
}
$fields["accid"] = strtolower(strval($data["accid"]));
//網易雲通信ID可以指定登錄token值,最大長度128字符,並更新,如果未指定,會自動生成token,並在創建成功后返回。
if(isset($data["token"]) && !empty($data["token"])){
$fields["token"] = $data["token"];
}
//網易雲通信ID昵稱,最大長度64字符,用來PUSH推送時顯示的昵稱。
if(isset($data["name"]) && !empty($data["name"])){
$fields["name"] = $data["name"];
}
//網易雲通信ID頭像URL,第三方可選填,最大長度1024。
if(isset($data["icon"]) && !empty($data["icon"])){
$fields["icon"] = $data["icon"];
}
//網易雲通信用戶email,最大長度64字符。
if(isset($data["email"]) && !empty($data["email"])){
$fields["email"] = $data["email"];
}
//網易雲通信用戶mobile,最大長度32字符,非中國大陸手機號碼需要填寫國家代碼(如美國:+1-xxxxxxxxxx)或地區代碼(如香港:+852-xxxxxxxx)。
if(isset($data["mobile"]) && !empty($data["mobile"])){
$fields["mobile"] = $data["mobile"];
}
//網易雲通信用戶性別,0表示未知,1表示男,2女表示女,其它會報參數錯誤。
if(isset($data["gender"]) && in_array($data["gender"], [0,1,2])){
$fields["gender"] = $data["gender"];
}
//網易雲通信用戶生日,最大長度16字符。
if(isset($data["birth"]) && !empty($data["birth"])){
$fields["birth"] = $data["birth"];
}
//網易雲通信用戶簽名,最大長度256字符。
if(isset($data["sign"]) && !empty($data["sign"])){
$fields["sign"] = $data["sign"];
}
//網易雲通信json屬性,第三方可選填,最大長度1024字符。
if(isset($data["props"]) && !empty($data["props"])){
$fields["props"] = json_encode($data["props"]);
}
//網易雲通信用戶名片擴展字段,最大長度1024字符,用戶可自行擴展,建議封裝成JSON字符串。
if(isset($data["ex"]) && !empty($data["ex"])){
$fields["ex"] = json_encode($data["ex"]);
}
//遠程提交
$ret = [];
$url = "https://api.netease.im/nimserver/user/create.action";
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
if(isset($result["info"]) && !empty($result["info"])){
$ret["accid"] = $result["info"]["accid"];
$ret["token"] = $result["info"]["token"];
$ret["name"] = $result["info"]["name"];
}
return $ret;
}
/**
* 獲取用戶名片
* 描述:
* 1.獲取用戶名片,可批量
* 參數:
* @param String $accids 必須 用戶帳號(例如:JSONArray對應的accid串,如:["zhangsan"],如果解析出錯,會報414)(一次查詢最多為200)
*/
public function getUinfos($accids)
{
$fields = [];
//網易雲通信ID,最大長度32字符,必須保證一個 APP內唯一(只允許字母、數字、半角下划線_、@、半角點以及半角-組成,不區分大小寫,會統一小寫處理
if(!isset($accids) || empty($accids)){
return false;
}
//用戶帳號(例如:JSONArray對應的accid串,如:["zhangsan"],如果解析出錯,會報414)(一次查詢最多為200)
$fields["accids"] = $this->toJson($accids);
//發送請求
$ret = [];
$url = "https://api.netease.im/nimserver/user/getUinfos.action";
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
if(isset($result["uinfos"]) && !empty($result["uinfos"])){
$cnt = count($result["uinfos"]);
if($cnt == 1){
foreach(current($result["uinfos"]) as $k=>$v){
$ret[$k] = $v;
}
}elseif($cnt > 1){
$ret["uinfos"] = $result["uinfos"];
}
}
return $ret;
}
/**
* 創建聊天室
* 描述:
* 參數:
* @param String $creator 必須 聊天室屬主的賬號accid
* @param String $name 必須 聊天室名稱,長度限制128個字符
* @param String $announcement 可選 公告,長度限制4096個字符
* @param String $broadcasturl 可選 直播地址,長度限制1024個字符
* @param String $queuelevel 可選 隊列管理權限:0:所有人都有權限變更隊列,1:只有主播管理員才能操作變更。默認0
* @param String $ext 可選 擴展字段,最長4096字符
* @return array
*/
public function createChatroom($data)
{
$fields = [];
//聊天室屬主的賬號accid
if(!isset($data["creator"]) || empty($data["creator"])){
return false;
}
$fields["creator"] = $data["creator"];
//聊天室名稱,長度限制128個字符
if(!isset($data["name"]) || empty($data["name"])){
return false;
}
$fields["name"] = $data["name"];
//公告,長度限制4096個字符
if(isset($data["announcement"]) && !empty($data["announcement"])){
$fields["announcement"] = $data["announcement"];
}
//直播地址,長度限制1024個字符
if(isset($data["broadcasturl"]) && !empty($data["broadcasturl"])){
$fields["broadcasturl"] = $data["broadcasturl"];
}
//隊列管理權限:0:所有人都有權限變更隊列,1:只有主播管理員才能操作變更。默認0
if(isset($data["queuelevel"]) && in_array($data["queuelevel"],[0,1])){
$fields["queuelevel"] = $data["queuelevel"];
}
//擴展字段,最長4096字符
if(isset($data["ext"]) && !empty($data["ext"])){
$fields["ext"] = $data["ext"];
}
//發送請求
$ret = [];
$url = "https://api.netease.im/nimserver/chatroom/create.action";
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
if(isset($result["chatroom"]) && !empty($result["chatroom"])){
$chatroom = $result["chatroom"];
$ret["roomid"] = $chatroom["roomid"];
$ret["valid"] = $chatroom["valid"];
$ret["announcement"] = $chatroom["announcement"];
$ret["name"] = $chatroom["name"];
$ret["broadcasturl"] = $chatroom["broadcasturl"];
$ret["creator"] = $chatroom["creator"];
$ret["ext"] = $chatroom["ext"];
}
return $ret;
}
/**
* 發送自定義系統通知
* 描述:
* 1、自定義系統通知區別於普通消息,方便開發者進行業務邏輯的通知;
* 2、目前支持兩種類型:點對點類型和群類型(僅限高級群),根據msgType有所區別。
* 參數:
* @param String $from 必須 發送者accid,用戶帳號,最大32字符,必須保證一個APP內唯一
* @param int $msgtype 必須 0:點對點自定義通知,1:群消息自定義通知,其他返回414
* @param String $to 必須 msgtype==0是表示accid即用戶id,msgtype==1表示tid即群id
* @param String $body 必須 消息內容,最大4096字符
* @return
*/
public function sendAttachMsg($from, $to, $attach, $msgtype=1)
{
$fields = [];
//發送者accid,用戶帳號,最大32字符,必須保證一個APP內唯一
if(!isset($from) || empty($from)){
return false;
}
$fields["from"] = $from;
//0:點對點自定義通知,1:群消息自定義通知,其他返回414
if(!isset($msgtype) || !in_array($msgtype,[0,1])){
return false;
}
$fields["msgtype"] = $msgtype;
//msgtype==0是表示accid即用戶id,msgtype==1表示tid即群id
if(!isset($to) || empty($to)){
return false;
}
$fields["to"] = $to;
//自定義通知內容,第三方組裝的字符串,建議是JSON串,最大長度4096字符
if(!isset($attach) || empty($attach)){
return false;
}
if(is_array($attach) && count($attach)){
$fields["attach"] = json_encode($attach);
}elseif(is_string($attach)){
$fields["attach"] = $attach;
}
//遠程提交
$url = 'https://api.netease.im/nimserver/msg/sendAttachMsg.action';
$ret = [];
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
return $ret;
}
/**
* 發送普通消息
* 給用戶或者高級群發送普通消息,包括文本,圖片,語音,視頻和地理位置
* @param String $from 必須 發送者accid,用戶帳號,最大32字符,必須保證一個APP內唯一
* @param int $ope 必須 0:點對點個人消息,1:群消息(高級群),其他返回414
* @param String $to 必須 ope==0是表示accid即用戶id,ope==1表示tid即群id
* @param String $type 必須 消息類型
* 0 表示文本消息,
* 1 表示圖片,
* 2 表示語音,
* 3 表示視頻,
* 4 表示地理位置信息,
* 6 表示文件,
* 100 自定義消息類型(特別注意,對於未對接易盾反垃圾功能的應用,該類型的消息不會提交反垃圾系統檢測)
* @param String $body 必須 消息的body字段,最大長度5000字符,為一個JSON串
* @param String $antispam 必須
* 對於對接了易盾反垃圾功能的應用,本消息是否需要指定經由易盾檢測的內容(antispamCustom)。
* true或false, 默認false。
* 只對消息類型為:100 自定義消息類型 的消息生效。
*
* @return bool
*/
public function sendMsg($from, $to, $body, $ope=1, $type=100)
{
$fields = [];
//0:點對點個人消息,1:群消息(高級群),其他返回414
if(!isset($ope) || !in_array($ope, [0,1])){
return false;
}
$fields["ope"] = $ope;
//消息類型
if(!isset($type) || !in_array($type, [0,1,2,3,4,6,100])){
return false;
}
$fields["type"] = $type;
//發送者accid,用戶帳號,最大32字符,必須保證一個APP內唯一
if(!isset($from) || empty($from)){
return false;
}
$fields["from"] = $from;
//ope==0是表示accid即用戶id,ope==1表示tid即群id
if(!isset($to) || empty($to)){
return false;
}
$fields["to"] = $to;
//消息的body字段,最大長度5000字符,為一個JSON串
if(!isset($body) || empty($body)){
return false;
}
if(is_array($body) && count($body)){
$fields["body"] = json_encode($body);
}elseif(is_string($body)){
$fields["body"] = $body;
}
// https://api.netease.im/nimserver/msg/sendMsg.action
//發送消息
$url = 'https://api.netease.im/nimserver/msg/sendMsg.action';
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
if(isset($result["data"]) && !empty($result["data"])){
$ret["msgid"] = $result["data"]["msgid"];
$ret["antispam"] = $result["data"]["antispam"];
}
return $ret;
}
/*
* 發送聊天室消息
*$roomid *必填 聊天室id
* $msgId *必填 客戶端消息id,使用uuid等隨機串,msgId相同的消息會被客戶端去重
* $fromAccid *必填 消息發出者的賬號accid
* $msgType 0表示文本消息
*
*/
public function chatroomMsg($roomid,$msgId,$fromAccid,$msgType=0){
$attach = input('attch');///消息內容
if(empty($roomid)||empty($msgId)||empty($fromAccid)){
return false;
}else{
$fields['roomid'] = $roomid;
$fields['msgId'] = $msgId;
$fields['fromAccid'] = $fromAccid;
$fields['msgType'] = $msgType;
}
if (empty($attach)){
return ['status' => 2, 'info' => '發送消息不能為空'];
}
$url = 'https://api.netease.im/nimserver/chatroom/sendMsg.action';
$result = $this->httpPost($url, $fields);
if(isset($result["code"]) && !empty($result["code"])){
$ret["message"] = $this->code_msg[$result["code"]];
}
if(isset($result["code"]) && $result["code"]==200){
$ret["error"] = 0;
}else{
$ret["error"] = 1;
}
if(isset($result["desc"]) && !empty($result["desc"])){
$ret["desc"] = $result["desc"];
}
return $ret;
}
}