<?php
/**
* 鸿宇多用户商城 在线客服聊天系统-前台
* ============================================================================
* 版权所有 2015-2018 鸿宇多用户商城科技有限公司,并保留所有权利。
* 网站地址: http://bbs.hongyuvip.com;
* ----------------------------------------------------------------------------
* 仅供学习交流使用,如需商用请购买正版版权。鸿宇不承担任何法律责任。
* 踏踏实实做事,堂堂正正做人。
* ============================================================================
* $Author: 鸿宇多用户商城 $
* $Id: category.php 17217 2015-02-10 06:29:08Z 鸿宇多用户商城 $
*/
define('IN_ECS', true);
require ('includes/init.php');
require ('includes/lib_chat.php');
/* 载入语言文件 */
require_once (ROOT_PATH . 'languages/' . $_CFG['lang'] . '/user.php');
$action = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : 'chat';
/* 检查用户是否已登录 */
if(empty($_SESSION['user_id']) && $action != 'act_login' && $action != 'check_login')
{
// $captcha = intval($_CFG['captcha']);
// if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION['login_fail'] > 2)) && gd_version() > 0)
// {
// $GLOBALS['smarty']->assign('enabled_captcha', 1);
// $GLOBALS['smarty']->assign('rand', mt_rand());
// }
// 如果未登录跳转到登录页面
/**
$smarty->assign('lang', $_LANG);
$smarty->assign('back_act', '');
$smarty->assign('action', 'login');
$smarty->display('chat_passport.dwt');
**/
show_message('您还未登录系统,请先登录!', array('登录', '返回上一页'), array('user.php?act=login', 'index.php'), 'info');
return;
}
//路由
$function_name = 'action_' . $action;
if(function_exists($function_name))
{
call_user_func($function_name);
}
else
{
exit('函数' . $function_name . '不存在');
}
/**
* 检查用户是否登录
*/
function action_check_login()
{
$is_login = empty($_SESSION['user_id']) ? 'false' : 'true';
exit($is_login);
}
/**
* 处理会员登录
*/
function action_act_login ()
{
$user_id = $_SESSION['user_id'];
$smarty = get_smarty();
$ecs = get_ecs();
$db = get_database();
/* 处理会员的登录 */
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
$password = isset($_POST['password']) ? trim($_POST['password']) : '';
$back_act = isset($_POST['back_act']) ? trim($_POST['back_act']) : '';
$captcha = intval($_CFG['captcha']);
if(($captcha & CAPTCHA_LOGIN) && (! ($captcha & CAPTCHA_LOGIN_FAIL) || (($captcha & CAPTCHA_LOGIN_FAIL) && $_SESSION['login_fail'] > 2)) && gd_version() > 0)
{
if(empty($_POST['captcha']))
{
$smarty->assign('lang', $_LANG);
$smarty->assign('action', 'login');
$smarty->assign('error', $_LANG['invalid_captcha']);
$smarty->display('chat_passport.dwt');
return;
}
/* 检查验证码 */
include_once ('includes/cls_captcha.php');
$validator = new captcha();
$validator->session_word = 'captcha_login';
if(! $validator->check_word($_POST['captcha']))
{
$smarty->assign('lang', $_LANG);
$smarty->assign('action', 'login');
$smarty->assign('error', $_LANG['invalid_captcha']);
$smarty->display('chat_passport.dwt');
return;
}
}
if(is_email($username))
{
$sql = "select user_name from " . $ecs->table('users') . " where email='" . $username . "'";
$username_e = $db->getOne($sql);
if($username_e)
$username = $username_e;
}
if(is_telephone($username))
{
$sql = "select user_name from " . $ecs->table('users') . " where mobile_phone='" . $username . "'";
$username_res = $db->query($sql);
$kkk = 0;
while($username_row = $db->fetchRow($username_res))
{
$username_e = $username_row['user_name'];
$kkk = $kkk + 1;
}
if($kkk > 1)
{
$smarty->assign('lang', $_LANG);
$smarty->assign('action', 'login');
$smarty->assign('error', '本网站有多个会员ID绑定了和您相同的手机号,请使用其他登录方式,如:邮箱或用户名。');
$smarty->display('chat_passport.dwt');
return;
}
if($username_e)
{
$username = $username_e;
}
}
if($GLOBALS['user']->login($username, $password, isset($_POST['remember'])))
{
update_user_info();
recalculate_price();
// 登录成功
$ucdata = isset($user->ucdata) ? $user->ucdata : '';
// show_message($_LANG['login_success'] . $ucdata ,
// array($_LANG['back_up_page'], $_LANG['profile_lnk']),
// array($back_act,'user.php'), 'info');
// 刷新user_id
$user_id = $_SESSION['user_id'];
header('Location: chat.php?act=chat');
}
else
{
$_SESSION['login_fail'] ++;
$smarty->assign('lang', $_LANG);
$smarty->assign('action', 'login');
$smarty->assign('error', $_LANG['login_failure']);
$smarty->display('chat_passport.dwt');
return;
}
}
/* ------------------------------------------------------ */
// -- 在线客服聊天 --> 请求聊天
// 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id,
// chat_order_id, chat_supp_id
/* ------------------------------------------------------ */
function action_chat ()
{
$user_id = $_SESSION['user_id'];
$smarty = get_smarty();
$ecs = get_ecs();
$db = get_database();
// 检查用户是否存在于聊天系统
$exist = check_of_username_exist($user_id);
// 获取用户头像和密码
if(! empty($user_id))
{
$sql = "select password, headimg from " . $ecs->table('users') . " where user_id = '$user_id'";
$row = $db->getRow($sql);
$headimg = $row['headimg'];
$password = $row['password'];
$smarty->assign('headimg', $headimg);
}
// 如果用户不存在,创建用户
if(! $exist)
{
$sql = 'select a.user_id, a.password, a.email, a.user_name from ' . $ecs->table('users') . ' AS a where a.user_id = "' . $user_id . '"';
$user = $GLOBALS['db']->getRow($sql);
if(empty($user))
{
show_message('用户不存在!', array('返回'), array('index.php'), 'error');
return;
}
$username = $user_id;
$password = $user['password'];
$name = $user['user_name'];
$email = $user['email'];
$type = 10;
$shop_id = - 1;
$result = create_of_user($username, $password, $name, $email, $type, $shop_id);
if(!$result)
{
show_message('无法创建聊天用户!', array('返回'), array('index.php'), 'error');
return;
}
}
// 获取商品、订单、店铺信息
$goods_id = isset($_REQUEST['chat_goods_id']) ? intval($_REQUEST['chat_goods_id']) : null;
$supp_id = isset($_REQUEST['chat_supp_id']) ? intval($_REQUEST['chat_supp_id']) : -1;
$order_id = isset($_REQUEST['chat_order_id']) ? intval($_REQUEST['chat_order_id']) : null;
$tab_items = array();
$cus_types = CUSTOMER_SERVICE;
// 处理商品信息
if($goods_id)
{
$goods = goods_info($goods_id);
$smarty->assign('chat_goods', $goods);
$smarty->assign('chat_goods_id', $goods_id);
$tab_items[] = array("id" => "chat_goods", "name" => "咨询商品");
$cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_PRE;
}
// 处理订单信息
if($order_id)
{
require ('includes/lib_order.php');
$order = order_info($order_id);
$supp_id = $order['supplier_id'];
$order['order_status_text'] = $GLOBALS['_LANG']['os'][$order['order_status']] . ',' . $GLOBALS['_LANG']['ps'][$order['pay_status']] . ',' . $GLOBALS['_LANG']['ss'][$order['shipping_status']];
$order['goods_list'] = order_goods($order_id);
$smarty->assign('chat_order', $order);
$smarty->assign('chat_order_id', $order_id);
$smarty->assign('chat_order_sn', $order['order_sn']);
$tab_items[] = array("id" => "chat_order", "name" => "咨询订单");
$cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_AFTER;
}
// 处理店铺信息
if($supp_id > 0)
{
$supp_info = get_dianpu_baseinfo($supp_id);
$smarty->assign('supp_info', $supp_info);
$smarty->assign('chat_supp_id', $supp_id);
$tab_items[] = array("id" => "chat_supp", "name" => "店铺信息");
$cus_types = CUSTOMER_SERVICE . ',' . CUSTOMER_PRE;
}
// 获取最近订单列表
require ('includes/lib_transaction_1.php');
$order_list = get_user_orders_1($user_id, 5, 0);
$smarty->assign('order_list', $order_list);
$smarty->assign('order_count', count($order_list));
$tab_items[] = array("id" => "chat_order_list", "name" => "最近订单");
// 获取客服信息
$customers = get_customers($cus_types, $supp_id);
$smarty->assign('tab_items', json_encode($tab_items));
$to = null;
// 客服分配策略
if(! empty($customers))
{
$poliy = 1; // 随机策略
if($poliy == 0)
{
// 顺序策略
foreach($customers as $customer)
{
if($customer['status'] == '在线' || $customer['status'] == '空闲')
{
$to = $customer;
break;
}
}
}
else if($poliy == 1)
{
// 随机策略
$onlines = array();
foreach($customers as $customer)
{
if($customer['status'] == '在线' || $customer['status'] == '空闲')
{
$onlines[] = $customer;
}
}
if(!empty($onlines))
{
$index = array_rand($onlines);
$to = $onlines[$index];
}
}
}
if(empty($to))
{
$smarty->assign('page_title', '在线聊天', '当前客服忙碌,请稍后联系!');
$smarty->assign('no_agent_available', true);
}
else
{
$xmpp_domain = get_xmpp_domain();
$_SESSION['OF_FROM'] = $user_id . '@' . $xmpp_domain;
$_SESSION['OF_TO'] = $to['of_username'] . '@' . $xmpp_domain;
// 传递必要的变量到模板
$smarty->assign('from', $_SESSION['OF_FROM']);
$smarty->assign('password', $password);
$smarty->assign('to', $_SESSION['OF_TO']);
$smarty->assign('username', $_SESSION['user_name']);
$smarty->assign('customername', $to['cus_name']);
$smarty->assign('xmpp_domain', $xmpp_domain);
// 网站基础URL
$url = "https://" . $_SERVER['HTTP_HOST'];
$smarty->assign('url', $url);
$smarty->assign('page_title', '在线聊天', '客服<span class="kf_name">' . $to['cus_name'] . '</span>已加入会话!');
}
// 显示聊天页面
$smarty->display('chat.dwt');
}
/* ------------------------------------------------------ */
// -- 在线客服聊天 --> 认证失败,重新设置聊天系统的用户密码
// 聊天窗口右侧默认展示最近订单,如果想要展示商品、订单、店铺则需要在当前页面中设置隐藏域,name必须为 chat_goods_id,
// chat_order_id, chat_supp_id
/* ------------------------------------------------------ */
function action_authfail ()
{
$user_id = $_SESSION['user_id'];
$sql = "select user_name, password, email from " . $GLOBALS['ecs']->table('users') . " where user_id = '$user_id'";
$row = $db->getRow($sql);
$success = create_of_user($user_id, $row['password'], $row['user_name'], $row['email'], 10, - 1);
if($success)
{
$result = array(
'error' => 1,'message' => '可能由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => ''
);
}
else
{
$result = array(
'error' => 1,'message' => '由于网络原因,发生错误!请点击 <a href="chat.php?act=chat"><strong>重试</strong></a> ,重新连接...','content' => ''
);
}
$result = json_encode($result);
exit($result);
}
/**
* 用户离线
*/
function action_off_line()
{
// 用户超过5分钟未发言则视为自动离线,更新客服状态
}
function is_telephone ($phone)
{
$chars = "/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/";
if(preg_match($chars, $phone))
{
return true;
}
}
/**
* 获取db对象
*
* @return unknown
*/
function get_database ()
{
return $GLOBALS['db'];
}
/**
* 获取smarty对象
*
* @return unknown
*/
function get_smarty ()
{
return $GLOBALS[smarty];
}
/**
* 获取ecs对象
*
* @return unknown
*/
function get_ecs ()
{
return $GLOBALS['ecs'];
}
/*
* 获取商品所对应店铺的店铺基本信息
* @param int $suppid 店铺id
* @param int $suppinfo 入驻商的信息
*/
function get_dianpu_baseinfo ($suppid = 0)
{
if(intval($suppid) <= 0)
{
return;
}
$sql_supplier = "SELECT s.supplier_id,s.supplier_name,s.add_time,sr.rank_name FROM " . $GLOBALS['ecs']->table("supplier") . " as s left join " . $GLOBALS['ecs']->table("supplier_rank") . " as sr ON s.rank_id=sr.rank_id WHERE s.supplier_id=" . $suppid . " AND s.status=1";
$supp_info = $GLOBALS['db']->getRow($sql_supplier);
$sql = "SELECT * FROM " . $GLOBALS['ecs']->table('supplier_shop_config') . " WHERE supplier_id = " . $suppid;
$shopinfo = $GLOBALS['db']->getAll($sql);
$config = array();
foreach($shopinfo as $value)
{
$config[$value['code']] = $value['value'];
}
$shop_info = array();
$shop_info['ghs_css_path'] = 'themes/' . $config['template'] . '/images/ghs/css/ghs_style.css'; // 入驻商所选模板样式路径
$shoplogo = empty($config['shop_logo']) ? 'themes/' . $config['template'] . '/images/dianpu.jpg' : $config['shop_logo'];
$shop_info['shoplogo'] = $shoplogo; // 商家logo
$shop_info['shopname'] = htmlspecialchars($config['shop_name']); // 店铺名称
$shop_info['suppid'] = $suppid; // 商家名称
$shop_info['suppliername'] = htmlspecialchars($supp_info['supplier_name']); // 商家名称
$shop_info['userrank'] = htmlspecialchars($supp_info['rank_name']); // 商家等级
$shop_info['region'] = get_province_city($config['shop_province'], $config['shop_city']);
$shop_info['address'] = $config['shop_address'];
$shop_info['serviceqq'] = $config['qq'];
$shop_info['serviceww'] = $config['ww'];
$shop_info['serviceemail'] = $config['service_email'];
$shop_info['servicephone'] = $config['service_phone'];
$shop_info['createtime'] = gmdate('Y-m-d', $config['add_time']); // 商家创建时间
$suppid = (intval($suppid) > 0) ? intval($suppid) : intval($_GET['suppId']);
return $shop_info;
}
/* 查看留言详情 */
?> 在线客服聊天 如何配置
最新发布