网易云信IM即时通讯PHP接口开发

架构设计

4933701-b92bd21731ca8af1.png
架构设计

操作流程

  1. 注册账号登录后台
  2. 创建网易云IM应用,获取AppKey和AppSecret。
  3. 服务端接口封装
  4. 客户端接口开发

高级群开发

简单描述下需求,游戏中由于对群成员的战绩进行分享,需要提供一个类似Web的聊天功能,在结算完成后即时向web群组中推送战绩,其实这里的聊天室名字并不太准确。因为网易云信实际上已经提供了聊天室的功能,只是的概念所指并非同一的东西。

4933701-8f5a35cf5c2301a2.png
高级群开发

界面是参照的微信、闲聊等多个即时应用设计的,采用的Vue和云信的JS。

简单来说,这个单页面其实有两个核心功能:

  • 群内聊天发送文本和图片
  • 群主推送战绩与个人名片

进入代码之前,首先还是需要将云信的架构图,多看一看,明白的它的流程,实际做起来也就心里有数了。由于这个功能,使用的比较频繁,做了三四版,已经上线的三版,隔一段时间看到就有种恶心的感觉。今天那过来又调整了下。记录下关键代码,周边知识与核心业务部分,一个是需要自己了解,一个是场景不同,不做过多赘述。作为笔记,只记关键点。

服务端接口封装

<?php
namespace app\library;
/**
 * 网易云信接口
 */
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=>"打包错误",
        //群错误码
        801=>"群成员人数达到上限",
        802=>"权限不足",
        803=>"群不存在",
        804=>"用户不在群",
        805=>"群类型无法匹配",
        806=>"创建群数量达到限制",
        807=>"群成员状态错误",
        808=>"申请成功",
        809=>"用户已在群中",
        810=>"邀请成功",
        811=>"账号数量超限",
        812=>"群已禁言,普通成员禁止发送消息。",
        813=>"群拉人部分成功",
        814=>"禁止使用群组已读服务",
        815=>"群管理员人员超限",
        //音视频、白板、通话
        9102=>"通道失效",
        9103=>"已在其他端对呼叫响应过",
        11001=>"通话不可达,对方已离线。",
        //聊天室
        13001=>"IM主连接状态异常",
        13002=>"聊天室状态异常",
        13003=>"黑名单账号,禁止进入聊天室!",
        13004=>"禁言账号,禁止发言!",
        13005=>"用户的聊天室昵称、头像等已被发垃圾",
        //特定业务
        10431=>"邮箱格式有误",
        10432=>"手机格式有误",
        10433=>"密码确认失败",
        10434=>"企业不存在",
        10435=>"登陆账户或密码错误",
        10436=>"应用不存在",
        10437=>"邮箱已注册",
        10438=>"手机已注册",
        10441=>"应用名已存在",
    ];
    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;
    }
    /**
     * 创建群
     * 注意:
     * 所有群操作一个ip一分钟操作次数超过6000次,会返回416错误码。
     * 描述:
     * 1.创建高级群,以邀请的方式发送给用户;
     * 2.custom 字段是给第三方的扩展字段,第三方可以基于此字段扩展高级群的功能,构建自己需要的群;
     * 3.建群成功会返回tid,需要保存,以便于加人与踢人等后续操作;
     * 4.每个用户可创建的群数量有限制,限制值由 IM 套餐的群组配置决定,可登录管理后台查看。
     * 参数:
     * @param String $tname 必须 群名称,最大长度64字符
     * @param String $owner 必须 群主用户帐号,最大长度32字符
     * @param Array $members 必须 ["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员
     * @param String $msg 必须 邀请发送的文字,最大长度150字符
     * @param int $magree 必须 管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414
     * @param int $joinmode 必须 群建好后,sdk操作时,0不用验证,1需要验证,2不允许任何人加入。其它返回414
     * @return
     */
    public function createTeam($data)
    {
        $fields = [];
        //群名称,最大长度64字符
        if(!isset($data["tname"]) || empty($data["tname"])){
            return false;
        }
        $fields["tname"] = $data["tname"];
        //群主用户帐号,最大长度32字符
        if(!isset($data["owner"]) || empty($data["owner"])){
            return false;
        }
        $fields["owner"] = $data["owner"];
        //["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员
        if(!isset($data["members"]) || empty($data["members"])){
            return false;
        }
        $fields["members"] = $this->toJson($data["members"]);
        //邀请发送的文字,最大长度150字符
        if(!isset($data["msg"]) || empty($data["msg"])){
            $data["msg"] = "【ID:{$data["owner"]}】邀请你加入【{$data["tname"]}】";
        }
        $fields["msg"] = $data["msg"];
        //管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414
        if(!isset($data["magree"]) || !in_array($data["magree"],[0,1])){
            $data["magree"] = 0;
        }
        $fields["magree"] = $data["magree"];
        //群建好后,sdk操作时,0不用验证,1需要验证,2不允许任何人加入。其它返回414
        if(!isset($data["joinmode"]) || !in_array($data["joinmode"],[0,1,2])){
            $data["joinmode"] = 0;
        }
        $fields["joinmode"] = $data["joinmode"];
        //发送消息
        $ret = [];
        $url = "https://api.netease.im/nimserver/team/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["tid"]) && !empty($result["tid"])){
            $ret["tid"] = $result["tid"];
        }
        return $ret;
    }
    /**
     * 拉人入群
     * 如果邀请的人中存在加群数量超限的情况,会返回faccid
     * 描述:
     * 1.可以批量邀请,邀请时需指定群主;
     * 2.当群成员达到上限时,再邀请某人入群返回失败;
     * 3.当群成员达到上限时,被邀请人“接受邀请"的操作也将返回失败。
     * 参数:
     * @param String $tid 必须 网易云通信服务器产生,群唯一标识,创建群时会返回,最大长度128字符
     * @param String $owner 必须 群主用户帐号,最大长度32字符
     * @param String $members 必须 ["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员
     * @param int $magree 必须 管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414
     * @param String $msg 必须 邀请发送的文字,最大长度150字符
     * @param String $attach 可选 自定义扩展字段,最大长度512
     * @return bool
     */
    public function addTeam($data)
    {
        $fields = [];
        //网易云通信服务器产生,群唯一标识,创建群时会返回,最大长度128字符
        if(!isset($data["tid"]) || empty($data["tid"])){
            return false;
        }
        $fields["tid"] = $data["tid"];
        //群主用户帐号,最大长度32字符
        if(!isset($data["owner"]) || empty($data["owner"])){
            return false;
        }
        $fields["owner"] = $data["owner"];
        //["aaa","bbb"](JSONArray对应的accid,如果解析出错会报414),一次最多拉200个成员
        if(!isset($data["members"]) || empty($data["members"])){
            return false;
        }
        $fields["members"] = $this->toJson($data["members"]);
        //邀请发送的文字,最大长度150字符
        if(!isset($data["msg"]) || empty($data["msg"])){
            $data["msg"] = "拉人入群";
        }
        $fields["msg"] = $data["msg"];
        //管理后台建群时,0不需要被邀请人同意加入群,1需要被邀请人同意才可以加入群。其它会返回414
        if(!isset($data["magree"]) || !in_array($data["magree"],[0,1])){
            $data["magree"] = 0;
        }
        $fields["magree"] = $data["magree"];
        //自定义扩展字段,最大长度512
        if(isset($data["attach"]) && !empty($data["attach"])){
            $fields["attach"] = $data["attach"];
        }
        //发送消息
        $ret = [];
        $url = "https://api.netease.im/nimserver/team/add.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;
    }
    /**
     * 获取某用户所加入的群信息
     * 描述:
     * 获取某个用户所加入高级群的群信息
     * 参数:
     * @param String $accid 必须 要查询用户的accid
     * @return
     */
    public function joinTeams($accid)
    {
        $fields = [];
        //要查询用户的accid
        if(!isset($accid) || empty($accid)){
            return false;
        }
        $fields["accid"] = $accid;
        //发送消息
        $ret = [];
        $url = 'https://api.netease.im/nimserver/team/joinTeams.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["infos"]) && !empty($result["infos"])){
            $ret["infos"] = $result["infos"];
        }
        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;
        }

        //发送消息
        $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;
    }
}

这里只是封装了几个项目中使用到的接口,封装的流程对照接口文档,按需调整。

Web开发集成

官网有提供好的JavaScript SDK的Demo,可参考修改。上面的Web界面与功能,代码没有分离优化,琐碎的功能点太多,也懒得从头再翻一遍。现在已经是又臭又长的了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android网易云直播是指在Android平台上使用网易云提供的视频服务端接口调用或官网管理控制台,创建频道并获取视频云直播推流地址,以实现直播功能。用户可以通过下载最新版的直播推流SDK并集成SDK到自己的Android应用中,从而实现在Android设备上进行直播的功能。在直播过程中,观众可以通过互联网发送文字、点赞、送礼物等与主播进行互动,实现实时互动效果。这使得直播体验更加丰富和互动性更强,相比传统的观看节目的体验更加直观和参与感更强。此外,Android开发者还可以集成网易云IM实现网易云的登录、单聊和建群群聊等功能,为用户提供更全面的通讯体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Android 网易云直播](https://blog.csdn.net/weixin_45680654/article/details/116756539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [网易云:直播体验深度优化方案——连麦互动直播](https://blog.csdn.net/codewoman/article/details/80124870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Android集成网易云IM实现单聊和群聊](https://download.csdn.net/download/k571039838k/11068590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值