php网易云信im即时通讯和聊天室
话不多说 直接上代码
<?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; }
}
php网易云信im即时通讯和聊天室的更多相关文章
- Qt NetWork即时通讯网络聊天室(基于TCP)
本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...
- 简单即时通讯、聊天室--java NIO版本
实现的功能: 运行一个服务端,运行多个客户端.在客户端1,发送消息,其余客户端都能收到客户端1发送的消息. 重点: 1.ByteBuffer在使用时,注意flip()方法的调用,否则读取不到消息. 服 ...
- netty-socket.io点对点通讯和聊天室通讯
netty-socketio是基于netty的socket.io服务实现,可以无缝对接前端使用的socketio-client.js. 相对于javaee的原生websocket支持(@serverE ...
- Django实现websocket完成实时通讯,聊天室,在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- Django实现websocket完成实时通讯、聊天室、在线客服等
一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebS ...
- Java 多线程Socket编程通讯--实现聊天室代码
1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...
- Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- java Activiti6 工作流引擎 websocket 即时聊天 SSM源码 支持手机即时通讯聊天
即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...
- iOS 即时视频和聊天(基于环信)
先上效果图: 屏幕快照 2015-07-30 下午5.19.46.png 说说需求:开发一个可以进行即时视频聊天软件. 最近比较忙,考完试回到公司就要做这个即时通信demo.本来是打算用xmpp协议来 ...
随机推荐
- Linux案例01:eth0网卡异常
一.现象描述 今天在调试两台物理机,做完配置重启主机后,发现一台服务器网络无法ssh连接,通过ILO进去ifconfig发现eth0配置的IP地址等信息丢失,手动重启后,可以ssh连接,但过一段时间, ...
- EXCHANGE 2013 队列
每当咱在Exchange里查看队列的时候,我们会看到队列分成好几个组,每个邮箱数据库都有自己的目标队列,DAG.AD站点也是,AD林也是一个队列,最后最多的就是外部SMTP域队列. 当传输服务处理队列 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(五)
创建用户管理相关视图 1.添加视图 打开UsersAdminController.cs 将鼠标移动到public ActionResult Index()上 右键>添加视图 系统会弹出 ...
- python使用SQLAlchemy对mysql操作
安装SQLAlchemy pip install sqlalchemy 在MySQL的test数据库中创建的user表,用SQLAlchemy来试试 数据库连接 第一步,导入SQLAlchemy,并初 ...
- 通过webview控件访问网页
初学android开发,在界面编辑器上放了一个webview控件,可惜不知道如何访问控件,在网上看到一段代码记录下来,算是第一次学习笔记. 要想让程序联网需要授权,在AndroidManifest.x ...
- 对volatile不具有原子性的理解
在阅读多线程书籍的时候,对volatile的原子性产生了疑问,问题类似于这篇文章所阐述的那样.经过一番思考给出自己的理解. 我们知道对于可见性,Java提供了volatile关键字来保证可见性.有序性 ...
- 配置Ceph集群为OpenStack后端存储
配置Ceph存储为OpenStack的后端存储 1 前期配置 Ceph官网提供的配置Ceph块存储为OpenStack后端存储的文档说明链接地址:http://docs.ceph.com/docs/ ...
- 使用JAVA进行排序
利用JAVA完成排序 当我们在进行数据库进行查询的时候,当需要按某个字段来进行排序的时候,可以使用SQL语句来完成排序,可以升序,也可以降序.JAVA中的Collections类也可以完成这种操作,S ...
- Postgresql 数据库,如何进行数据备份以及导入到另外的数据库
方法其实有很多种,这里用的方法比较稳妥.之后有时间会补充别的方法. 该方法分为三步:备份数据,新建表结构,导入数据 备份数据:>>\copy table_name to '/home/ba ...
- 使用highmaps制作中国地图
Highmaps 所需文件 http://code.highcharts.com/maps/highmaps.js(地图渲染的核心文件 必须引用)http://code.highcharts.com/ ...