php融云聊天室集成

一、服务端

  • 获取token
      * 模拟post进行url请求 获取融云token
      * @param string $url
      * @param array $post_data
      * http://api.cn.ronghub.com/user/getToken.[format]
      * [format] 表示返回格式,可以为 json 或 xml,注意不要带 [ ]。
      * userId=‘用户 Id’&name=‘用户名称’&portraitUri=‘用户头像 编码过的URL’
      */
     protected function getRyToken($postUrl = '', $postData = array()) {
         if (empty($postUrl) || empty($postData)) {
             return false;
         }
         $appKey = 'appKey ';
         $appSecret = 'appSecret ';
         $nonce = mt_rand(); // 获取随机数。
         $timeStamp = time();// 获取时间戳。
         $signature = sha1($appSecret.$nonce.$timeStamp);
         $httpHeader = array(
             'App-Key:'.$appKey, //  平台分配
             'Nonce:'.$nonce, // 随机数
             'Timestamp:'.$timeStamp, // 时间戳
             'Signature:'.$signature, // 签名
             'Content-Type: application/x-www-form-urlencoded',
         );
         $ch = curl_init();//初始化curl
         curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
         curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
         // 增加 HTTP Header(头)里的字段
         curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
         curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
         curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
         $data = curl_exec($ch);//运行curl
         curl_close($ch);
         return $data;
     }
    
  • 服务端聊天室相关接口
作为一个PHPer还是很简单的
聊天室服务: https://www.rongcloud.cn/docs/server.html#chatroom 

二、客户端

  • 引入融云SDK 一般使用最新版 直接放到HTML中就行
<script src="http://cdn.ronghub.com/RongIMLib-2.2.5.min.js"></script> 
  • 初始化 SDK
RongIMClient.init('AppKey:应用的唯一标识。')
  • 设置连接监听状态
// 设置连接监听状态 ( status 标识当前连接状态 )
// 连接状态监听器
RongIMClient.setConnectionStatusListener({
 onChanged: function (status) {
     switch (status) {
         case RongIMLib.ConnectionStatus.CONNECTED:
             console.log('链接成功');
             break;
         case RongIMLib.ConnectionStatus.CONNECTING:
             console.log('正在链接');
             break;
         case RongIMLib.ConnectionStatus.DISCONNECTED:
             console.log('断开连接');
             break;
         case RongIMLib.ConnectionStatus.KICKED_OFFLINE_BY_OTHER_CLIENT:
             console.log('其他设备登录');
             break;
           case RongIMLib.ConnectionStatus.DOMAIN_INCORRECT:
             console.log('域名不正确');
             break;
         case RongIMLib.ConnectionStatus.NETWORK_UNAVAILABLE:
           console.log('网络不可用');
           break;
         }
 }});
  • 消息监听器
// 消息监听器  返回消息console.log(message) 中有个字段为 conversationType对应的值:
1、RongIMLib.ConversationType.PRIVATE : 二人单聊会话类型,枚举值为 1 。
2、RongIMLib.ConversationType.DISCUSSION : 讨论组会话类型,枚举值为 2 。
3、RongIMLib.ConversationType.GROUP : 群组会话类型,枚举值为 3。
4、RongIMLib.ConversationType.CHATROOM : 聊天室会话类型,枚举值为 4 。
5、RongIMLib.ConversationType.CUSTOMER_SERVICE : 客服会话类型,枚举值为 5 。
6、RongIMLib.ConversationType.SYSTEM : 系统消息类型,枚举值为 6 。
7、RongIMLib.ConversationType.APP_PUBLIC_SERVICE : 公众账号(默认关注)会话类型,枚举值为 7 。
8、RongIMLib.ConversationType.PUBLIC_SERVICE : 公众账号 (手动关注) 会话类型,枚举值为 8 。
// 具体代码
RongIMClient.setOnReceiveMessageListener({
   // 接收到的消息
   onReceived: function (message) {

       // 判断消息类型
       switch(message.messageType){
           case RongIMClient.MessageType.TextMessage:
               // message.content.content => 消息内容
               console.log(message) 
               break;
           case RongIMClient.MessageType.VoiceMessage:
               // 对声音进行预加载                
               // message.content.content 格式为 AMR 格式的 base64 码
               break;
           case RongIMClient.MessageType.ImageMessage:
              // message.content.content => 图片缩略图 base64。
              // message.content.imageUri => 原图 URL。
              break;
           case RongIMClient.MessageType.DiscussionNotificationMessage:
              // message.content.extension => 讨论组中的人员。
              break;
           case RongIMClient.MessageType.LocationMessage:
              // message.content.latiude => 纬度。
              // message.content.longitude => 经度。
              // message.content.content => 位置图片 base64。
              break;
           case RongIMClient.MessageType.RichContentMessage:
              // message.content.content => 文本消息内容。
              // message.content.imageUri => 图片 base64。
              // message.content.url => 原图 URL。
              break;
           case RongIMClient.MessageType.InformationNotificationMessage:
               // do something...
              break;
           case RongIMClient.MessageType.ContactNotificationMessage:
               // do something...
              break;
           case RongIMClient.MessageType.ProfileNotificationMessage:
               // do something...
              break;
           case RongIMClient.MessageType.CommandNotificationMessage:
               // do something...
              break;
           case RongIMClient.MessageType.CommandMessage:
               // do something...
              break;
           case RongIMClient.MessageType.UnknownMessage:
               // do something...
              break;
           default:
               // do something...
       }
   }
});
  • 连接融云
//  用户事先在融云请求到的token
var rongToken = "MG9HMPWNp6UAisvxYHmHWkLw+k6ByJu8+ofG8Zo41+Wes0qr3KpHwwEiU24KyE+N5bdFpT0xCHg=";
RongIMClient.connect(rongToken, {
 onSuccess: function(userId) {
   console.log("Connect successfully." + userId);// 用户在融云的id 一般和本地用户的id一样
 },
 onTokenIncorrect: function() {
   console.log('token无效');
 },
 onError:function(errorCode){
       var info = '';
       switch (errorCode) {
         case RongIMLib.ErrorCode.TIMEOUT:
           info = '超时';
           break;
         case RongIMLib.ConnectionState.UNACCEPTABLE_PAROTOCOL_VERSION:
           info = '不可接受的协议版本';
           break;
         case RongIMLib.ConnectionState.IDENTIFIER_REJECTED:
           info = 'appkey不正确';
           break;
         case RongIMLib.ConnectionState.SERVER_UNAVAILABLE:
           info = '服务器不可用';
           break;
       }
       console.log(errorCode);
     }
});
  • 加入聊天室
//  关于进入、退出、拉取 聊天室的官方地址 https://www.rongcloud.cn/docs/web.html#chatroom
// 如果聊天室不存在会创建聊天室
// 当然也可以使用服务端的接口来创建聊天室,服务端更方便一些
var chatRoomId = "10001"; // 聊天室 Id。
var count = 10;// 拉取最近聊天最多 50 条。
RongIMClient.getInstance().joinChatRoom(chatRoomId, count, {
 onSuccess: function() {
      // 加入聊天室成功。
 },
 onError: function(error) {
   // 加入聊天室失败
 }
});
  • 退出聊天室
//  关于进入、退出、拉取 聊天室的官方地址 https://www.rongcloud.cn/docs/web.html#chatroom
var chatRoomId = "10001"; // 聊天室 Id。
RongIMClient.getInstance().quitChatRoom(chatRoomId, {
 onSuccess: function() {
      // 退出聊天室成功。
 },
 onError: function(error) {
   // 退出聊天室失败。
 }
});
  • 聊天室内发言
//  content 是消息的主体内容  
//  extra 是其它的内容,可以传用户昵称,头像信息
var msg = new RongIMLib.TextMessage({content:"hello RongCloud!",extra:"附加信息"});
var conversationtype = RongIMLib.ConversationType.PRIVATE; // 单聊,其他会话选择相应的消息类型即可。
var targetId = "10001"; //  聊天室的id
RongIMClient.getInstance().sendMessage(conversationtype, targetId, msg, {
               onSuccess: function (message) {
                 //message 为发送的消息对象并且包含服务器返回的消息唯一Id和发送消息时间戳
                   console.log("Send successfully");
               },
               onError: function (errorCode,message) {
                   var info = '';
                   switch (errorCode) {
                       case RongIMLib.ErrorCode.TIMEOUT:
                           info = '超时';
                           break;
                       case RongIMLib.ErrorCode.UNKNOWN_ERROR:
                           info = '未知错误';
                           break;
                       case RongIMLib.ErrorCode.REJECTED_BY_BLACKLIST:
                           info = '在黑名单中,无法向对方发送消息';
                           break;
                       case RongIMLib.ErrorCode.NOT_IN_DISCUSSION:
                           info = '不在讨论组中';
                           break;
                       case RongIMLib.ErrorCode.NOT_IN_GROUP:
                           info = '不在群组中';
                           break;
                       case RongIMLib.ErrorCode.NOT_IN_CHATROOM:
                           info = '不在聊天室中';
                           break;
                       default :
                           info = x;
                           break;
                   }
                   console.log('发送失败:' + info);
               }
           }
       );
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 转载自:http://www.cnblogs.com/txw1958/archive/2013/01/19/286...
    php_bruce阅读 2,259评论 1 5
  • CURLOPT_RETURNTRANSFER 选项:curl_setopt($ch, CURLOPT_RETURN...
    Talentisan阅读 16,783评论 0 2
  • 在还没有接触curl的时候,相信大家在获取网页内容的时,使用得最多的一个函数就是:file_get_content...
    四月不见阅读 1,876评论 7 39
  • 离除夕越来越近,你们都回去了吗? 回去的沿途中,熟悉的建筑物,路过的学校,道路两边添加了,喜庆的灯笼,为迎接即将到...
    转身时阅读 103评论 1 0
  • 有句话说得好,你不逼自己一把,永远不知道自己有多厉害。 高中伊始 我高中的时候是个内向自卑的男孩子,每天脸上都布满...
    战长歌阅读 262评论 0 1