一、服务端
- 获取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>
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);
}
}
);