kefu_c.php 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340
  1. <?php
  2. //echo checkSignature;
  3. /* 本代码已经申请著作权保护
  4. 盗版必究
  5. 法律顾问:北京东环律所事务所
  6. //这是多客服---小程序接口 .
  7. CopyRight 2017 www.17cheng.cn All Rights Reserved
  8. */
  9. header('Content-type:text/json');
  10. $stime=microtime(true);
  11. ini_set("display_errors", "off");
  12. define("TOKEN", "xcxkefu");
  13. $wechatObj = new wechatCallbackapiTest();
  14. if (isset($_GET['echostr'])) { //判断是不是首次验证
  15. $wechatObj->valid();
  16. }else{
  17. $wechatObj->responseMsg();
  18. }
  19. class wechatCallbackapiTest
  20. {
  21. public function valid()
  22. {
  23. $echoStr = $_GET["echostr"];
  24. if($this->checkSignature()){
  25. echo $echoStr;
  26. exit;
  27. }
  28. }
  29. private function checkSignature()
  30. {
  31. $signature = $_GET["signature"];
  32. $timestamp = $_GET["timestamp"];
  33. $nonce = $_GET["nonce"];
  34. $token = TOKEN;
  35. $tmpArr = array($token, $timestamp, $nonce);
  36. sort($tmpArr);
  37. $tmpStr = implode( $tmpArr );
  38. $tmpStr = sha1( $tmpStr );
  39. if( $tmpStr == $signature ){
  40. return true;
  41. }else{
  42. return false;
  43. }
  44. }
  45. public function responseMsg()
  46. {
  47. // $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取数据
  48. $postStr = file_get_contents("php://input");
  49. // logger(time().$postStr);
  50. $xcx=false;//true 是小程序
  51. if (!empty($postStr)){
  52. //$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  53. if($xcx){
  54. $postObj =json_decode($postStr);}
  55. else{
  56. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  57. }
  58. $fromUsername = trim($postObj->FromUserName); //openid
  59. $toUsername = trim($postObj->ToUserName);
  60. $tousernamebak = $toUsername;
  61. $keyword = trim($postObj->Content);
  62. $sessionFrom = trim($postObj->SessionFrom);
  63. $sessionFrom.='|';
  64. $MsgType = $postObj->MsgType;//消息类型 text event
  65. $Event = $postObj->Event;
  66. if ($Event == "CLICK") {
  67. $EventKey = $postObj->EventKey;
  68. $MsgType='text';
  69. $keyword=trim($EventKey);//修复公众号问题.
  70. logger('event:'.$Event.$MsgType.'key:'.$keyword);
  71. }
  72. $json = file_get_contents('json/'.$toUsername.'.json');
  73. $arr = json_decode($json,true);
  74. $uniacid = $arr['uniacid'];
  75. $mang= $arr['mang'];
  76. if(empty($mang)){$mang='客服忙,已存入留言板';}
  77. $paiduile= $arr['paidui'];
  78. if(empty($paiduile)){$paiduile='排队中,请稍候.';}
  79. $kaishi= $arr['kaishi'];
  80. if(empty($kaishi)){$kaishi='你好,有什么可以帮到你的?';}
  81. //echo $uniacid;
  82. $website = $arr['website'];
  83. define("APPID", $arr['APPID']);
  84. define("APPSECRET", $arr['APPSECRET']);
  85. $fromuserid = $fromUsername;//
  86. $myopenid = trim($arr['openids']);//管理员id
  87. $Atoken = getToken(APPID,APPSECRET,$toUsername);
  88. $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$Atoken;
  89. if ($keyword=='openid'){
  90. sendmsg($fromuserid,$MsgType,$fromuserid,'',$url);//给用户发消息.
  91. exit;
  92. }
  93. //echo $Atoken ;
  94. $json = file_get_contents("json/".$uniacid."_kefu.json");
  95. $kefuarr = json_decode($json,true); //客服列表
  96. ////////////////////////////////////////////////////////动作提示//////////////////////////////
  97. if ($MsgType == "event") {
  98. $event = $postObj->Event;
  99. if($event=='VIEW'){exit;}
  100. if($event=='LOCATION'){exit;}
  101. if(array_key_exists($fromuserid,$kefuarr)){
  102. logger($MsgType.'是客服.');
  103. $paiduinumber=count(file('json/'.$uniacid.'_paidui.json'));
  104. $liuyannumber=count(file('json/'.$toUsername.'_lishi.json'));
  105. $kehuopenid= $kefuarr[$fromuserid];
  106. if (substr($kehuopenid,0,1)=='o'){
  107. $users=getuser($uniacid,$kehuopenid,$nickname,$website);
  108. $zhuangtai='当前聊天:['.$users['id'].']'.$users['nickname'];
  109. }else{
  110. $zhuangtai='休息中';
  111. if ($kehuopenid=='空闲') { $zhuangtai='当前空闲,有客户会立即进入聊天.';}
  112. if ($kehuopenid=='隐身') { $zhuangtai='当前隐身,客户可主动指定聊天.';}
  113. }
  114. $tongzhi='排队人数:'. $paiduinumber.'\n'.'留言条数:\n'. $liuyannumber.' \n'.$zhuangtai;
  115. $data1='{ "touser":"'.$fromuserid.'", "msgtype":"text",
  116. "text": { "content":"[客服上线工作提醒]\n '.$tongzhi.' " } }';
  117. $aaa = http_post_data($url, $data1); //减少骚扰 不通知
  118. exit;
  119. }
  120. //在线客服代码
  121. //继续上一次的对话
  122. $Kefuopenid=array_search($fromuserid,$kefuarr,true);
  123. if($Kefuopenid<>''){
  124. sendmsg($fromuserid,'text','客服还在,直接回复继续上次的对话','',$url);//给用户发消息.
  125. exit;
  126. }else
  127. {// 踢出超时的 .
  128. chaoshile($uniacid,300,$website,$url,$fromuserid,$arr['结束语']);
  129. }
  130. if($xcx){
  131. if ($sessionFrom<>'|'){
  132. $nickname=explode("|",$sessionFrom,-1)[0] ;
  133. if ($nickname=="wxapp"){$nickname="";}
  134. }
  135. logger('findname:'. $nickname);
  136. $tablename=trim($arr['tablename']);//管理员id
  137. if ($tablename<>''){
  138. $culname=$arr['culname'];
  139. $findname=$arr['findname'];
  140. $nickname= Finduser($uniacid,$tablename,$culname,$fromUsername,$findname,$website);
  141. if(!$nickname)
  142. {
  143. $nickname ='';
  144. }
  145. }
  146. $userinfo = getuser($uniacid,$fromUsername,$nickname,$website);
  147. } else{
  148. $user = getwxinfo($Atoken,$fromUsername);//微信公众号代码
  149. $userinfo = getuser($uniacid,$fromUsername,$user['nickname'],$website);//微信公众号代码
  150. }
  151. //
  152. // 下一次增加在线客服提示 这里不提示先 .等下一版本.
  153. if ($arr['Gappid']<>''){ //网页授权
  154. // if((substr($userinfo['nickname'],0,6)=='会员')){
  155. $sqstr1=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid'];
  156. $sqstr="\n<a href='".$sqstr1."'>点链接快速接通客服</a>";
  157. // }
  158. }
  159. //logger('是客户:.'.$fromUsername);
  160. // if($event=='unsubscribe'){ $eve='取消关注'; exit; };//公众号专用
  161. //logger($fromuserid.'-'.$arr['默认'].$uniacid.$url);
  162. $zxkefu="\n在线客服:回复名字接通\n".zxkefu($uniacid,$kefuarr,$sqstr1);
  163. if($userinfo['lastliao']<>null){$zxkefu.="\n上次接待客服是:".$userinfo['lastliao'];}
  164. $zxkefu.=$sqstr;//[屏蔽一下 下一版发布.]
  165. $json = file_get_contents("json/".$uniacid."_paidui.json");
  166. $paiduiarr = json_decode($json,true);
  167. $qianmian=count($paiduiarr);
  168. $zxkefu.="\n前面有".$qianmian."人排队";
  169. zhishiku($fromuserid,trim($arr['默认']),$uniacid,$url,$zxkefu,$userinfo) ;
  170. $caidan=trim($arr['Gjsonid']);//进入通知:
  171. if ($caidan<>''){
  172. $Btoken=getToken($arr['Gappid'],$arr['GAPPSECRET'],$caidan);//修正token时间问题
  173. // logger("通知下发:".$caidan_arr['APPID'].'-状态:'.$caidan_arr['openids']);
  174. $url1 = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$Btoken;
  175. $data1='{ "touser":"'.$arr['Gopenids'].'", "msgtype":"text",
  176. "text": { "content":"[小程序'.$uniacid.'进入提醒]\n '.$userinfo['nickname'].' " } }';
  177. $aaa = http_post_data($url1, $data1); // //通知到公共号
  178. // logger($data1.$aaa);
  179. }
  180. exit;
  181. }
  182. ////////////////////////////////////////////////结束动作///////////////////////////////
  183. //print_r($kefuarr);
  184. //$arr= array_keys($arr1);//openid
  185. //处理客服消息模块开始
  186. if(array_key_exists($fromuserid,$kefuarr)){//客服消息处理
  187. if (substr($keyword,0,10)=='@所有人'){//@所有人
  188. atsuoyouren($uniacid,$website,$keyword,$fromuserid,$url,$toUsername);
  189. exit;
  190. }
  191. //处理@----某人命令
  192. if(substr($keyword,0,1)=='@'){//@某人
  193. $stri=0;
  194. $stri= stripos($keyword,':');
  195. if ($stri==0){$stri= stripos($keyword,' ') ;}
  196. if ($stri==0){$stri= stripos($keyword,':') ;}
  197. $nid=substr($keyword,1,$stri-1); //@12:=>12
  198. if (is_numeric($nid)){
  199. atmouren($keyword,$uniacid,$website,$fromuserid,$url,$kefuname);
  200. }else{
  201. $say=trim(substr($keyword,$stri+1));//发送的内容:
  202. $kefulist = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefulist.json"),true);
  203. $tokefuopenid=array_search($nid,$kefulist,true);//找到客服id
  204. if(!empty($tokefuopenid)){
  205. $kefuname = $kefulist[$fromuserid];
  206. sendmsg($tokefuopenid,'text',"[同事消息]\n".$kefuname.':'.$say,'',$url);//给用户发消息.
  207. }else{
  208. sendmsg($fromuserid,'text','消息格式错误','',$url);//给用户发消息.
  209. }
  210. }
  211. exit;
  212. }
  213. if(substr($keyword,0,1)=='*'){//@转接
  214. $kefulist = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefulist.json"),true);
  215. $kefu = json_decode(file_get_contents("../qidong_app/json/".$uniacid."_kefu.json"),true);
  216. $tokefuname=substr($keyword,1);//李律师
  217. $tokefuopenid=array_search($tokefuname,$kefulist,true);//找到客服id
  218. if(!empty($tokefuopenid)){
  219. $kefuname = $kefulist[$fromuserid];//当前客服名
  220. $kehuopenid = $kefu[$fromuserid];//当前客户openid
  221. if(substr($kefu[$tokefuopenid],0,1)=="o"){
  222. sendmsg($fromuserid,'text',$tokefuname.'正忙.','',$url);//给用户发消息.
  223. }else{
  224. $kefu[$tokefuopenid]=$kehuopenid;
  225. $kefu[$fromuserid]="空闲";
  226. $res=file_put_contents("../qidong_app/json/".$uniacid."_kefu.json", json_encode($kefu));
  227. sendmsg($tokefuopenid,'text',$kefuname.'转接来新客户,请接待.','',$url);//给用户发消息.
  228. sendmsg($fromuserid,'text',$tokefuname.'转接'.$kefuname.'成功.','',$url);//给用户发消息.
  229. }
  230. exit;
  231. }
  232. }
  233. if($keyword=='p'){$keyword='下一个'; }
  234. if($keyword=='m'){$keyword='排队'; }
  235. if($keyword=='0'){$keyword='清零'; }
  236. //客服来的消息处理
  237. $kehuopenid= $kefuarr[$fromuserid];//
  238. // echo '找到客户:'.$kehuopenid;
  239. //判断是不是有客户
  240. if (substr($kehuopenid,0,1)=='o'){
  241. //有客户 ,直接发消息过去: 判断消息是不是@
  242. if (glymingling($uniacid,$fromuserid,$kehuopenid,$keyword,$arr['结束语'],$kefuarr,$url,$toUsername)){//是管理员命令
  243. // echo '命令!';
  244. }else{
  245. //查找客服信息.
  246. $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true);
  247. $kefuname = $kefulist[$fromuserid];
  248. // echo '给:'.$kefuarr[$fromuserid].'发内容'.$keyword;
  249. $bbb=sendmsg($kehuopenid,$MsgType,$kefuname.':'.$keyword,$postObj,$url);//给用户发消息.
  250. $a=Inserthistory($toUsername,$uniacid,$fromuserid,$kefuname,$kehuopenid,$users['nickname'],$keyword,$postObj,json_decode($bbb, true)['errcode'],$website);
  251. //增加判断.消息失败提示.
  252. if (json_decode($bbb, true)['errcode']<>0){
  253. $data2='{ "touser":"'.$fromUsername.'", "msgtype":"text",
  254. "text": { "content":" 客服离开... 消息已存入信箱.'.json_decode($bbb, true)['errcode'].'" } }'; //当没有约定好的回复时,这么回复。
  255. sendmsg($fromUsername,'text','消息失败,客户可能已经离开了.','',$url);//给用户发消息.
  256. // savejson('json/'.$toUsername.'_lishi.json', '@'.$paidui['id'].'_'.$content.''.$keyword );
  257. }
  258. //sendmsg($openid,$msgtype,$keyword,$postObj,$url)
  259. }
  260. }else{
  261. //没客户接待时,可能发的命令:下一个.
  262. if (glymingling($uniacid,$fromuserid,$kehuopenid,$keyword,$arr['结束语'],$kefuarr,$url,$toUsername,$website)){
  263. //echo '是命令!';zaij
  264. }else{
  265. // echo '给:'.$kefuarr[$fromuserid].'发内容'.$keyword;
  266. // 空闲时 可以玩玩素材库 .
  267. if (!zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){
  268. sendmsg($fromuserid,'text','暂无接待客户,可发送命令下一个接通.','',$url,$toUsername,$website);//给用户发消息.
  269. }
  270. }
  271. //客服状态. kong mang 判断是不是要上班?或者其他命令 比如 下一个 等.
  272. }
  273. }else{
  274. // echo "not found kefu--";//不是客服 则看谁空闲? 规则 先找老客服 .
  275. //反查是否在队列
  276. //先看客户是不是...选了指定的客服. 客服小李 正在咨询的时候 是不能调出的.除非.
  277. $Kefuopenid=array_search($fromuserid,$kefuarr,true);
  278. if($Kefuopenid<>'')
  279. {
  280. // echo "这是用户,正在咨询的客服是:";
  281. // 用户发 再见 主动离线 . 更新客服列表 . 告诉客服 告诉客户
  282. if (substr($keyword,0,6)=='再见'){
  283. // sendmsg($fromuserid,'text',$arr['结束语'],'',$url);//说再见.
  284. jieshuyu($arr['结束语'],$uniacid,$fromuserid,$website,$url);
  285. $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页
  286. $kefulist = json_decode($json,true);
  287. $kefuname = $kefulist[$Kefuopenid];
  288. edituser($uniacid,$fromuserid,'',$website,$avartar,$zhuangtai,$kefuname);
  289. $json = file_get_contents("json/".$uniacid."_paidui.json");
  290. $paiduinum = count(json_decode($json,true));
  291. sendmsg($Kefuopenid,'text','当前客户已经离开,发下一个接通.当前有'.$paiduinum.'人排队.','',$url);//说再见.
  292. $kefuarr[$Kefuopenid]='空闲';
  293. //建立对接 同时通知双方. 发两次消息.
  294. unlink('json/'.$uniacid.'_kefu.json');
  295. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr));
  296. }else{
  297. $users=getuser($uniacid,$fromuserid,$nickname,$website);
  298. //记录客户的消息 =@1
  299. $bbb=sendmsg($Kefuopenid,$MsgType,'['.$users['id'].']'.$users['nickname'].':'.$keyword,$postObj,$url);
  300. $a=Inserthistory($toUsername,$uniacid,$Kefuopenid,$kfname,$fromuserid,$users['nickname'],$keyword,$postObj,json_decode($bbb, true)['errcode'],$website);
  301. //记录时间 ---
  302. $json = file_get_contents("json/".$uniacid."_time.json");
  303. $kefutime = json_decode($json,true);
  304. $kefutime[$Kefuopenid]=time();
  305. $res=file_put_contents("json/".$uniacid."_time.json", json_encode($kefutime));
  306. //记录时间结束
  307. if (json_decode($bbb, true)['errcode']<>0){
  308. logger('开始通知');
  309. if(!file_exists('json/'.$toUsername.'_lishi.json')){
  310. logger('开始通知1'.$arr['Mobanid']);
  311. if($arr['Mobanid']<>''){//判断 如果是xcx 就直接推,如果不是 则用另外的.
  312. $template_id=$arr['Mobanid'];
  313. logger('开始通知2'.$template_id);
  314. if($xcx){$jsonid=$arr['Gjsonid'];
  315. $jopenid=$arr['Gopenids'];
  316. logger('开始通知21:'.$jopenid);
  317. $MBtoken=getToken($arr['Gappid'],$arr['GAPPSECRET'],$arr['Gjsonid']);
  318. }
  319. else{
  320. $jsonid=$ToUserName;
  321. $MBtoken=$Atoken;
  322. $jopenid=$Kefuopenid;}
  323. logger('MBtoken:'.$MBtoken);
  324. if($MBtoken<>''){
  325. $data='{
  326. "first": {
  327. "value":"你好,应用编号:'.$uniacid.'有用户咨询,请尽快处理",
  328. "color":"#FF8247"
  329. },
  330. "keyword1": {
  331. "value":"客户信息:'.$nickname.'",
  332. "color":"#173177"
  333. },
  334. "keyword2": {
  335. "value":"用户发送:'.$keyword.'",
  336. "color":"#173177"
  337. },
  338. "remark": {
  339. "value":"应用客服消息内回复:看留言 查看",
  340. "color":"#173177"
  341. }
  342. }'; logger('jopenid:'.$jopenid);
  343. $bbb=sendMBmsg($MBtoken,$jopenid,$template_id,'','','',$data);
  344. logger($bbb);
  345. $tongzhi=json_decode($bbb,true)['errcode'];
  346. if ($tongzhi==0){$tongzhi='已通知到管理员,请稍等.';}
  347. // logger($tongzhi);
  348. }
  349. }
  350. }
  351. sendmsg($fromUsername,'text',$mang,'',$url);//给用户发消息.
  352. // savejson('json/'.$toUsername.'_lishi.json', '@'.$users['id'].'_'.$users['nickname'].''.$keyword );
  353. file_put_contents('json/'.$toUsername.'_lishi.json', '@'.$users['id'].'_'.$users['nickname'].''.$keyword .PHP_EOL, FILE_APPEND);
  354. }
  355. }
  356. }else{//不是客服 那就是用户
  357. if ( strpos($arr['kefustr'],$keyword)>0){//客户发张三
  358. $kongkefu='';
  359. $zhiding=1;
  360. }else{
  361. $kongkefu=array_search('空闲',$kefuarr,true);
  362. }
  363. if($kongkefu<>''){
  364. if(zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){
  365. exit;
  366. }
  367. //echo '当前有空的客服:';
  368. //echo $kongkefu;
  369. $kefuarr[$kongkefu]=$fromuserid;
  370. //建立对接 同时通知双方. 发两次消息.
  371. unlink('json/'.$uniacid.'_kefu.json');
  372. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr));
  373. //增加获取用户信息功能. 没排队 直接进入 需要查客户信息.
  374. $users=getuser($uniacid,$fromuserid,$nickname,$website);
  375. sendmsg($kongkefu,'text',$users['id'].$users['nickname'].':'.$keyword,'',$url);//通知客服
  376. $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true);
  377. $kefuname = $kefulist[$kongkefu];
  378. sendmsg($fromuserid,'text',$kefuname.':'.$kaishi,'',$url);//通知客服
  379. $tongzhiadmin=$kefuname.' 接入了新客户.['.$users['id'].']'.$users['nickname'];
  380. }else
  381. { //echo '当前客服都忙:/或者客户指定了客服.';
  382. //检查关键词回复 如果有则回复关键词
  383. if($MsgType=='text'){
  384. if (!zhishiku($fromuserid,$keyword,$uniacid,$url,'',$userinfo)){
  385. //当客服发送 指定客服的指令时 .如发 客服1
  386. if ($zhiding==1){//客户主动选择客服.
  387. $zd=zhaokefumingling($fromuserid,$uniacid,$keyword,$url,$kefuarr,$website);
  388. if($zd){ $tongzhiadmin=$keyword.' 被客户点名. ';}
  389. }else{
  390. $paidui=paidui($uniacid,$fromuserid,$website);//排队语自己组织.
  391. $daohang=daohang($uniacid);
  392. $daohang="\n先看看下面能不能帮到你,可直接回复数字\n".$daohang;
  393. if ($arr["其他"]=='人工+机器人'){
  394. $daohang="\n智能客服:".jiqiren($keyword,$fromuserid);
  395. }
  396. sendmsg($fromuserid,'text',$paiduile.$daohang,'',$url);//下发排队情况给用户.
  397. if($paidui<>'排队中,请耐心等待.'){
  398. $tongzhiadmin='有用户来:'.$keyword." \n排队:".$paidui;
  399. }else{
  400. chaoshile($uniacid,300,$website,$url,$fromuserid,$arr['结束语']);
  401. }
  402. }
  403. }
  404. }else{//用户发送其他信息怎么办? 通知他排队.
  405. $paidui=paidui($uniacid,$fromuserid,$website);//排队语自己组织.
  406. sendmsg($fromuserid,'text',$paidui,'',$url);//下发排队情况给用户.
  407. sendmsg($myopenid,$MsgType,'其他类型文件',$postObj,$url);//其他文件 直接通知管理员..
  408. }
  409. // 是否在排队? 用数组键值查询, 没有.插入排队表 .有 返回排队顺序?
  410. }
  411. } //下发给总管理员通知;
  412. if ($tongzhiadmin<>''){
  413. $data1='{ "touser":"'.$myopenid.'", "msgtype":"text",
  414. "text": { "content":"[管理员提醒:]\n'.$tongzhiadmin.'" } }';
  415. $aaa = http_post_data($url, $data1); //减少骚扰 不通知
  416. }
  417. }
  418. //处理客服消息模块结束.
  419. }else{///////////////////////////////////////////////////////////////
  420. echo "";
  421. exit;
  422. }
  423. }
  424. }
  425. function zhishiku($fromuserid,$keyword,$uniacid,$url,$addstr,$userinfo){
  426. //知识库处理模块
  427. //echo '<br>知识库模块<br>'.$keyword.$uniacid;
  428. $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表
  429. $keys = json_decode($json,true);
  430. $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表
  431. $numkeys = json_decode($json,true);
  432. if(is_numeric($keyword)){
  433. $send=$keys[$numkeys[$keyword]];
  434. }else {
  435. $send=$keys[$keyword]; //$keys['关于我们'];
  436. }
  437. if ( $send<>'' ) { //判断是否是知识库设置字段
  438. if ($send['link']['title']!=''){
  439. $send['link']['title']=str_replace('id',$userinfo['id'],$send['link']['title']);
  440. $send['link']['title']=str_replace('[name]', trim($userinfo['nickname']),$send['link']['title']);
  441. }
  442. if ($send['miniprogrampage']['title']!=''){
  443. $send['miniprogrampage']['title']=str_replace('id',$userinfo['id'],$send['miniprogrampage']['title']);
  444. $send['miniprogrampage']['title']=str_replace('[name]', trim($userinfo['nickname']),$send['miniprogrampage']['title']);
  445. }
  446. if ($send['news']['articles'][0]['title']!=''){
  447. // $send['news']['articles'][0]['title']=str_replace('id',$userinfo['id'],$send['news']['articles'][0]['title']);
  448. $str=json_encode($send['news']['articles']);
  449. $str=str_replace('[name]', trim($userinfo['nickname']),$str);
  450. $send['news']['articles']=json_decode($str,true);
  451. }
  452. if ($send['text']['content']!=''){
  453. $send['text']['content']=str_replace('[id]',$userinfo['id'],$send['text']['content']);
  454. $send['text']['content']=str_replace('[name]',trim($userinfo['nickname']),$send['text']['content']);
  455. $send['text']['content']=changeurl($send['text']['content']);
  456. $send['text']['content'].=$addstr;
  457. }
  458. $send['touser']=$fromuserid;
  459. $data=json_encode($send,JSON_UNESCAPED_UNICODE);
  460. $aaa = http_post_data($url, $data);
  461. $zt=json_decode($aaa, true)['errcode'];
  462. if ($zt!=0){//下发未成功
  463. $data='{ "touser":"'.$fromuserid.'", "msgtype":"text",
  464. "text": { "content":" 系统忙 错误代码: ' . $zt . ' " } }';
  465. $aaa = http_post_data($url, $data);
  466. }
  467. return true;
  468. }else{
  469. return false;//不是知识.
  470. }
  471. }
  472. function sendmsg($openid,$msgtype,$keyword,$postObj,$url){
  473. //消息处理模块.
  474. if($openid=='obW0e0QwzK2KTM3ueYbXS96GyomA'){
  475. $kf=' ,"customservice":
  476. {
  477. "kf_account": "kf2002@gh_4caa0ef9c5e1"
  478. }';}
  479. switch ($msgtype)
  480. {
  481. case 'text':
  482. $data1='{ "touser":"'.$openid.'", "msgtype":"text",
  483. "text": { "content":" '.$keyword.' " } '.$kf.' }';
  484. break;
  485. case 'image':
  486. $MediaId = $postObj->MediaId;
  487. $data1=' { "touser":"'.$openid.'", "msgtype":"image",
  488. "image": { "media_id":"'.$MediaId.'" }}';
  489. break;
  490. case 'voice':
  491. $MediaId = $postObj->MediaId;
  492. $Recognition = $postObj->Recognition;
  493. $data1=' { "touser":"'.$openid.'", "msgtype":"voice",
  494. "voice": { "media_id":"'.$MediaId.'" }}';
  495. break;
  496. case 'miniprogrampage':
  497. $data1='';
  498. break;
  499. case 'link':
  500. $baogao=' {
  501. "title": " '.$postObj->Title.'",
  502. "description": "'.$postObj->Description.'",
  503. "url": "'.$postObj->Url.'",
  504. "thumb_url": "http://'.$_SERVER['HTTP_HOST'].'/addons/qidong_app/icon.jpg"
  505. }';
  506. $data1='{ "touser":"'.$openid.'", "msgtype":"link", "link": '.$baogao.' }';
  507. break;
  508. default:
  509. $data1='';
  510. }
  511. $aaa = http_post_data($url, $data1);
  512. //echo '发送消息:'.$data1.$aaa;
  513. logger('@@@@@@@@'.$data1.$aaa);
  514. return $aaa;
  515. }
  516. function http_post_data($url, $data_string) {
  517. set_time_limit ( 0 );
  518. $curl = curl_init();
  519. curl_setopt($curl, CURLOPT_URL, $url);
  520. curl_setopt($curl, CURLOPT_HEADER, 0);
  521. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  522. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//这个是重点。
  523. curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
  524. curl_setopt($curl, CURLOPT_HTTPHEADER, array(
  525. 'Content-Type: application/json',
  526. 'Content-Length: ' . strlen($data_string))
  527. );
  528. $data = curl_exec($curl);
  529. curl_close($curl);
  530. return $data;
  531. }
  532. function zhaokefumingling($fromuserid,$uniacid,$keyword,$url,$kefuarr,$website){
  533. $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true);
  534. //$kefuname=substr($keyword,7);
  535. $Kefuopenid=array_search($keyword,$kefulist,true);//找到客服id
  536. if (substr($kefuarr[$Kefuopenid],0,1)=='o')//看客服状态 客服状态over
  537. {
  538. sendmsg($fromuserid,'text','客服忙,请稍后.','',$url);//下发排队情况给用户.
  539. return false;
  540. }else{//客服接入//
  541. if($Kefuopenid==''){
  542. sendmsg($fromuserid,'text','客服休息了.请稍后再试.','',$url);//下发排队情况给用户.
  543. return false;
  544. }else{//客服在,对接开始. 如果是排队发的 则删除排队.如果是没排队发的.则不排队.
  545. $kefuarr[$Kefuopenid]=$fromuserid;
  546. //建立对接 同时通知双方. 发两次消息.
  547. unlink('json/'.$uniacid.'_kefu.json');
  548. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr));
  549. //增加获取用户信息功能. 没排队 直接进入 需要查客户信息.
  550. $json = file_get_contents("json/".$uniacid."_paidui.json");
  551. $paiduiarr = json_decode($json,true);
  552. if(array_key_exists($fromuserid,$paiduiarr)){//如果在排队则..
  553. $uid=$paiduiarr[$fromuserid]['id'];
  554. $nickname=$paiduiarr[$fromuserid]['nickname'];
  555. unset($paiduiarr[$fromuserid]);//删除它
  556. $res=file_put_contents("json/".$uniacid."_paidui.json", json_encode($paiduiarr));
  557. }else{//没排队 .就是上来就发的. 新用户就注册 老用户就获取.
  558. $users=getuser($uniacid,$fromuserid,$nickname,$website);
  559. $uid=$users['id'];
  560. $nickname=$users['nickname'];
  561. }
  562. sendmsg($Kefuopenid,'text','['.$uid.']'.$nickname.':'.$keyword.' 你好','',$url);//通知客服
  563. // $kefuname = $kefulist[$Kefuopenid];
  564. sendmsg($fromuserid,'text',$keyword.':你好,有什么可以帮到你的?','',$url);//通知客服
  565. return true;
  566. }
  567. }
  568. }
  569. function atsuoyouren($uniacid,$website,$keyword,$myopenid,$url,$toUsername){
  570. //@所有人
  571. $huncun= json_decode(alluser($uniacid,$website),true);
  572. $gjz=substr($keyword,10,strlen(trim($keyword))-10);
  573. if (substr ($keyword, -1)=='#'){
  574. $gjz=str_replace('#','|',$gjz);
  575. }
  576. $baogao=' {
  577. "title": "代发列表已经准备好!点此群发",
  578. "description": "本次准备发送: '.$huncun['count'].' 请1分钟内点击,过期失效.",
  579. "url": "'.$website.'addons/qidong_app/qunfa.php?uniacid='.$uniacid.'&keyword='.$gjz.'&tousername='.$toUsername.'&t='.time().'",
  580. "thumb_url": "'.$website.'/addons/qidong_app/icon.jpg"
  581. }';
  582. $data1='{ "touser":"'.$myopenid.'", "msgtype":"link", "link": '.$baogao.' }';
  583. $aaa = http_post_data($url, $data1); //
  584. }
  585. function zxkefu($uniacid,$kefuarr,$sqstr1){//读取在线客服列表//下次升级点击接通??
  586. $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页
  587. $kefulist = json_decode($json,true);
  588. $kefuopenid= array_keys($kefulist);//kfuopenid
  589. $kefuall='';
  590. $i=0;
  591. foreach ($kefuopenid as $kefuopenid){ //群发--
  592. //$kfopenid=$arr;
  593. if(substr($kefuarr[$kefuopenid],0,1)=="o"){
  594. $zt='忙碌';
  595. }else{
  596. $zt=$kefuarr[$kefuopenid];
  597. }
  598. if ($zt<>'隐身'){
  599. $i++;
  600. //$sqstr=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid']."&kfname=".$kfname;
  601. //$sqstr="\n<a href='".$sqstr."'>点此快速接通客服</a>";
  602. //$sqstr1=$website."addons/qidong_app/intenet.php?zfopenid=".$fromUsername."&toUsername=".$toUsername."&appid=".$arr['Gappid']."&kfname=".$kfname;
  603. if(($sqstr1=='') or ($zt=='忙碌')){
  604. $kefuall=$kefuall." ".$kefulist[$kefuopenid]."[".$zt."]";
  605. }else{
  606. $sqstr="\n<a href='".$sqstr1."&kfname=".$kefulist[$kefuopenid]."&kfopenid=".$kefuopenid."'>".$kefulist[$kefuopenid]."</a>";
  607. $kefuall=$kefuall." ".$sqstr."[".$zt."]";
  608. }
  609. if(($i % 2)==0){ $kefuall.="\n";}
  610. // $kefuall=$kefuall.' <a href="#">'.$kefulist[$kefuopenid].'</a>['.$zt.']';
  611. }
  612. }
  613. //logger($kefuall);
  614. return $kefuall;
  615. }
  616. function atmouren($keyword,$uniacid,$website,$fromuserid,$url,$kefuname){
  617. $stri=0;
  618. $stri= stripos($keyword,':');
  619. if ($stri==0){$stri= stripos($keyword,' ') ;}
  620. if ($stri==0){$stri= stripos($keyword,':') ;}
  621. $nid=substr($keyword,1,$stri-1); //@12:=>12
  622. $say=trim(substr($keyword,$stri+1));//发送的内容:
  623. if($say==''){$say=$kefuname.'@你 ,客服上线了,邀请你进入会话.';}
  624. //判断say最后字符是# 则是关键词消息 991#
  625. $liuuser= hiuser($uniacid,$nid,$website);
  626. $result = substr ($say, -1); //当是# 关键字图文时 .
  627. if ($result=='#'){
  628. $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表
  629. $keys = json_decode($json,true);
  630. $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表
  631. $numkeys = json_decode($json,true);
  632. $gjz=substr($say,0,strlen($say)-1);
  633. if(is_numeric($gjz)){
  634. $send=$keys[$numkeys[$gjz]];
  635. } else {
  636. $send=$keys[$gjz]; //$keys['关于我们'];
  637. }
  638. $send['touser']=$liuuser['openid'];
  639. $nickname=$liuuser['nickname'];
  640. if($nickname==''){$nickname='会员'.$liuuser['id'];}
  641. $send['link']['title']=str_replace('[id]',$liuuser['id'],$send['link']['title']);
  642. $send['link']['title']=str_replace('[name]', trim($nickname),$send['link']['title']);
  643. $data=json_encode($send,JSON_UNESCAPED_UNICODE);
  644. $bbb = http_post_data($url, $data);
  645. logger('单发:'.$gjz.'-'.$data);
  646. }else{
  647. sendmsg($liuuser['openid'],'text','['.$kefuname.'@你]:'.$say,'',$url);
  648. }
  649. if (json_decode($bbb, true)['errcode']==0)
  650. { $zt='送达';
  651. //对方正在输入...哈哈
  652. $data8='{ "touser":"'.trim($liuuser['openid']).'", "command":"Typing"}';
  653. $url8='https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token='.$Atoken;
  654. $bbb = http_post_data($url8, $data8);
  655. //logger($bbb);
  656. //结束输入判断.
  657. }else{
  658. $zt='失败,可能已经离线'.json_decode($bbb, true)['errcode']; };
  659. sendmsg($fromuserid,'text','[@'.$nid.'报告]:'.$zt,'',$url);
  660. //发送消息
  661. }
  662. function glymingling($uniacid,$openid,$kehuopenid,$keyword,$jsy,$kefuarr,$url,$toUsername,$website){
  663. //处理管理员命令 @某人命令?
  664. //echo '检查命令!';$
  665. if (strpos(',清零,下一个,隐身,看留言,上班,排队,@所有人,',$keyword)>0){
  666. //此处增加管理员命令列表处理.
  667. if($keyword=='看留言'){
  668. $json = file_get_contents('json/'.$toUsername.'_lishi.json');
  669. sendmsg($openid,'text','本次获取的内容,已清空留言板:\n'.$json,'',$url);
  670. unlink('json/'.$toUsername.'_lishi.json');
  671. }
  672. if($keyword=='排队'){
  673. $json = file_get_contents("json/".$uniacid."_paidui.json");
  674. $karr = json_decode($json,true);
  675. $pdrs=count($karr);
  676. sendmsg($openid,'text','排队人数:'.$pdrs,'',$url);//发排队人数.后面再做详情.??
  677. }
  678. if($keyword=='隐身'){
  679. $kefuarr[$openid]='隐身';
  680. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr));
  681. sendmsg($openid,'text','设置隐身成功. 可被点名进入聊天.不能自动进入聊天.','',$url);
  682. }
  683. if($keyword=='清零'){
  684. unlink('json/'.$toUsername.'_paidui.json');
  685. unlink('json/'.$toUsername.'_token.json');
  686. unlink('log.xml');
  687. if (!file_exists('json/'.$toUsername.'_paidui.json')){
  688. $t="清零成功!";
  689. }else{
  690. $t="清零失败,请检查目录权限是否设置为777!";
  691. }
  692. sendmsg($openid,'text',$t,'',$url);
  693. }
  694. if($keyword=='上班'){
  695. $kefuarr[$openid]='空闲';
  696. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefuarr));
  697. sendmsg($openid,'text','设置上班成功. 可自动接入来访客户.','',$url);
  698. }
  699. if($keyword=='下一个'){
  700. //跟现在的说再见 ?再见语?
  701. $json = file_get_contents("json/".$uniacid."_kefulist.json");//客服详情页
  702. $kefulist = json_decode($json,true);
  703. $kefuname = $kefulist[$openid];
  704. if (substr($kehuopenid,0,1)=='o'){
  705. //回复图文消息.
  706. jieshuyu($jsy,$uniacid,$kehuopenid,$website,$url);
  707. edituser($uniacid,$kehuopenid,'',$website,$avartar,$zhuangtai,$kefuname);
  708. }
  709. //找到下一个客户?
  710. $json = file_get_contents("json/".$uniacid."_paidui.json");
  711. $paiduiarr = json_decode($json,true);
  712. $nextkh=array_shift($paiduiarr);//取出并从排队中删除第一个.
  713. if (substr($nextkh['openid'],0,1)=='o'){
  714. sendmsg($nextkh['openid'],'text',$kefuname.':你好,久等了.','',$url);//新用户你好.
  715. $userjson=json_encode($paiduiarr);
  716. $res=file_put_contents("json/".$uniacid."_paidui.json",$userjson);//更新排队数据.
  717. $kefuarr[$openid]=$nextkh['openid'];//保存新的用户进来.;
  718. sendmsg($openid,'text','['.$nextkh['id'].']'.$nextkh['nickname'].'已经进入聊天.','',$url);//
  719. $res=file_put_contents("json/".$uniacid."_kefu.json",json_encode($kefuarr));//更新客服数据.
  720. //$kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true);
  721. //$kefuname = $kefulist[$fromuserid];
  722. //sendmsg($nextkh['openid'],'text',$kefuname.':你好久等了.','',$url);//
  723. }else{//已无排队用户.修正客服表 保存.告诉客服.
  724. $kefuarr[$openid]='空闲';
  725. $res=file_put_contents("json/".$uniacid."_kefu.json",json_encode($kefuarr));//更新客服数据.
  726. sendmsg($openid,'text','已无排队用户.你的状态目前是空闲.\n常用命令: 上班 隐身 排队.','',$url);//新用户你好.
  727. }
  728. }
  729. return true;
  730. }else
  731. {
  732. return false;
  733. }
  734. }
  735. function paidui($uniacid,$openid,$website){
  736. $json = file_get_contents("json/".$uniacid."_paidui.json");
  737. $kefuarr = json_decode($json,true);
  738. if(array_key_exists($openid,$kefuarr)){
  739. return '排队中,请耐心等待.';//排队中...
  740. }else{
  741. $user=getuser($uniacid,$openid,$nickname,$website);//获取用户信息
  742. $userinfo=array('id'=>$user['id'],
  743. 'nickname'=>$user['nickname'],
  744. 'beizhu'=>$user['beizhu'],
  745. 'openid'=>$openid);
  746. $kefuarr[$openid]=$userinfo;
  747. $userjson=json_encode($kefuarr);
  748. $res=file_put_contents("json/".$uniacid."_paidui.json",$userjson);
  749. $qianmian=count($kefuarr)-1;
  750. return '已接入客服中心,前面有'.$qianmian.'人';//排队数量
  751. }
  752. }
  753. function getuser($ucid,$openid,$nickname,$website)
  754. {
  755. ///先判断缓存文件是否存在
  756. $json = file_get_contents("json/".$ucid."_user.json");
  757. $userinfos = json_decode($json,true);
  758. // $userid=$userinfos[$openid]['id'];
  759. // echo '找到缓存表:'.$userid;
  760. if (!array_key_exists($openid,$userinfos)){
  761. $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=getuser&m=qidong_app&openid=".$openid."&nickname=".$nickname;
  762. // echo $token_access_url;
  763. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  764. $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP
  765. $nickname= $result['data']['wxapp'][0]['nickname'];
  766. $beizhu= $result['data']['wxapp'][0]['zhuangtai'];
  767. $lastliao= $result['data']['wxapp'][0]['lastliao'];
  768. if (trim($nickname)==null) {
  769. $nickname='会员'.$result['data']['wxapp'][0]['id'];
  770. $isid=1;
  771. }
  772. $userid=$result['data']['wxapp'][0]['id'];
  773. $data = array(
  774. 'nickname' => $nickname,
  775. 'id' => $userid,
  776. 'beizhu' => $beizhu,
  777. 'lastliao'=> $lastliao
  778. );
  779. return $data ;
  780. }else
  781. {
  782. // echo '找到缓存 直接返回;';
  783. return $userinfos[$openid];
  784. }
  785. //缓存 先去判断文件是否存在 .
  786. }
  787. //去查询 用户表 或者 客服表 找到详细信息.
  788. // 输出 : 身份[客服 或 用户 ] 状态 [ 咨询中 | 排队中 ]
  789. //规则 聊天中 不能使用1 2 3 不去查询 . 都发给管理员 .
  790. function changeurl($a){
  791. $bi= strpos($a,'[[');
  792. if ($bi==0){
  793. return $a;
  794. }else{
  795. $ei= strpos($a,']]');
  796. $qb=substr($a,0,$bi);
  797. $eb=substr($a,$ei+2);
  798. $b=substr($a,$bi+2,$ei-$bi-2);
  799. $ci=strpos($b,'|');
  800. $add=substr($b,0,$ci);
  801. $herf=substr($b,$ci+1,strlen($b)-$ci);
  802. }
  803. return $qb."<a href='".$herf."'>".$add."</a>".$eb;
  804. }
  805. function getToken($appid,$appsecret,$jsonid){
  806. $file = file_get_contents("json/{$jsonid}_token.json",true);
  807. $result = json_decode($file,true);
  808. if (time() > $result['expires']){
  809. $data = array();
  810. $data['access_token'] = getNewToken($appid,$appsecret);
  811. $data['expires']=time()+7200;
  812. $jsonStr = json_encode($data);
  813. $fp = fopen("json/{$jsonid}_token.json", "w");
  814. fwrite($fp, $jsonStr);
  815. fclose($fp);
  816. return $data['access_token'];
  817. }else{
  818. return $result['access_token'];
  819. }
  820. }
  821. function getNewToken($appid,$appsecret){
  822. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
  823. $access_token_Arr = https_request($url);
  824. return $access_token_Arr['access_token'];
  825. }
  826. function https_request ($url){
  827. $ch = curl_init();
  828. curl_setopt($ch, CURLOPT_URL, $url);
  829. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  830. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  831. $out = curl_exec($ch);
  832. curl_close($ch);
  833. return json_decode($out,true);
  834. }
  835. function logger($log_content)
  836. {
  837. if(isset($_SERVER['HTTP_APPNAME'])){ //SAE
  838. sae_set_display_errors(false);
  839. sae_debug($log_content);
  840. sae_set_display_errors(true);
  841. }else{ //LOCAL
  842. $max_size = 500000;
  843. $log_filename = "log1.xml";
  844. if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
  845. file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND);
  846. }
  847. }
  848. function getwxinfo($token,$openid){
  849. $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$token}&openid={$openid}&lang=zh_CN";
  850. // logger($url);
  851. $access_token_Arr = https_request($url);
  852. return $access_token_Arr;
  853. }
  854. function hiuser($ucid,$id,$website){
  855. $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=getopenid&m=qidong_app&id=".$id;
  856. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  857. $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP
  858. $data=$result['data'][0] ;
  859. return $data ;
  860. }
  861. function alluser($ucid,$website){
  862. $token_access_url = "{$website}/app/index.php?i=".$ucid."&c=entry&a=wxapp&do=Getallopenid&m=qidong_app";
  863. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  864. $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP
  865. $data=$result['data'] ;
  866. return json_encode($data) ;
  867. }
  868. function edituser($ucid,$openid,$nickname,$website,$avartar,$zhuangtai,$lastliao) //改名取号
  869. {
  870. $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
  871. // echo $token_access_url;
  872. // exit;
  873. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  874. $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP
  875. $data=$result['data'];
  876. if ($data==1){$data='改名成功!';}
  877. else{$data='改名失败!';}
  878. return $data ;
  879. }
  880. function chaoshile($uniacid,$chaoshi,$website,$url,$fromuserid,$jsy){
  881. //超时自动退出 读取时间表 读取客服表 判断时间 超过的 ->设置成空闲 .给用户发消息超时退出.
  882. $json = file_get_contents('json/'.$uniacid.'_time.json');//读取key列表
  883. $kefutime = json_decode($json,true);
  884. $json = file_get_contents('json/'.$uniacid.'_kefu.json');//读取数字key列表
  885. $kefustr = json_decode($json,true);
  886. $arr = array_keys($kefutime);//openid
  887. $kefulist = json_decode(file_get_contents("json/".$uniacid."_kefulist.json"),true);
  888. foreach ($arr as $arr){
  889. $kftime=$kefutime[$arr]+$chaoshi;
  890. if (substr($kefustr[$arr],0,1)=="o"){
  891. if ($kftime<time()){
  892. //给老客户发信息
  893. $kefutime[$arr]=time();//修改时间.
  894. jieshuyu($jsy,$uniacid,$kefustr[$arr],$website,$url);
  895. $kefuname = $kefulist[$arr];
  896. edituser($uniacid,$kefustr[$arr],'',$website,$avartar,$zhuangtai,$kefuname);
  897. //设置新标签 查找排队
  898. $paiduinumber=count(file('json/'.$uniacid.'_paidui.json'));
  899. if ($paiduinumber==0){
  900. $kefustr[$arr]='空闲';}
  901. else{
  902. $json = file_get_contents('json/'.$uniacid.'_paidui.json');//读取key列表
  903. $paiduiarr = json_decode($json,true);
  904. $nextkh=array_shift($paiduiarr);//取出并从排队中删除第一个.
  905. if(substr($nextkh['openid'],0,1)=='o'){
  906. sendmsg($nextkh['openid'],'text',$kefuname.':你好,久等了.','',$url);//新用户你好.
  907. $kefustr[$arr]=$nextkh['openid'];//保存新的用户进来.;
  908. sendmsg($arr,'text','['.$nextkh['id'].']'.$nextkh['nickname'].'已经进入聊天.','',$url);//
  909. // $res=file_put_contents("json/".$uniacid."_kefu.json",json_encode($kefuarr));//更新客服数据.
  910. }else{
  911. $kefustr[$arr]='空闲';
  912. }
  913. $userjson=json_encode($paiduiarr);
  914. $res=file_put_contents("json/".$uniacid."_paidui.json",$userjson);//更新排队数据.
  915. }
  916. }//结束判断
  917. }//结束判断o
  918. }
  919. $res=file_put_contents("json/".$uniacid."_kefu.json", json_encode($kefustr));
  920. $res=file_put_contents("json/".$uniacid."_time.json", json_encode($kefutime));
  921. }
  922. function daohang($uniacid){
  923. $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表
  924. $keys = json_decode($json,true);
  925. $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表
  926. $numkeys = json_decode($json,true);
  927. $arr= array_keys($numkeys);
  928. $i=0;
  929. foreach ($arr as $arr) {
  930. $daohang.=$arr.':'.changeurl($numkeys[$arr]) .'\n';
  931. $i++;
  932. if ($i>9){break;};
  933. }
  934. return $daohang;
  935. }
  936. function jieshuyu($bye,$uniacid,$openid,$website,$url){
  937. if(is_numeric($bye)){
  938. $json = file_get_contents('json/'.$uniacid.'_keywords.json');//读取key列表
  939. $keys = json_decode($json,true);
  940. $json = file_get_contents('json/'.$uniacid.'_keys.json');//读取数字key列表
  941. $numkeys = json_decode($json,true);
  942. $delid=getuser($uniacid,$openid,'',$website);
  943. $send=$keys[$numkeys[$bye]];
  944. if ($send['link']['title']!=''){
  945. $send['link']['title']=str_replace('id',$delid['id'],$send['link']['title']);
  946. $send['link']['title']=str_replace('[name]', trim($delid['nickname']),$send['link']['title']);
  947. }
  948. if ($send['miniprogrampage']['title']!=''){
  949. $send['miniprogrampage']['title']=str_replace('id',$delid['id'],$send['miniprogrampage']['title']);
  950. $send['miniprogrampage']['title']=str_replace('[name]', trim($delid['nickname']),$send['miniprogrampage']['title']);
  951. }
  952. if ($send['text']['content']!=''){
  953. $send['text']['content']=str_replace('[id]',$delid['id'],$send['text']['content']);
  954. $send['text']['content']=str_replace('[name]',trim($delid['nickname']),$send['text']['content']);
  955. // logger('要替换的文本:'.$send['text']['content']);
  956. $send['text']['content']=changeurl($send['text']['content']);
  957. }
  958. $send['touser']=trim($openid);
  959. $data0=json_encode($send,JSON_UNESCAPED_UNICODE);
  960. }
  961. else {
  962. $sends=$bye; //$keys['关于我们'];
  963. $jieshuyu= str_replace('[name]',$delid['nickname'],$sends);
  964. $jieshuyu=str_replace("{br}","\n",$jieshuyu);
  965. $jieshuyu=changeurl($jieshuyu);
  966. $data0='{ "touser":"'.trim($openid).'", "msgtype":"text",
  967. "text": { "content":" '.$jieshuyu.' " } }';
  968. }
  969. $aaa = http_post_data($url, $data0);
  970. logger($data0);
  971. }
  972. function Finduser($ucid,$tablename,$culname,$openid,$findname,$website){
  973. //&tablename=dc_user&culname=openid&findname=name&openid=ogMce0dAqzqm3LSCIBzoHb4XYgFU
  974. $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}";
  975. // logger( $token_access_url);
  976. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  977. logger('--------------'.$res);
  978. $result = json_decode($res, true); //接受一个 JSON 格式的字符串并且把它转换为 PHP
  979. $data=$result['data']['nickname'] ;
  980. return $data ;
  981. }
  982. function Inserthistory($toUsername,$uniacid,$kfopenid,$kfname,$khopenid,$khname,$keyword,$postObj,$zhuangtai,$website){
  983. //&tablename=dc_user&culname=openid&findname=name&openid=ogMce0dAqzqm3LSCIBzoHb4XYgFU
  984. $type=$postObj->MsgType;
  985. if ($type=='image'){
  986. $keyword=$postObj->PicUrl;
  987. }
  988. if ($type=='voice'){
  989. $keyword=$postObj->Recognition;
  990. }
  991. $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}";
  992. // logger( $token_access_url);
  993. $res = file_get_contents($token_access_url); //获取文件内容或获取网络请求的内容
  994. //return $data ;
  995. }
  996. function sendMBmsg($Atoken,$openid,$template_id,$url,$appid,$pagepath,$data){
  997. //消息处理模块.
  998. // $info = json_decode(file_get_contents("json/info_".$jsonid.".json"),true);//读取设置文件.
  999. //$Atoken=$info['access_token'];
  1000. $data1=' {
  1001. "touser":"'.$openid.'",
  1002. "template_id":"'.$template_id.'",
  1003. "url":"'.$url.'",
  1004. "miniprogram":{
  1005. "appid":"'.$appid.'",
  1006. "pagepath":"'.$pagepath.'"
  1007. },
  1008. "data": '.$data.'
  1009. }';
  1010. // echo $data1."<br>";
  1011. $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=$Atoken";
  1012. // echo $url."<br>";
  1013. $aaa = http_post_data($url, $data1);
  1014. // print_r($aaa);
  1015. return $aaa;
  1016. }
  1017. function getReqSign($params /* 关联数组 */, $appkey /* 字符串*/)
  1018. {
  1019. // 1. 字典升序排序
  1020. ksort($params);
  1021. // 2. 拼按URL键值对
  1022. $str = '';
  1023. foreach ($params as $key => $value)
  1024. {
  1025. if ($value !== '')
  1026. {
  1027. $str .= $key . '=' . urlencode($value) . '&';
  1028. }
  1029. }
  1030. // 3. 拼接app_key
  1031. $str .= 'app_key=' . $appkey;
  1032. // 4. MD5运算+转换大写,得到请求签名
  1033. $sign = strtoupper(md5($str));
  1034. return $sign;
  1035. }
  1036. // doHttpPost :执行POST请求,并取回响应结果
  1037. // 参数说明
  1038. // - $url :接口请求地址
  1039. // - $params:完整接口请求参数(特别注意:不同的接口,参数对一般不一样,请以具体接口要求为准)
  1040. // 返回数据
  1041. // - 返回false表示失败,否则表示API成功返回的HTTP BODY部分
  1042. function doHttpPost($url, $params)
  1043. {
  1044. $curl = curl_init();
  1045. $response = false;
  1046. do
  1047. {
  1048. // 1. 设置HTTP URL (API地址)
  1049. curl_setopt($curl, CURLOPT_URL, $url);
  1050. // 2. 设置HTTP HEADER (表单POST)
  1051. $head = array(
  1052. 'Content-Type: application/x-www-form-urlencoded'
  1053. );
  1054. curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
  1055. // 3. 设置HTTP BODY (URL键值对)
  1056. $body = http_build_query($params);
  1057. curl_setopt($curl, CURLOPT_POST, true);
  1058. curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
  1059. // 4. 调用API,获取响应结果
  1060. curl_setopt($curl, CURLOPT_HEADER, false);
  1061. curl_setopt($curl, CURLOPT_NOBODY, false);
  1062. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  1063. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
  1064. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  1065. $response = curl_exec($curl);
  1066. if ($response === false)
  1067. {
  1068. $response = false;
  1069. break;
  1070. }
  1071. $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  1072. if ($code != 200)
  1073. {
  1074. $response = false;
  1075. break;
  1076. }
  1077. } while (0);
  1078. curl_close($curl);
  1079. return $response;
  1080. }
  1081. // 设置请求数据(应用密钥、接口请求参数)
  1082. function jiqiren($keyword,$session){
  1083. $appkey = 'l2FBbW8zsJvp3kQa';
  1084. $params = array(
  1085. 'app_id' => '1106992438',
  1086. 'time_stamp' => time(),
  1087. 'nonce_str' => '20e340'.rand(1000,9999),
  1088. 'session' => $session,
  1089. 'question' => $keyword,
  1090. 'sign' => ''
  1091. );
  1092. $params['sign'] = getReqSign($params, $appkey);
  1093. // 执行API调用
  1094. $url = 'https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat';
  1095. $response = doHttpPost($url, $params);
  1096. return json_decode($response,true)['data']['answer'];
  1097. }
  1098. ?>