valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } public function responseMsg() { // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取数据 $postStr = file_get_contents("php://input"); // logger(time().$postStr); $xcx=false;//true 是小程序 if (!empty($postStr)){ //$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); if($xcx){ $postObj =json_decode($postStr);} else{ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); } $fromUsername = trim($postObj->FromUserName); //openid $toUsername = trim($postObj->ToUserName); $tousernamebak = $toUsername; $keyword = trim($postObj->Content); $sessionFrom = trim($postObj->SessionFrom); $sessionFrom.='|'; $MsgType = $postObj->MsgType;//消息类型 text event $Event = $postObj->Event; if ($Event == "CLICK") { $EventKey = $postObj->EventKey; $MsgType='text'; $keyword=trim($EventKey);//修复公众号问题. logger('event:'.$Event.$MsgType.'key:'.$keyword); } $json = file_get_contents('json/'.$toUsername.'.json'); $arr = json_decode($json,true); $uniacid = $arr['uniacid']; $mang= $arr['mang']; if(empty($mang)){$mang='客服忙,已存入留言板';} $paiduile= $arr['paidui']; if(empty($paiduile)){$paiduile='排队中,请稍候.';} $kaishi= $arr['kaishi']; if(empty($kaishi)){$kaishi='你好,有什么可以帮到你的?';} //echo $uniacid; $website = $arr['website']; define("APPID", $arr['APPID']); define("APPSECRET", $arr['APPSECRET']); $fromuserid = $fromUsername;// $myopenid = trim($arr['openids']);//管理员id $Atoken = getToken(APPID,APPSECRET,$toUsername); $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$Atoken; if ($keyword=='openid'){ sendmsg($fromuserid,$MsgType,$fromuserid,'',$url);//给用户发消息. exit; } //echo $Atoken ; $json = file_get_contents("json/".$uniacid."_kefu.json"); $kefuarr = json_decode($json,true); //客服列表 ////////////////////////////////////////////////////////动作提示////////////////////////////// if ($MsgType == "event") { $event = $postObj->Event; if($event=='VIEW'){exit;} if($event=='LOCATION'){exit;} if(array_key_exists($fromuserid,$kefuarr)){ logger($MsgType.'是客服.'); $paiduinumber=count(file('json/'.$uniacid.'_paidui.json')); $liuyannumber=count(file('json/'.$toUsername.'_lishi.json')); $kehuopenid= $kefuarr[$fromuserid]; if (substr($kehuopenid,0,1)=='o'){ $users=getuser($uniacid,$kehuopenid,$nickname,$website); $zhuangtai='当前聊天:['.$users['id'].']'.$users['nickname']; }else{ $zhuangtai='休息中'; if ($kehuopenid=='空闲') { $zhuangtai='当前空闲,有客户会立即进入聊天.';} if ($kehuopenid=='隐身') { $zhuangtai='当前隐身,客户可主动指定聊天.';} } $tongzhi='排队人数:'. $paiduinumber.'\n'.'留言条数:\n'. $liuyannumber.' \n'.$zhuangtai; $data1='{ "touser":"'.$fromuserid.'", "msgtype":"text", "text": { "content":"[客服上线工作提醒]\n '.$tongzhi.' " } }'; $aaa = http_post_data($url, $data1); //减少骚扰 不通知 exit; } //在线客服代码 //继续上一次的对话 $Kefuopenid=array_search($fromuserid,$kefuarr,true); if($Kefuopenid<>''){ sendmsg($fromuserid,'text','客服还在,直接回复继续上次的对话','',$url);//给用户发消息. exit; }else {// 踢出超时的 . chaoshile($uniacid,300,$website,$url,$fromuserid,$arr['结束语']); } if($xcx){ if ($sessionFrom<>'|'){ $nickname=explode("|",$sessionFrom,-1)[0] ; if ($nickname=="wxapp"){$nickname="";} } logger('findname:'. $nickname); $tablename=trim($arr['tablename']);//管理员id if ($tablename<>''){ $culname=$arr['culname']; $findname=$arr['findname']; $nickname= Finduser($uniacid,$tablename,$culname,$fromUsername,$findname,$website); if(!$nickname) { $nickname =''; } } $userinfo = getuser($uniacid,$fromUsername,$nickname,$website); } else{ $user = getwxinfo($Atoken,$fromUsername);//微信公众号代码 $userinfo = getuser($uniacid,$fromUsername,$user['nickname'],$website);//微信公众号代码 } // // 下一次增加在线客服提示 这里不提示先 .等下一版本. if ($arr['Gappid']<>''){ //网页授权 // if((substr($userinfo['nickname'],0,6)=='会员')){ $sqstr1=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid']; $sqstr="\n点链接快速接通客服"; // } } //logger('是客户:.'.$fromUsername); // if($event=='unsubscribe'){ $eve='取消关注'; exit; };//公众号专用 //logger($fromuserid.'-'.$arr['默认'].$uniacid.$url); $zxkefu="\n在线客服:回复名字接通\n".zxkefu($uniacid,$kefuarr,$sqstr1); if($userinfo['lastliao']<>null){$zxkefu.="\n上次接待客服是:".$userinfo['lastliao'];} $zxkefu.=$sqstr;//[屏蔽一下 下一版发布.] $json = file_get_contents("json/".$uniacid."_paidui.json"); $paiduiarr = json_decode($json,true); $qianmian=count($paiduiarr); $zxkefu.="\n前面有".$qianmian."人排队"; zhishiku($fromuserid,trim($arr['默认']),$uniacid,$url,$zxkefu,$userinfo) ; $caidan=trim($arr['Gjsonid']);//进入通知: if ($caidan<>''){ $Btoken=getToken($arr['Gappid'],$arr['GAPPSECRET'],$caidan);//修正token时间问题 // logger("通知下发:".$caidan_arr['APPID'].'-状态:'.$caidan_arr['openids']); $url1 = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$Btoken; $data1='{ "touser":"'.$arr['Gopenids'].'", "msgtype":"text", "text": { "content":"[小程序'.$uniacid.'进入提醒]\n '.$userinfo['nickname'].' " } }'; $aaa = http_post_data($url1, $data1); // //通知到公共号 // logger($data1.$aaa); } exit; } ////////////////////////////////////////////////结束动作/////////////////////////////// //print_r($kefuarr); //$arr= array_keys($arr1);//openid //处理客服消息模块开始 if(array_key_exists($fromuserid,$kefuarr)){//客服消息处理 if (substr($keyword,0,10)=='@所有人'){//@所有人 atsuoyouren($uniacid,$website,$keyword,$fromuserid,$url,$toUsername); exit; } //处理@----某人命令 if(substr($keyword,0,1)=='@'){//@某人 $stri=0; $stri= stripos($keyword,':'); if ($stri==0){$stri= stripos($keyword,' ') ;} if ($stri==0){$stri= stripos($keyword,':') ;} $nid=substr($keyword,1,$stri-1); //@12:=>12 if (is_numeric($nid)){ atmouren($keyword,$uniacid,$website,$fromuserid,$url,$kefuname); }else{ $say=trim(substr($keyword,$stri+1));//发送的内容: $kefulist = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefulist.json"),true); $tokefuopenid=array_search($nid,$kefulist,true);//找到客服id if(!empty($tokefuopenid)){ $kefuname = $kefulist[$fromuserid]; sendmsg($tokefuopenid,'text',"[同事消息]\n".$kefuname.':'.$say,'',$url);//给用户发消息. }else{ sendmsg($fromuserid,'text','消息格式错误','',$url);//给用户发消息. } } exit; } if(substr($keyword,0,1)=='*'){//@转接 $kefulist = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefulist.json"),true); $kefu = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefu.json"),true); $tokefuname=substr($keyword,1);//李律师 $tokefuopenid=array_search($tokefuname,$kefulist,true);//找到客服id if(!empty($tokefuopenid)){ $kefuname = $kefulist[$fromuserid];//当前客服名 $kehuopenid = $kefu[$fromuserid];//当前客户openid if(substr($kefu[$tokefuopenid],0,1)=="o"){ sendmsg($fromuserid,'text',$tokefuname.'正忙.','',$url);//给用户发消息. }else{ $kefu[$tokefuopenid]=$kehuopenid; $kefu[$fromuserid]="空闲"; $res=file_put_contents("../qidong_app/json/".$uniacid."_kefu.json", json_encode($kefu)); sendmsg($tokefuopenid,'text',$kefuname.'转接来新客户,请接待.','',$url);//给用户发消息. sendmsg($fromuserid,'text',$tokefuname.'转接'.$kefuname.'成功.','',$url);//给用户发消息. } exit; } } if($keyword=='p'){$keyword='下一个'; } if($keyword=='m'){$keyword='排队'; } if($keyword=='0'){$keyword='清零'; } //客服来的消息处理 $kehuopenid= $kefuarr[$fromuserid];// // echo '找到客户:'.$kehuopenid; //判断是不是有客户 if (substr($kehuopenid,0,1)=='o'){ //有客户 ,直接发消息过去: 判断消息是不是@ if (glymingling($uniacid,$fromuserid,$kehuopenid,$keyword,$arr['结束语'],$kefuarr,$url,$toUsername)){//是管理员命令 // echo '命令!'; }else{ //查找客服信息. $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true); $kefuname = $kefulist[$fromuserid]; // echo '给:'.$kefuarr[$fromuserid].'发内容'.$keyword; $bbb=sendmsg($kehuopenid,$MsgType,$kefuname.':'.$keyword,$postObj,$url);//给用户发消息. $a=Inserthistory($toUsername,$uniacid,$fromuserid,$kefuname,$kehuopenid,$users['nickname'],$keyword,$postObj,json_decode($bbb, true)['errcode'],$website); //增加判断.消息失败提示. if (json_decode($bbb, true)['errcode']<>0){ $data2='{ "touser":"'.$fromUsername.'", "msgtype":"text", "text": { "content":" 客服离开... 消息已存入信箱.'.json_decode($bbb, true)['errcode'].'" } }'; //当没有约定好的回复时,这么回复。 sendmsg($fromUsername,'text','消息失败,客户可能已经离开了.','',$url);//给用户发消息. // savejson('json/'.$toUsername.'_lishi.json', '@'.$paidui['id'].'_'.$content.''.$keyword ); } //sendmsg($openid,$msgtype,$keyword,$postObj,$url) } }else{ //没客户接待时,可能发的命令:下一个. if (glymingling($uniacid,$fromuserid,$kehuopenid,$keyword,$arr['结束语'],$kefuarr,$url,$toUsername,$website)){ //echo '是命令!';zaij }else{ // echo '给:'.$kefuarr[$fromuserid].'发内容'.$keyword; // 空闲时 可以玩玩素材库 . if (!zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){ sendmsg($fromuserid,'text','暂无接待客户,可发送命令下一个接通.','',$url,$toUsername,$website);//给用户发消息. } } //客服状态. kong mang 判断是不是要上班?或者其他命令 比如 下一个 等. } }else{ // echo "not found kefu--";//不是客服 则看谁空闲? 规则 先找老客服 . //反查是否在队列 //先看客户是不是...选了指定的客服. 客服小李 正在咨询的时候 是不能调出的.除非. $Kefuopenid=array_search($fromuserid,$kefuarr,true); if($Kefuopenid<>'') { // echo "这是用户,正在咨询的客服是:"; // 用户发 再见 主动离线 . 更新客服列表 . 告诉客服 告诉客户 if (substr($keyword,0,6)=='再见'){ // sendmsg($fromuserid,'text',$arr['结束语'],'',$url);//说再见. jieshuyu($arr['结束语'],$uniacid,$fromuserid,$website,$url); $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页 $kefulist = json_decode($json,true); $kefuname = $kefulist[$Kefuopenid]; edituser($uniacid,$fromuserid,'',$website,$avartar,$zhuangtai,$kefuname); $json = file_get_contents("json/".$uniacid."_paidui.json"); $paiduinum = count(json_decode($json,true)); sendmsg($Kefuopenid,'text','当前客户已经离开,发下一个接通.当前有'.$paiduinum.'人排队.','',$url);//说再见. $kefuarr[$Kefuopenid]='空闲'; //建立对接 同时通知双方. 发两次消息. unlink('json/'.$uniacid.'_kefu.json'); $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr)); }else{ $users=getuser($uniacid,$fromuserid,$nickname,$website); //记录客户的消息 =@1 $bbb=sendmsg($Kefuopenid,$MsgType,'['.$users['id'].']'.$users['nickname'].':'.$keyword,$postObj,$url); $a=Inserthistory($toUsername,$uniacid,$Kefuopenid,$kfname,$fromuserid,$users['nickname'],$keyword,$postObj,json_decode($bbb, true)['errcode'],$website); //记录时间 --- $json = file_get_contents("json/".$uniacid."_time.json"); $kefutime = json_decode($json,true); $kefutime[$Kefuopenid]=time(); $res=file_put_contents("json/".$uniacid."_time.json", json_encode($kefutime)); //记录时间结束 if (json_decode($bbb, true)['errcode']<>0){ logger('开始通知'); if(!file_exists('json/'.$toUsername.'_lishi.json')){ logger('开始通知1'.$arr['Mobanid']); if($arr['Mobanid']<>''){//判断 如果是xcx 就直接推,如果不是 则用另外的. $template_id=$arr['Mobanid']; logger('开始通知2'.$template_id); if($xcx){$jsonid=$arr['Gjsonid']; $jopenid=$arr['Gopenids']; logger('开始通知21:'.$jopenid); $MBtoken=getToken($arr['Gappid'],$arr['GAPPSECRET'],$arr['Gjsonid']); } else{ $jsonid=$ToUserName; $MBtoken=$Atoken; $jopenid=$Kefuopenid;} logger('MBtoken:'.$MBtoken); if($MBtoken<>''){ $data='{ "first": { "value":"你好,应用编号:'.$uniacid.'有用户咨询,请尽快处理", "color":"#FF8247" }, "keyword1": { "value":"客户信息:'.$nickname.'", "color":"#173177" }, "keyword2": { "value":"用户发送:'.$keyword.'", "color":"#173177" }, "remark": { "value":"应用客服消息内回复:看留言 查看", "color":"#173177" } }'; logger('jopenid:'.$jopenid); $bbb=sendMBmsg($MBtoken,$jopenid,$template_id,'','','',$data); logger($bbb); $tongzhi=json_decode($bbb,true)['errcode']; if ($tongzhi==0){$tongzhi='已通知到管理员,请稍等.';} // logger($tongzhi); } } } sendmsg($fromUsername,'text',$mang,'',$url);//给用户发消息. // savejson('json/'.$toUsername.'_lishi.json', '@'.$users['id'].'_'.$users['nickname'].''.$keyword ); file_put_contents('json/'.$toUsername.'_lishi.json', '@'.$users['id'].'_'.$users['nickname'].''.$keyword .PHP_EOL, FILE_APPEND); } } }else{//不是客服 那就是用户 if ( strpos($arr['kefustr'],$keyword)>0){//客户发张三 $kongkefu=''; $zhiding=1; }else{ $kongkefu=array_search('空闲',$kefuarr,true); } if($kongkefu<>''){ if(zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){ exit; } //echo '当前有空的客服:'; //echo $kongkefu; $kefuarr[$kongkefu]=$fromuserid; //建立对接 同时通知双方. 发两次消息. unlink('json/'.$uniacid.'_kefu.json'); $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr)); //增加获取用户信息功能. 没排队 直接进入 需要查客户信息. $users=getuser($uniacid,$fromuserid,$nickname,$website); sendmsg($kongkefu,'text',$users['id'].$users['nickname'].':'.$keyword,'',$url);//通知客服 $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true); $kefuname = $kefulist[$kongkefu]; sendmsg($fromuserid,'text',$kefuname.':'.$kaishi,'',$url);//通知客服 $tongzhiadmin=$kefuname.' 接入了新客户.['.$users['id'].']'.$users['nickname']; }else { //echo '当前客服都忙:/或者客户指定了客服.'; //检查关键词回复 如果有则回复关键词 if($MsgType=='text'){ if (!zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){ //当客服发送 指定客服的指令时 .如发 客服1 if ($zhiding==1){//客户主动选择客服. $zd=zhaokefumingling($fromuserid,$uniacid,$keyword,$url,$kefuarr,$website); if($zd){ $tongzhiadmin=$keyword.' 被客户点名. ';} }else{ $paidui=paidui($uniacid,$fromuserid,$website);//排队语自己组织. $daohang=daohang($uniacid); $daohang="\n先看看下面能不能帮到你,可直接回复数字\n".$daohang; if ($arr["其他"]=='人工+机器人'){ $daohang="\n智能客服:".jiqiren($keyword,$fromuserid); } sendmsg($fromuserid,'text',$paiduile.$daohang,'',$url);//下发排队情况给用户. if($paidui<>'排队中,请耐心等待.'){ $tongzhiadmin='有用户来:'.$keyword." \n排队:".$paidui; }else{ chaoshile($uniacid,300,$website,$url,$fromuserid,$arr['结束语']); } } } }else{//用户发送其他信息怎么办? 通知他排队. $paidui=paidui($uniacid,$fromuserid,$website);//排队语自己组织. sendmsg($fromuserid,'text',$paidui,'',$url);//下发排队情况给用户. sendmsg($myopenid,$MsgType,'其他类型文件',$postObj,$url);//其他文件 直接通知管理员.. } // 是否在排队? 用数组键值查询, 没有.插入排队表 .有 返回排队顺序? } } //下发给总管理员通知; if ($tongzhiadmin<>''){ $data1='{ "touser":"'.$myopenid.'", "msgtype":"text", "text": { "content":"[管理员提醒:]\n'.$tongzhiadmin.'" } }'; $aaa = http_post_data($url, $data1); //减少骚扰 不通知 } } //处理客服消息模块结束. }else{/////////////////////////////////////////////////////////////// echo ""; exit; } } } function zhishiku($fromuserid,$keyword,$uniacid,$url,$addstr,$userinfo){ //知识库处理模块 //echo '
知识库模块
'.$keyword.$uniacid; $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表 $keys = json_decode($json,true); $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表 $numkeys = json_decode($json,true); if(is_numeric($keyword)){ $send=$keys[$numkeys[$keyword]]; }else { $send=$keys[$keyword]; //$keys['关于我们']; } if ( $send<>'' ) { //判断是否是知识库设置字段 if ($send['link']['title']!=''){ $send['link']['title']=str_replace('id',$userinfo['id'],$send['link']['title']); $send['link']['title']=str_replace('[name]', trim($userinfo['nickname']),$send['link']['title']); } if ($send['miniprogrampage']['title']!=''){ $send['miniprogrampage']['title']=str_replace('id',$userinfo['id'],$send['miniprogrampage']['title']); $send['miniprogrampage']['title']=str_replace('[name]', trim($userinfo['nickname']),$send['miniprogrampage']['title']); } if ($send['news']['articles'][0]['title']!=''){ // $send['news']['articles'][0]['title']=str_replace('id',$userinfo['id'],$send['news']['articles'][0]['title']); $str=json_encode($send['news']['articles']); $str=str_replace('[name]', trim($userinfo['nickname']),$str); $send['news']['articles']=json_decode($str,true); } if ($send['text']['content']!=''){ $send['text']['content']=str_replace('[id]',$userinfo['id'],$send['text']['content']); $send['text']['content']=str_replace('[name]',trim($userinfo['nickname']),$send['text']['content']); $send['text']['content']=changeurl($send['text']['content']); $send['text']['content'].=$addstr; } $send['touser']=$fromuserid; $data=json_encode($send,JSON_UNESCAPED_UNICODE); $aaa = http_post_data($url, $data); $zt=json_decode($aaa, true)['errcode']; if ($zt!=0){//下发未成功 $data='{ "touser":"'.$fromuserid.'", "msgtype":"text", "text": { "content":" 系统忙 错误代码: ' . $zt . ' " } }'; $aaa = http_post_data($url, $data); } return true; }else{ return false;//不是知识. } } function sendmsg($openid,$msgtype,$keyword,$postObj,$url){ //消息处理模块. if($openid=='obW0e0QwzK2KTM3ueYbXS96GyomA'){ $kf=' ,"customservice": { "kf_account": "kf2002@gh_4caa0ef9c5e1" }';} switch ($msgtype) { case 'text': $data1='{ "touser":"'.$openid.'", "msgtype":"text", "text": { "content":" '.$keyword.' " } '.$kf.' }'; break; case 'image': $MediaId = $postObj->MediaId; $data1=' { "touser":"'.$openid.'", "msgtype":"image", "image": { "media_id":"'.$MediaId.'" }}'; break; case 'voice': $MediaId = $postObj->MediaId; $Recognition = $postObj->Recognition; $data1=' { "touser":"'.$openid.'", "msgtype":"voice", "voice": { "media_id":"'.$MediaId.'" }}'; break; case 'miniprogrampage': $data1=''; break; case 'link': $baogao=' { "title": " '.$postObj->Title.'", "description": "'.$postObj->Description.'", "url": "'.$postObj->Url.'", "thumb_url": "http://'.$_SERVER['HTTP_HOST'].'/addons/qidong_app/icon.jpg" }'; $data1='{ "touser":"'.$openid.'", "msgtype":"link", "link": '.$baogao.' }'; break; default: $data1=''; } $aaa = http_post_data($url, $data1); //echo '发送消息:'.$data1.$aaa; logger('@@@@@@@@'.$data1.$aaa); return $aaa; } function http_post_data($url, $data_string) { set_time_limit ( 0 ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。 curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); $data = curl_exec($curl); curl_close($curl); return $data; } function zhaokefumingling($fromuserid,$uniacid,$keyword,$url,$kefuarr,$website){ $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true); //$kefuname=substr($keyword,7); $Kefuopenid=array_search($keyword,$kefulist,true);//找到客服id if (substr($kefuarr[$Kefuopenid],0,1)=='o')//看客服状态 客服状态over { sendmsg($fromuserid,'text','客服忙,请稍后.','',$url);//下发排队情况给用户. return false; }else{//客服接入// if($Kefuopenid==''){ sendmsg($fromuserid,'text','客服休息了.请稍后再试.','',$url);//下发排队情况给用户. return false; }else{//客服在,对接开始. 如果是排队发的 则删除排队.如果是没排队发的.则不排队. $kefuarr[$Kefuopenid]=$fromuserid; //建立对接 同时通知双方. 发两次消息. unlink('json/'.$uniacid.'_kefu.json'); $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr)); //增加获取用户信息功能. 没排队 直接进入 需要查客户信息. $json = file_get_contents("json/".$uniacid."_paidui.json"); $paiduiarr = json_decode($json,true); if(array_key_exists($fromuserid,$paiduiarr)){//如果在排队则.. $uid=$paiduiarr[$fromuserid]['id']; $nickname=$paiduiarr[$fromuserid]['nickname']; unset($paiduiarr[$fromuserid]);//删除它 $res=file_put_contents("json/".$uniacid."_paidui.json", json_encode($paiduiarr)); }else{//没排队 .就是上来就发的. 新用户就注册 老用户就获取. $users=getuser($uniacid,$fromuserid,$nickname,$website); $uid=$users['id']; $nickname=$users['nickname']; } sendmsg($Kefuopenid,'text','['.$uid.']'.$nickname.':'.$keyword.' 你好','',$url);//通知客服 // $kefuname = $kefulist[$Kefuopenid]; sendmsg($fromuserid,'text',$keyword.':你好,有什么可以帮到你的?','',$url);//通知客服 return true; } } } function atsuoyouren($uniacid,$website,$keyword,$myopenid,$url,$toUsername){ //@所有人 $huncun= json_decode(alluser($uniacid,$website),true); $gjz=substr($keyword,10,strlen(trim($keyword))-10); if (substr ($keyword, -1)=='#'){ $gjz=str_replace('#','|',$gjz); } $baogao=' { "title": "代发列表已经准备好!点此群发", "description": "本次准备发送: '.$huncun['count'].' 请1分钟内点击,过期失效.", "url": "'.$website.'addons/qidong_app/qunfa.php?uniacid='.$uniacid.'&keyword='.$gjz.'&tousername='.$toUsername.'&t='.time().'", "thumb_url": "'.$website.'/addons/qidong_app/icon.jpg" }'; $data1='{ "touser":"'.$myopenid.'", "msgtype":"link", "link": '.$baogao.' }'; $aaa = http_post_data($url, $data1); // } function zxkefu($uniacid,$kefuarr,$sqstr1){//读取在线客服列表//下次升级点击接通?? $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页 $kefulist = json_decode($json,true); $kefuopenid= array_keys($kefulist);//kfuopenid $kefuall=''; $i=0; foreach ($kefuopenid as $kefuopenid){ //群发-- //$kfopenid=$arr; if(substr($kefuarr[$kefuopenid],0,1)=="o"){ $zt='忙碌'; }else{ $zt=$kefuarr[$kefuopenid]; } if ($zt<>'隐身'){ $i++; //$sqstr=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid']."&kfname=".$kfname; //$sqstr="\n点此快速接通客服"; //$sqstr1=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid']."&kfname=".$kfname; if(($sqstr1=='') or ($zt=='忙碌')){ $kefuall=$kefuall." ".$kefulist[$kefuopenid]."[".$zt."]"; }else{ $sqstr="\n".$kefulist[$kefuopenid].""; $kefuall=$kefuall." ".$sqstr."[".$zt."]"; } if(($i % 2)==0){ $kefuall.="\n";} // $kefuall=$kefuall.' '.$kefulist[$kefuopenid].'['.$zt.']'; } } //logger($kefuall); return $kefuall; } function atmouren($keyword,$uniacid,$website,$fromuserid,$url,$kefuname){ $stri=0; $stri= stripos($keyword,':'); if ($stri==0){$stri= stripos($keyword,' ') ;} if ($stri==0){$stri= stripos($keyword,':') ;} $nid=substr($keyword,1,$stri-1); //@12:=>12 $say=trim(substr($keyword,$stri+1));//发送的内容: if($say==''){$say=$kefuname.'@你 ,客服上线了,邀请你进入会话.';} //判断say最后字符是# 则是关键词消息 991# $liuuser= hiuser($uniacid,$nid,$website); $result = substr ($say, -1); //当是# 关键字图文时 . if ($result=='#'){ $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表 $keys = json_decode($json,true); $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表 $numkeys = json_decode($json,true); $gjz=substr($say,0,strlen($say)-1); if(is_numeric($gjz)){ $send=$keys[$numkeys[$gjz]]; } else { $send=$keys[$gjz]; //$keys['关于我们']; } $send['touser']=$liuuser['openid']; $nickname=$liuuser['nickname']; if($nickname==''){$nickname='会员'.$liuuser['id'];} $send['link']['title']=str_replace('[id]',$liuuser['id'],$send['link']['title']); $send['link']['title']=str_replace('[name]', trim($nickname),$send['link']['title']); $data=json_encode($send,JSON_UNESCAPED_UNICODE); $bbb = http_post_data($url, $data); logger('单发:'.$gjz.'-'.$data); }else{ sendmsg($liuuser['openid'],'text','['.$kefuname.'@你]:'.$say,'',$url); } if (json_decode($bbb, true)['errcode']==0) { $zt='送达'; //对方正在输入...哈哈 $data8='{ "touser":"'.trim($liuuser['openid']).'", "command":"Typing"}'; $url8='https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token='.$Atoken; $bbb = http_post_data($url8, $data8); //logger($bbb); //结束输入判断. }else{ $zt='失败,可能已经离线'.json_decode($bbb, true)['errcode']; }; sendmsg($fromuserid,'text','[@'.$nid.'报告]:'.$zt,'',$url); //发送消息 } function glymingling($uniacid,$openid,$kehuopenid,$keyword,$jsy,$kefuarr,$url,$toUsername,$website){ //处理管理员命令 @某人命令? //echo '检查命令!';$ if (strpos(',清零,下一个,隐身,看留言,上班,排队,@所有人,',$keyword)>0){ //此处增加管理员命令列表处理. if($keyword=='看留言'){ $json = file_get_contents('json/'.$toUsername.'_lishi.json'); sendmsg($openid,'text','本次获取的内容,已清空留言板:\n'.$json,'',$url); unlink('json/'.$toUsername.'_lishi.json'); } if($keyword=='排队'){ $json = file_get_contents("json/".$uniacid."_paidui.json"); $karr = json_decode($json,true); $pdrs=count($karr); sendmsg($openid,'text','排队人数:'.$pdrs,'',$url);//发排队人数.后面再做详情.?? } if($keyword=='隐身'){ $kefuarr[$openid]='隐身'; $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr)); sendmsg($openid,'text','设置隐身成功. 可被点名进入聊天.不能自动进入聊天.','',$url); } if($keyword=='清零'){ unlink('json/'.$toUsername.'_paidui.json'); unlink('json/'.$toUsername.'_token.json'); unlink('log.xml'); if (!file_exists('json/'.$toUsername.'_paidui.json')){ $t="清零成功!"; }else{ $t="清零失败,请检查目录权限是否设置为777!"; } sendmsg($openid,'text',$t,'',$url); } if($keyword=='上班'){ $kefuarr[$openid]='空闲'; $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr)); sendmsg($openid,'text','设置上班成功. 可自动接入来访客户.','',$url); } if($keyword=='下一个'){ //跟现在的说再见 ?再见语? $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页 $kefulist = json_decode($json,true); $kefuname = $kefulist[$openid]; if (substr($kehuopenid,0,1)=='o'){ //回复图文消息. jieshuyu($jsy,$uniacid,$kehuopenid,$website,$url); edituser($uniacid,$kehuopenid,'',$website,$avartar,$zhuangtai,$kefuname); } //找到下一个客户? $json = file_get_contents("json/".$uniacid."_paidui.json"); $paiduiarr = json_decode($json,true); $nextkh=array_shift($paiduiarr);//取出并从排队中删除第一个. if (substr($nextkh['openid'],0,1)=='o'){ sendmsg($nextkh['openid'],'text',$kefuname.':你好,久等了.','',$url);//新用户你好. $userjson=json_encode($paiduiarr); $res=file_put_contents("json/".$uniacid."_paidui.json",$userjson);//更新排队数据. $kefuarr[$openid]=$nextkh['openid'];//保存新的用户进来.; sendmsg($openid,'text','['.$nextkh['id'].']'.$nextkh['nickname'].'已经进入聊天.','',$url);// $res=file_put_contents("json/".$uniacid."_kefu.json",json_encode($kefuarr));//更新客服数据. //$kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true); //$kefuname = $kefulist[$fromuserid]; //sendmsg($nextkh['openid'],'text',$kefuname.':你好久等了.','',$url);// }else{//已无排队用户.修正客服表 保存.告诉客服. $kefuarr[$openid]='空闲'; $res=file_put_contents("json/".$uniacid."_kefu.json",json_encode($kefuarr));//更新客服数据. sendmsg($openid,'text','已无排队用户.你的状态目前是空闲.\n常用命令: 上班 隐身 排队.','',$url);//新用户你好. } } return true; }else { return false; } } function paidui($uniacid,$openid,$website){ $json = file_get_contents("json/".$uniacid."_paidui.json"); $kefuarr = json_decode($json,true); if(array_key_exists($openid,$kefuarr)){ return '排队中,请耐心等待.';//排队中... }else{ $user=getuser($uniacid,$openid,$nickname,$website);//获取用户信息 $userinfo=array('id'=>$user['id'], 'nickname'=>$user['nickname'], 'beizhu'=>$user['beizhu'], 'openid'=>$openid); $kefuarr[$openid]=$userinfo; $userjson=json_encode($kefuarr); $res=file_put_contents("json/".$uniacid."_paidui.json",$userjson); $qianmian=count($kefuarr)-1; return '已接入客服中心,前面有'.$qianmian.'人';//排队数量 } } function getuser($ucid,$openid,$nickname,$website) { ///先判断缓存文件是否存在 $json = file_get_contents("json/".$ucid."_user.json"); $userinfos = json_decode($json,true); // $userid=$userinfos[$openid]['id']; // echo '找到缓存表:'.$userid; if (!array_key_exists($openid,$userinfos)){ $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=getuser&m=qidong_app&openid=".$openid."&nickname=".$nickname; // echo $token_access_url; $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP $nickname= $result['data']['wxapp'][0]['nickname']; $beizhu= $result['data']['wxapp'][0]['zhuangtai']; $lastliao= $result['data']['wxapp'][0]['lastliao']; if (trim($nickname)==null) { $nickname='会员'.$result['data']['wxapp'][0]['id']; $isid=1; } $userid=$result['data']['wxapp'][0]['id']; $data = array( 'nickname' => $nickname, 'id' => $userid, 'beizhu' => $beizhu, 'lastliao'=> $lastliao ); return $data ; }else { // echo '找到缓存 直接返回;'; return $userinfos[$openid]; } //缓存 先去判断文件是否存在 . } //去查询 用户表 或者 客服表 找到详细信息. // 输出 : 身份[客服 或 用户 ] 状态 [ 咨询中 | 排队中 ] //规则 聊天中 不能使用1 2 3 不去查询 . 都发给管理员 . function changeurl($a){ $bi= strpos($a,'[['); if ($bi==0){ return $a; }else{ $ei= strpos($a,']]'); $qb=substr($a,0,$bi); $eb=substr($a,$ei+2); $b=substr($a,$bi+2,$ei-$bi-2); $ci=strpos($b,'|'); $add=substr($b,0,$ci); $herf=substr($b,$ci+1,strlen($b)-$ci); } return $qb."".$add."".$eb; } function getToken($appid,$appsecret,$jsonid){ $file = file_get_contents("json/{$jsonid}_token.json",true); $result = json_decode($file,true); if (time() > $result['expires']){ $data = array(); $data['access_token'] = getNewToken($appid,$appsecret); $data['expires']=time()+7200; $jsonStr = json_encode($data); $fp = fopen("json/{$jsonid}_token.json", "w"); fwrite($fp, $jsonStr); fclose($fp); return $data['access_token']; }else{ return $result['access_token']; } } function getNewToken($appid,$appsecret){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $access_token_Arr = https_request($url); return $access_token_Arr['access_token']; } function https_request ($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $out = curl_exec($ch); curl_close($ch); return json_decode($out,true); } function logger($log_content) { if(isset($_SERVER['HTTP_APPNAME'])){ //SAE sae_set_display_errors(false); sae_debug($log_content); sae_set_display_errors(true); }else{ //LOCAL $max_size = 500000; $log_filename = "log1.xml"; if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);} file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND); } } function getwxinfo($token,$openid){ $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$token}&openid={$openid}&lang=zh_CN"; // logger($url); $access_token_Arr = https_request($url); return $access_token_Arr; } function hiuser($ucid,$id,$website){ $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=getopenid&m=qidong_app&id=".$id; $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP $data=$result['data'][0] ; return $data ; } function alluser($ucid,$website){ $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=Getallopenid&m=qidong_app"; $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP $data=$result['data'] ; return json_encode($data) ; } function edituser($ucid,$openid,$nickname,$website,$avartar,$zhuangtai,$lastliao) //改名取号 { $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=edituser&m=qidong_app&openid=".$openid."&nickname=".$nickname."&avartar=".$avartar."&lastliao=".$lastliao; //zhuangtai // echo $token_access_url; // exit; $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP $data=$result['data']; if ($data==1){$data='改名成功!';} else{$data='改名失败!';} return $data ; } function chaoshile($uniacid,$chaoshi,$website,$url,$fromuserid,$jsy){ //超时自动退出 读取时间表 读取客服表 判断时间 超过的 ->设置成空闲 .给用户发消息超时退出. $json = file_get_contents('json/'.$uniacid.'_time.json');//读取key列表 $kefutime = json_decode($json,true); $json = file_get_contents('json/'.$uniacid.'_kefu.json');//读取数字key列表 $kefustr = json_decode($json,true); $arr = array_keys($kefutime);//openid $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true); foreach ($arr as $arr){ $kftime=$kefutime[$arr]+$chaoshi; if (substr($kefustr[$arr],0,1)=="o"){ if ($kftime9){break;}; } return $daohang; } function jieshuyu($bye,$uniacid,$openid,$website,$url){ if(is_numeric($bye)){ $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表 $keys = json_decode($json,true); $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表 $numkeys = json_decode($json,true); $delid=getuser($uniacid,$openid,'',$website); $send=$keys[$numkeys[$bye]]; if ($send['link']['title']!=''){ $send['link']['title']=str_replace('id',$delid['id'],$send['link']['title']); $send['link']['title']=str_replace('[name]', trim($delid['nickname']),$send['link']['title']); } if ($send['miniprogrampage']['title']!=''){ $send['miniprogrampage']['title']=str_replace('id',$delid['id'],$send['miniprogrampage']['title']); $send['miniprogrampage']['title']=str_replace('[name]', trim($delid['nickname']),$send['miniprogrampage']['title']); } if ($send['text']['content']!=''){ $send['text']['content']=str_replace('[id]',$delid['id'],$send['text']['content']); $send['text']['content']=str_replace('[name]',trim($delid['nickname']),$send['text']['content']); // logger('要替换的文本:'.$send['text']['content']); $send['text']['content']=changeurl($send['text']['content']); } $send['touser']=trim($openid); $data0=json_encode($send,JSON_UNESCAPED_UNICODE); } else { $sends=$bye; //$keys['关于我们']; $jieshuyu= str_replace('[name]',$delid['nickname'],$sends); $jieshuyu=str_replace("{br}","\n",$jieshuyu); $jieshuyu=changeurl($jieshuyu); $data0='{ "touser":"'.trim($openid).'", "msgtype":"text", "text": { "content":" '.$jieshuyu.' " } }'; } $aaa = http_post_data($url, $data0); logger($data0); } function Finduser($ucid,$tablename,$culname,$openid,$findname,$website){ //&tablename=dc_user&culname=openid&findname=name&openid=ogMce0dAqzqm3LSCIBzoHb4XYgFU $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=finduser&m=qidong_app&tablename={$tablename}&culname={$culname}&findname={$findname}&openid={$openid}"; // logger( $token_access_url); $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 logger('--------------'.$res); $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP $data=$result['data']['nickname'] ; return $data ; } function Inserthistory($toUsername,$uniacid,$kfopenid,$kfname,$khopenid,$khname,$keyword,$postObj,$zhuangtai,$website){ //&tablename=dc_user&culname=openid&findname=name&openid=ogMce0dAqzqm3LSCIBzoHb4XYgFU $type=$postObj->MsgType; if ($type=='image'){ $keyword=$postObj->PicUrl; } if ($type=='voice'){ $keyword=$postObj->Recognition; } $token_access_url = "{$website}/app/index.php?i=".$uniacid."&c=entry&a=wxapp&do=Inserthistory&m=qidong_app&uniacid={$uniacid}&type={$type}&toUsername={$toUsername}&kfopenid={$kfopenid}&kfname={$kfname}&khopenid={$khopenid}&khname={$khname}&keyword={$keyword}&zhuangtai={$zhuangtai}"; // logger( $token_access_url); $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容 //return $data ; } function sendMBmsg($Atoken,$openid,$template_id,$url,$appid,$pagepath,$data){ //消息处理模块. // $info = json_decode(file_get_contents("json/info_".$jsonid.".json"),true);//读取设置文件. //$Atoken=$info['access_token']; $data1=' { "touser":"'.$openid.'", "template_id":"'.$template_id.'", "url":"'.$url.'", "miniprogram":{ "appid":"'.$appid.'", "pagepath":"'.$pagepath.'" }, "data": '.$data.' }'; // echo $data1."
"; $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=$Atoken"; // echo $url."
"; $aaa = http_post_data($url, $data1); // print_r($aaa); return $aaa; } function getReqSign($params /* 关联数组 */, $appkey /* 字符串*/) { // 1. 字典升序排序 ksort($params); // 2. 拼按URL键值对 $str = ''; foreach ($params as $key => $value) { if ($value !== '') { $str .= $key . '=' . urlencode($value) . '&'; } } // 3. 拼接app_key $str .= 'app_key=' . $appkey; // 4. MD5运算+转换大写,得到请求签名 $sign = strtoupper(md5($str)); return $sign; } // doHttpPost :执行POST请求,并取回响应结果 // 参数说明 // - $url :接口请求地址 // - $params:完整接口请求参数(特别注意:不同的接口,参数对一般不一样,请以具体接口要求为准) // 返回数据 // - 返回false表示失败,否则表示API成功返回的HTTP BODY部分 function doHttpPost($url, $params) { $curl = curl_init(); $response = false; do { // 1. 设置HTTP URL (API地址) curl_setopt($curl, CURLOPT_URL, $url); // 2. 设置HTTP HEADER (表单POST) $head = array( 'Content-Type: application/x-www-form-urlencoded' ); curl_setopt($curl, CURLOPT_HTTPHEADER, $head); // 3. 设置HTTP BODY (URL键值对) $body = http_build_query($params); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $body); // 4. 调用API,获取响应结果 curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_NOBODY, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); if ($response === false) { $response = false; break; } $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($code != 200) { $response = false; break; } } while (0); curl_close($curl); return $response; } // 设置请求数据(应用密钥、接口请求参数) function jiqiren($keyword,$session){ $appkey = 'l2FBbW8zsJvp3kQa'; $params = array( 'app_id' => '1106992438', 'time_stamp' => time(), 'nonce_str' => '20e340'.rand(1000,9999), 'session' => $session, 'question' => $keyword, 'sign' => '' ); $params['sign'] = getReqSign($params, $appkey); // 执行API调用 $url = 'https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat'; $response = doHttpPost($url, $params); return json_decode($response,true)['data']['answer']; } ?>