ThinkPHP 3.2 「转」 整改ThinkPHP+rongcloud的web即时聊天

发布时间:2017年12月15日 17:25:11编辑:admin阅读(419)评论(0)

    一直想弄个自己的网站,记录一下自己那些年写过的代码,撸码的时光(虽然才三年),刚接触软件开发的时候完全不知道是做什么,而我又能做什么,

    每次遇到问题都是百度,强大的百度不断的搜索,终会看到大牛把自己的经验写出来供菜鸟学习,借鉴

    大牛们,感谢

    今天说说即时聊天的,手机QQ,微信聊天额....他们很屌。

    自己也做过app的即时聊天,大学写的是java,但是很失败,学的不是很精,为了生存转php了。php的道路也还很长要走

    app的聊天我以后再贴,用的是APiCloud开发,也是rongcloud的


    又说了一堆废话,别打。。。。这就上代码


    首先先注册融云账号,我们要用到

    融云注册地址:点这里

    注册之后申请应用,提交审核,审核通过之后就可以用了

    微信截图_20171212141013.png

    开发环境,开发阶段,不解释


    然后是配置

    config.php

    <?php
    return array(
        'TMPL_ACTION_ERROR'      => THINK_PATH . 'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件
            'TMPL_ACTION_SUCCESS'    => THINK_PATH . 'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件
        //***********************************试图设置**************************************
        'TMPL_PARSE_STRING' =>  array( // 添加输出替换
        '__UPLOAD__'    =>  __ROOT__.'/Uploads',
        //'__PUBLIC__' => __ROOT__.'/APP/Pchome/View/'.C('DEFAULT_THEME__MANAGE'),
        '__PUBLIC__' => __ROOT__.'/Application/Api/View/'.C('DEFAULT_THEME__MANAGE'),
        //'__PUBLIC__' => __ROOT__.'/Application/Pchome/View/',
    ),
    //***********************************模板设置**************************************
    'TMPL_L_DELIM'          =>  '{',            // 模板引擎普通标签开始标记
    'TMPL_R_DELIM'          =>  '}',            // 模板引擎普通标签结束标记
    'TMPL_FILE_DEPR'=>'_', // 试图文件链接方式
    'DEFAULT_MODULE'     => 'Api',              //默认模块
    //***********************************URL设置**************************************
    'MODULE_ALLOW_LIST'      => array('Api'), //允许访问列表
    //***********************************网站名字设置********************************************
    'project_name'=>'苏博客',//网站名称
    'RONG_IS_DEV'            => true,//是否是在开发中
        'RONG_DEV_APP_KEY'       => 'bmdehs6pb15ps', //融云开发环境下的key       仅供测试使用
        'RONG_DEV_APP_SECRET'    => 'kGIzmv6yQhbt', //融云开发环境下的SECRET     仅供测试使用
        'RONG_PRO_APP_KEY'       => '', //融云生产环境下的key
        'RONG_PRO_APP_SECRET'    => '', //融云生产环境下的SECRET
    'ALIOSS_CONFIG'          => array(
            'KEY_ID'             => '', // 阿里云oss key_id
            'KEY_SECRET'         => '', // 阿里云oss key_secret
            'END_POINT'          => '', // 阿里云oss endpoint
            'BUCKET'             => ''  // bucken 名称
            ),
    );

    ALIOSS_CONFIG 有些头像问题做判断,防止头像获取不到


    RongController.class.php  控制器

    读数据库数据,获取用的链接融云聊天的 token

    <?php
    namespace Api\Controller;
    use Think\Controller;
    Class RongController extends Controller{
    /**
         * 融云用户1
         */
        public function user1(){
            $user_data=M('web_users')->field('id,username,avatar')->find(1);
            $_SESSION['user']=array(
                'id'=>$user_data['id'],
                'username'=>$user_data['username'],
                'avatar'=>$user_data['avatar']
                );
            // 获取融云key
            $rong_key_secret=get_rong_key_secret();
            $assign=array(
                'uid'=>$user_data['id'], // 用户id
                'avatar'=>$user_data['avatar'],// 头像
                'username'=>$user_data['username'],// 用户名
                'rong_key'=>$rong_key_secret['key'],// 融云key
                'rong_token'=>get_rongcloud_token($user_data['id'])//获取融云token
                );
            $this->assign($assign);
            $this->display();
        }
    /**
         * 融云用户2
         */
        public function user2(){
            $user_data=M('web_users')->field('id,username,avatar')->find(2);
            $_SESSION['user']=array(
                'id'=>$user_data['id'],
                'username'=>$user_data['username'],
                'avatar'=>$user_data['avatar']
                );
            // 获取融云key
            $rong_key_secret=get_rong_key_secret();
            $assign=array(
                'uid'=>$user_data['id'], // 用户id
                'avatar'=>$user_data['avatar'],// 头像
                'username'=>$user_data['username'],// 用户名
                'rong_key'=>$rong_key_secret['key'],// 融云key
                'rong_token'=>get_rongcloud_token($user_data['id'])//获取融云token
                );
            $this->assign($assign);
            $this->display();
        }
    /**
         * 传递一个、或者多个用户id
         * 获取用户头像用户名;用来组合成好友列表
         */
        public function get_user_info(){
            $uids=I('post.uids');
            // 组合where数组条件
            $map=array(
                'id'=>array('in',$uids)
                );
            $data=M('web_users')
                ->field('id,username,avatar')
                ->where($map)
                ->select();
            ajax_return($data,'获取用户数据成功',0);
        }
    }
    ?>


    公共模块 function.php


    <?php
        /**
        * 根据配置项获取对应的key和secret
        * @return array key和secret
        */
        function get_rong_key_secret(){
            // 判断是需要开发环境还是生产环境的key
            if (C('RONG_IS_DEV')) {
                $key=C('RONG_DEV_APP_KEY');
                $secret=C('RONG_DEV_APP_SECRET');
            }else{
                $key=C('RONG_PRO_APP_KEY');
                $secret=C('RONG_PRO_APP_SECRET');
            }
            $data=array(
                'key'=>$key,
                'secret'=>$secret
            );
            return $data;
        }
        /**
        * 获取融云token
        * @param  integer $uid 用户id
        * @return integer      token
        */
        function get_rongcloud_token($uid){
            // 从数据库中获取token
            $user_data=M('web_users')->field('rong_token,username,avatar')->getById($uid);
            // 如果有token就返回
            if ($user_data['rong_token']) {
                return $user_data['rong_token'];
            }
            // 获取用户昵称和头像
            // 用户不存在
            if (empty($user_data)) {
                return false;
            }
            // 获取头像url格式
            $avatar=get_url($user_data['avatar']);
            // 获取key和secret
            $key_secret=get_rong_key_secret();
            // 实例化融云
            $rong_cloud=new \Org\Xb\RongCloud($key_secret['key'],$key_secret['secret']);
            // 获取token
            $token_json=$rong_cloud->getToken($uid,$user_data['username'],$avatar);
            $token_array=json_decode($token_json,true);
            // 获取token失败
            if ($token_array['code']!=200) {
                return false;
            }
            $token=$token_array['token'];
            // 修改数据库
            $result=M('web_users')->where('id='.$uid)->save(array('rong_token'=>$token));
            if ($result) {
                return $token;
            }else{
                return false;
            }
        }
        /**
        * 获取完整网络连接
        * @param  string $path 文件路径
        * @return string       http连接
        */
        function get_url($path){
        // 如果是空;返回空
        if (empty($path)) {
            return '';
        }
        // 如果已经有http直接返回
        if (strpos($path, 'http://')!==false) {
            return $path;
        }
        // 判断是否使用了oss
        $alioss=C('ALIOSS_CONFIG');
        if (empty($alioss['KEY_ID'])) {
            return 'http://'.$_SERVER['HTTP_HOST'].$path;
        }else{
            return 'http://'.$alioss['BUCKET'].'.'.$alioss['END_POINT'].$path;
        }
        }
        /**
        * 返回iso、Android、ajax的json格式数据
        * @param  array  $data           需要发送到前端的数据
        * @param  string  $error_message 成功或者错误的提示语
        * @param  integer $error_code    状态码: 0:成功  1:失败
        * @return string                 json格式的数据
        */
        function ajax_return($data='',$error_message='成功',$error_code=1){
        $all_data=array(
            'error_code'=>$error_code,
            'error_message'=>$error_message,
        );
        if ($data!=='') {
            $all_data['data']=$data;
            // app 禁止使用和为了统一字段做的判断
            $reserved_words=array('id','title','price','product_title','product_id','product_category','product_number');
            foreach ($reserved_words as $k => $v) {
        if (array_key_exists($v, $data)) {
            echo 'app不允许使用【'.$v.'】这个键名 —— 此提示是function.php 中的ajax_return函数返回的';
            die;
        }
        }
        }
        // 如果是ajax或者app访问;则返回json数据 pc访问直接p出来
        echo json_encode($all_data);
        exit(0);
    }

    主要服务器端就这些,然后是前端,

    前端就不一一贴出不来了,我比较懒(要贴的太多了),我会提供源码下载的

    微信截图_20171212142006.png

    体验地址 1 和 2 互相聊天,(没那么美观,强迫症的话急屎你)

    聊天体验地址:admin1

    聊天体验地址:admin2



    转载: 白俊遥博客