在环信的文档中介绍,可以看到是没有PHP的sdk的,那么就需要咱们自己简单的封装一下。我这里使用的是TP5
(1)注册完之后会创建一个IM应用
(2)创建成功会有这下图这样的一个展示
(3)点击一下会有详细信息
使用箭头标注的就是咱们需要的信息,记录下来
(1)目录结构
(2)创建配置文件system.php
(3)第三方库准备,安装guzzle库
把guzzlehttp/guzzle:6.0放到composer.json中
然后执行composer update
这样vendor就有了
(1)创建base文件
a、这里是Base文件的引入的外部文件和声明的变量
cache是用来缓存token的
config是用来获取配置文件的信息的
其他的都是第三方库需要引入的文件
b、这里是一个构造函数跟一个获取基础请求url的方法
这里就不做介绍了
第59行就是使用了guzzle的client类库,这里是进行请求获取token的
在94行就是使用了上边的request的请求方法来发起请求
token是有有效期的,所以我们不可能用一次token就从服务端获取一下,所以就有了getToken这个方法来使用缓存的判断来实现token在有效期限之内从缓存读取数据
可以发现这个方法跟上边的那个request的方法很相似,因为获取token时是不需要给header中加入token的这个参数的,但是在调用接口就需要加入这个header,所以也就这一点区别
这个文件主要就是做一个简单的异常处理
这个文件就是我们调用base文件的方法来实现功能需求的文件了
用户名为user789 昵称为 你好我是咔咔
测试成功,那么其他的接口也是一样,只需要把参数写对就可以了
base.php
orgname = config::get('system.orgname');
$this->appname = config::get('system.appname');
$this->client_ID = config::get('system.client_ID');
$this->client_Secret = config::get('system.client_Secret');
$this->request_url = 'https://a1.easemob.com/';
}
/**
* author:咔咔
*
* 基础请求地址
* @return string
*/
public function baseUrl()
{
return $this->request_url . $this->orgname . '/' . $this->appname . '/';
}
/**
* author:咔咔
*
* 获取token请求
* @param $method 请求方式
* @param array $params 请求参数
* @param $options
* @return array|mixed
* @throws Error
*/
public function request($method, $url, $params = [], $options = [])
{
$config = ['base_uri' => $this->baseUrl()];
$client = new Client($config);
$header = [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
];
$data = ['connect_timeout' => 30, 'headers' => $header];
if ($method == 'GET') {
$data['query'] = $params;
} else {
$data['json'] = $params;
}
$options && $data = array_merge($data, $options);
$body = [];
try {
$res = $client->request($method, $url, $data);
$body = \GuzzleHttp\json_decode($res->getBody()->getContents(), 1);
} catch (RequestException $e) {
throw new Error($e->getMessage(), -1);
}
return $body;
}
/**
* author:咔咔
*
* 从服务端获取token
* @throws Error
*/
public function getTokenFromServer()
{
$data = [
'grant_type' => 'client_credentials',
'client_id' => $this->client_ID ,
'client_secret' => $this->client_Secret
];
$result = $this->request('POST', 'token', $data);
return $result;
}
/**
* author:咔咔
*
* 获取token并存入缓存
*/
public function getToken ()
{
$token = Cache::get('token');
if(empty($token)){
$result = $this->getTokenFromServer();
# 减去1500秒防止误差
Cache::set('token',$result['access_token'],$result['expires_in']-1500);
return $result['access_token'];
}
return $token;
}
/**
* author:咔咔
*
* 功能请求
* @param $method
* @param array $params
* @param $options
* @return array|mixed
* @throws Error
*/
protected function _request($method, $url, $params = [], $options = [])
{
$client = new Client();
$header = [
'Content-Type' => 'application/json',
'Accept' => 'application/json',
];
$token = $this->getToken();
$header['Authorization'] = "Bearer ${token}";
$data = ['connect_timeout' => 30, 'headers' => $header];
if ($method == 'GET') {
$data['query'] = $params;
} else {
$data['json'] = $params;
}
$options && $data = array_merge($data, $options);
$body = [];
try {
$res = $client->request($method, $url, $data);
$body = \GuzzleHttp\json_decode($res->getBody()->getContents(), true);
} catch (RequestException $e) {
$info = \GuzzleHttp\json_decode($e->getResponse()->getBody()->getContents(), 1);
throw new Error($info['error'], -1);
}
return $body;
}
}
error.php
_getMessage($message), $code, $previous);
}
// TODO 异常信息过滤
private function _getMessage($msg)
{
$message = $msg;
return $message;
}
}
user.php
setGroup($groupname,$desc,$public,$maxusers,$members_only,$allowinvites,$owner,$members);
dump($data);die;
}
/**
* author:咔咔
*
* 获取token
*/
public function token()
{
$data = $this->getToken();
if(!$data){
return show(400,'获取失败');
}
return show(200,'获取成功',$data);
}
/**
* author:咔咔
*
* 注册Im用户
*/
public function setUser ()
{
$params = [
'username' => 'user789',
'password' => '123456',
'nickname' => '你好我是咔咔'
];
# 生成IM用户
$result = $this->_request('POST', $this->baseUrl().'users', $params, $options = null);
# 成功参数里边会有username作为标识
$name = $result['entities'][0]['username'];
if(!$name){
return ajaxReturn(ERROR);
}
return ajaxReturn(SUCCESS,$result);
}
/**
* author:咔咔
* @param $groupname 群组名称,此属性为必须的
* @param $desc 群组描述,此属性为必须的
* @param $public 是否是公开群,此属性为必须的
* @param $maxusers 群组成员最大数(包括群主),值为数值类型,默认值200,最大值2000,此属性为可选的
* @param $members_only 加入群是否需要群主或者群管理员审批,默认是false
* @param $allowinvites 是否允许群成员邀请别人加入此群。 true:允许群成员邀请人加入此群,false:只有群主或者管理员才可以往群里加人
* @param $owner 群组的管理员,此属性为必须的
* @param $members 群组成员,此属性为可选的,但是如果加了此项,数组元素至少一个(注:群主user1不需要写入到members里面)
*/
/**
参数案例
$groupname = '我是咔咔';
$desc = '王者荣耀群';
$public = true;
$maxusers = 200;
$members_only = false;
$allowinvites = true;
$owner = 'user1';
$members = ["7899","user789"];
*/
public function setGroup ($groupname,$desc,$public,$maxusers,$members_only,$allowinvites,$owner,$members)
{
$params = [
'groupname' => $groupname,
'desc' => $desc,
'public' => $public,
'maxusers' => $maxusers,
'members_only' => $members_only,
'allowinvites' => $allowinvites,
'owner' => $owner,
'members' => $members
];
$result = $this->_request('POST', $this->baseUrl().'chatgroups', $params, $options = null);
$name = $result['data']['groupid'];
if(!$name){
return ajaxReturn(ERROR);
}
return ajaxReturn(SUCCESS,$result);
}
}