序言
在环信的文档中介绍,可以看到是没有PHP的sdk的,那么就需要咱们自己简单的封装一下。我这里使用的是TP5
环信素材准备
(2)创建成功会有这下图这样的一个展示
(3)点击一下会有详细信息
使用箭头标注的就是咱们需要的信息,记录下来
项目搭建
(1)目录结构
(3)第三方库准备,安装guzzle库
把guzzlehttp/guzzle:6.0放到composer.json中
然后执行composer update
这样vendor就有了
base文件代码编写
(1)创建base文件
cache是用来缓存token的
其他的都是第三方库需要引入的文件
这里就不做介绍了
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,$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,$options = [])
{
$client = new Client();
$header = [
'Content-Type' => 'application/json',];
$token = $this->getToken();
$header['Authorization'] = "Bearer ${token}";
$data = ['connect_timeout' => 30,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,$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',$options = null);
$name = $result['data']['groupid'];
if(!$name){
return ajaxReturn(ERROR);
}
return ajaxReturn(SUCCESS,$result);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。