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

序言

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

环信素材准备

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

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

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

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

项目搭建

(1)目录结构

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

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

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

然后执行composer update

这样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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咔咔-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值