序言
在环信的文档中介绍,能够看到是没有PHP的sdk的,那么就须要我们本身简单的封装一下。我这里使用的是TP5php
环信素材准备
(1)注册完以后会建立一个IM应用ajax
(2)建立成功会有这下图这样的一个展现json
(3)点击一下会有详细信息数组
使用箭头标注的就是我们须要的信息,记录下来缓存
项目搭建
(1)目录结构app
(2)建立配置文件system.phpcomposer
(3)第三方库准备,安装guzzle库函数
把guzzlehttp/guzzle:6.0放到composer.json中测试
而后执行composer updatethis
这样vendor就有了
base文件代码编写
(1)建立base文件
a、这里是Base文件的引入的外部文件和声明的变量
cache是用来缓存token的
config是用来获取配置文件的信息的
其余的都是第三方库须要引入的文件
b、这里是一个构造函数跟一个获取基础请求url的方法
这里就不作介绍了
c、这里是获取token的一个request的方法
第59行就是使用了guzzle的client类库,这里是进行请求获取token的
d、这里是从服务端获取token
在94行就是使用了上边的request的请求方法来发起请求
e、这里是项目中使用token的处理
token是有有效期的,因此咱们不可能用一次token就从服务端获取一下,因此就有了getToken这个方法来使用缓存的判断来实现token在有效期限以内从缓存读取数据
f、这个方法是用来调用环信的接口封装的请求
能够发现这个方法跟上边的那个request的方法很类似,由于获取token时是不须要给header中加入token的这个参数的,可是在调用接口就须要加入这个header,因此也就这一点区别
Error文件代码
这个文件主要就是作一个简单的异常处理
user文件代码
这个文件就是咱们调用base文件的方法来实现功能需求的文件了
a、下来咱们建立一个用户
用户名为user789 昵称为 你好我是咔咔
测试成功,那么其余的接口也是同样,只须要把参数写对就能够了
源码
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); } }