序言

在环信的文档中介绍,可以看到是没有PHP的sdk的,那么就需要咱们自己简单的封装一下。我这里使用的是TP5

环信素材准备

(1)注册完之后会创建一个IM应用

【PHP】接入环信创建群组和IM用户_json

【PHP】接入环信创建群组和IM用户_php_02

(2)创建成功会有这下图这样的一个展示

【PHP】接入环信创建群组和IM用户_json_03

(3)点击一下会有详细信息

使用箭头标注的就是咱们需要的信息,记录下来

【PHP】接入环信创建群组和IM用户_缓存_04

项目搭建

(1)目录结构

【PHP】接入环信创建群组和IM用户_php_05

(2)创建配置文件system.php

【PHP】接入环信创建群组和IM用户_php_06

(3)第三方库准备,安装guzzle库

把guzzlehttp/guzzle:6.0放到composer.json中

【PHP】接入环信创建群组和IM用户_php _07

然后执行composer update

【PHP】接入环信创建群组和IM用户_php_08

这样vendor就有了

【PHP】接入环信创建群组和IM用户_缓存_09

base文件代码编写

(1)创建base文件

a、这里是Base文件的引入的外部文件和声明的变量

cache是用来缓存token的

config是用来获取配置文件的信息的

其他的都是第三方库需要引入的文件

【PHP】接入环信创建群组和IM用户_缓存_10

b、这里是一个构造函数跟一个获取基础请求url的方法

这里就不做介绍了

【PHP】接入环信创建群组和IM用户_php _11

c、这里是获取token的一个request的方法

第59行就是使用了guzzle的client类库,这里是进行请求获取token的

【PHP】接入环信创建群组和IM用户_php_12

 d、这里是从服务端获取token

在94行就是使用了上边的request的请求方法来发起请求

【PHP】接入环信创建群组和IM用户_群组_13

e、这里是项目中使用token的处理

token是有有效期的,所以我们不可能用一次token就从服务端获取一下,所以就有了getToken这个方法来使用缓存的判断来实现token在有效期限之内从缓存读取数据

【PHP】接入环信创建群组和IM用户_缓存_14

f、这个方法是用来调用环信的接口封装的请求

可以发现这个方法跟上边的那个request的方法很相似,因为获取token时是不需要给header中加入token的这个参数的,但是在调用接口就需要加入这个header,所以也就这一点区别

【PHP】接入环信创建群组和IM用户_php_15

【PHP】接入环信创建群组和IM用户_json_16

Error文件代码

这个文件主要就是做一个简单的异常处理

【PHP】接入环信创建群组和IM用户_php _17

user文件代码

这个文件就是我们调用base文件的方法来实现功能需求的文件了

a、下来我们创建一个用户

用户名为user789   昵称为 你好我是咔咔

【PHP】接入环信创建群组和IM用户_php _18

测试成功,那么其他的接口也是一样,只需要把参数写对就可以了

【PHP】接入环信创建群组和IM用户_群组_19

源码

base.php

<?php

namespace app\huanxin\controller;

use think\Cache;
use think\config;
use think\Controller;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

class Base extends Controller
{
protected $orgname;
protected $appname;
protected $client_ID;
protected $client_Secret;
protected $request_url;


/**
* author:咔咔
*
* Base constructor.
*/
public function __construct()
{
parent::__construct();
$this->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

<?php

namespace app\huanxin\controller;

use Exception;

class Error extends \Exception
{
public function __construct($message = "", $code = 0, Exception $previous = null)
{
parent::__construct($this->_getMessage($message), $code, $previous);
}

// TODO 异常信息过滤
private function _getMessage($msg)
{
$message = $msg;

return $message;
}
}

user.php

<?php

namespace app\huanxin\controller;

class User extends Base
{
/**
* author:咔咔
*
* 测试
*/
public function index ()
{
$groupname = '我是咔咔';
$desc = '王者荣耀群';
$public = true;
$maxusers = 200;
$members_only = false;
$allowinvites = true;
$owner = 'user1';
$members = [];
$data = $this->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);
}
}