php网易云信im即时通讯和聊天室

话不多说 直接上代码

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。
 * 参数:
 *  $accid 必须 网易云通信ID,最大长度32字符
 * $name 可选 网易云通信ID昵称,最大长度64字符,用来PUSH推送时显示的昵称
 *  $icon 可选 网易云通信ID头像URL,第三方可选填,最大长度1024
 */
public function createUser($data)
{
    $fields = [];
    if(!isset($data["accid"]) || empty($data["accid"])){
        return false;
    }
    $fields["accid"] = strtolower(strval($data["accid"]));
    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.获取用户名片,可批量
 * 参数:
 * $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;
}
/**
 * 创建聊天室
 * 描述:
 * 参数:
 *  $creator 必须 聊天室属主的账号accid
 *  $name 必须 聊天室名称,长度限制128个字符
 *  $announcement 可选 公告,长度限制4096个字符
 *  $broadcasturl 可选 直播地址,长度限制1024个字符
 *  $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有所区别。
 * 参数:
 *  $from 必须 发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一
 *      $msgtype 必须 0:点对点自定义通知,1:群消息自定义通知,其他返回414
 *  $to 必须 msgtype==0是表示accid即用户id,msgtype==1表示tid即群id
 *  $body 必须 消息内容,最大4096字符
 * 
 */
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;
}

/**
 * 发送普通消息
 * 给用户或者高级群发送普通消息,包括文本,图片,语音,视频和地理位置
 *  $from 必须 发送者accid,用户帐号,最大32字符,必须保证一个APP内唯一
 * int $ope 必须   0:点对点个人消息,1:群消息(高级群),其他返回414
 * $to 必须 ope==0是表示accid即用户id,ope==1表示tid即群id
 *  $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 = t h i s − > h t t p P o s t ( this->httpPost( this>httpPost(url, f i e l d s ) ; i f ( i s s e t ( fields); if(isset( fields);if(isset(result[“code”]) && !empty($result[“code”])){
$ret[“message”] = t h i s − > c o d e m s g [ this->code_msg[ this>codemsg[result[“code”]];
}
if(isset($result[“code”]) && $result[“code”]==200){
$ret[“error”] = 0;
}else{
KaTeX parse error: Expected 'EOF', got '}' at position 27: …] = 1; }̲ if(iss…result[“desc”]) && !empty($result[“desc”])){
$ret[“desc”] = KaTeX parse error: Expected 'EOF', got '}' at position 25: …esc"]; }̲ if(iss…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;

}

}

你可能感兴趣的:(php)