微信企业号客服功能开发PHP

  • 思路
  • 回调模式
    • 开启回调
    • 菜单
  • 在线客服
    • 客服用户对话连接
    • 接收文本信息
    • 发送文本信息
  • 多客服

思路

1.点击应用的菜单-在线客服-触发事件

$result1 = $this->receiveEvent($postObj);

2.分配客服 - 使用缓存memcache进行存储分配客服的信息(项目部署在sae,所以在sae上面开启memcache即可)

$mmc = memcache_init();   //初始化缓存
memcache_set($mmc, "service", '{"from":"'.$from.'","to":"'.$to.'"}');  //分配的信息

3.发送信息接入客服和用户

$this->send_custom_msg($from, "text",  "正在为您接入客服,请稍候..");

4.断开连接,结束在线客服模式

memcache_delete($mmc, "service");

回调模式

对企业号进行开发的必要条件,就是开启回调模式。

开启回调

index.php

/*
------------验证回调URL---------------
*企业开启回调模式时,企业号会向验证url发送一个get请求
假设点击验证时,企业收到类似请求:
* GET /cgi-bin/wxpush?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3&timestamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
* HTTP/1.1 Host: qy.weixin.qq.com
接收到该请求时,企业应
1.解析出Get请求的参数,包括消息体签名(msg_signature),时间戳(timestamp),随机数字串(nonce)以及公众平台推送过来的随机加密字符串(echostr),
这一步注意作URL解码。
2.验证消息体签名的正确性
3. 解密出echostr原文,将原文当作Get请求的response,返回给公众平台
第2,3步可以用公众平台提供的库函数VerifyURL来实现。
*/
<?php
include_once "inc/WXBizMsgCrypt.php";    //企业微信接口可下载此文件  ①
include_once "information.php";           //此为在线客服功能方法类文件
include_once "constant.php";          //静态参数类//如下参数静态定义在constant.php,其值与企业微信相应值对应
$encodingAesKey= Constant::$EncodingAesKey;
$token = Constant::$Token;
$corpId = Constant::$CorpId;$sVMsgSig = $_GET['msg_signature'];    //消息体签名
$sVTimeStamp = $_GET['timestamp'];     //时间戳
$sVNonce = $_GET['nonce'];               //随机字符串
$sVEchoStr = $_GET['echostr'];           //随机加密字符串$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
if($sVEchoStr){$sEchoStr = "";
$errCode = $wxcpt->VerifyURL($sVMsgSig, $sVTimeStamp, $sVNonce, $sVEchoStr, $sEchoStr);
if ($errCode == 0) {echo $sEchoStr;
} else {print($errCode . "\n\n");
}
exit;
}else{$wechatObj = new information();    //在线客服类$wechatObj->responseMsg();
}

①代码地址:WXBizMsgCrypt.php

菜单

$menu = '{"button":[{"name":"点我其他","sub_button":[{"type":"clik","name":"其他","key":"qt"},{"type":"click", "name":"在线客服","key":"qt_kf"}]}]}';
$corpsecret = Constant::$Corpsecret;
$corpId = Constant::$CorpId;
//获取token的url
$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpId&corpsecret=$corpsecret";$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$jsoninfo = json_decode($output, true);
$access_token = $jsoninfo["access_token"];$agentid = Constant::$Agentid;
//创建菜单的url
$url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token&agentid=$agentid";
$result = https_request($url, $jsonmenu);  function https_request($url,$data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;
}

在线客服

information.php

<?php
include_once "inc/WXBizMsgCrypt.php";
include_once "constant.php";
/**
------------在线客服---------------
1、用户点击菜单在线客服,判断memcache状态
2、若存在,则发送等待信息至用户
3、若不存在,则初始化memcache,并发送相应连接客服信息至用户以及客服
4、客服发信息,则至用户;用户发信息,则至客服
5、直至客服点击菜单在线客服,则结束连接
注:此memcache需在sae上开启的memcache,否则无效
*/
class information{public function responseMsg(){$encodingAesKey = Constant::$EncodingAesKey; $token = Constant::$Token;$corpId = Constant::$CorpId;  $agentId = Constant::$Agentid;  $wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);$sReqMsgSig = $_GET["msg_signature"];$sReqTimeStamp = $_GET["timestamp"];$sReqNonce =$_GET["nonce"];$sReqData =  file_get_contents('php://input');  $sMsg = ""; // 解析之后的明文$errCode = $wxcpt->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg);if ($errCode == 0) {$postStr=$sMsg;$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$result1= "";$RX_TYPE = trim($postObj->MsgType);switch($RX_TYPE){case "text":  //文本消息$result1 = $this->receiveText($postObj);break;case "image":  //图文消息$result1 = $this->receiveImage($postObj);break;case "event":  //事件   触发在线客服连接,以及断开在线客服连接$result1 = $this->receiveEvent($postObj);break;default:$result1 = "unknow msg type:".$RX_TYPE;break;}//加密输出$sEncryptMsg = "";//xml格式的密文$errCode = $wxcpt->EncryptMsg($result1, $sReqTimeStamp, $sReqNonce, $sEncryptMsg);if ($errCode == 0) {echo $sEncryptMsg;} else {print("ERR: " . $errCode . "\n\n"); }} else {print("ERR: " . $errCode . "\n\n");    } }}   

客服用户对话连接

 private function receiveEvent($object)  {$content = "";switch($object->Event){case "click":switch($object->EventKey){case "qt_kf":$mmc = memcache_init();//客服单击,结束对话if($object->FromUserName== Constant::$Staff1 ){$service = memcache_get($mmc,"service");$relation = json_decode($service, true);$from = $relation['to'];$to = $relation['from'];$this->send_custom_msg($from, "text", "你已结束本次对话!");$this->send_custom_msg($to, "text", "感谢您的咨询。期待下次再会!");memcache_delete($mmc, "service");  //删除memcache}else{ //用户单机,开始对话$service = memcache_get($mmc,"service");$relation = json_decode($service, true);if($relation['from'] == null){$from =strval($object->FromUserName);$to = Constant::$Staff1;memcache_set($mmc, "service", '{"from":"'.$from.'","to":"'.$to.'"}');$this->send_custom_msg($from, "text",  "正在为您接入客服,请稍候..");$this->send_custom_msg($to, "text", "有用户请求接入,请响应!");}else {     //如有memcache,则提示占线$from =strval($object->FromUserName);if($from != $relation['from']){$this->send_custom_msg($from, "text",  "在线客服占线,请稍后再试。");}}}return;default:$content = "菜单默认回复";break;}break;}if(is_array($content)){$result = $this->transmitNews($object,$content);}else{$result = $this->transmitText($object,$content);}return $result;}

接收文本信息

/**
用户和客服之间的文本交互,若是在线客服功能已连接,则通过此方法,进行信息传递
*/
private function receiveText($object)   //文本消息{$keyword = trim($object->Content);$mmc = memcache_init();   //初始化memcache$service = memcache_get($mmc, "service");if($service){  //当前有人工客服对话$relation = json_decode($service, true);//用户处在人工客服交互中if(in_array($object->FromUserName, $relation)){$to = ($relation['from'] == strval($object->FromUserName))?$relation['to']:$relation['from'];$this->send_custom_msg($to, "text", $keyword);return;}$content = "";if(is_array($content)){$result = $this->transmitNews($object, $content);}else{$result = $this->transmitText($object, $content);}} return $result;}

发送文本信息

public function send_custom_msg($from, $type, $content) {$access_token = $this->getAccessToken();    //获取access_token//发送信息的url$sendmsg_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token";//信息格式$data ='{ "touser": "'.$from.'",   "toparty": "", "totag": "", "msgtype": "text", "agentid": 0, "text": { "content": "'.$content.'" }, "safe": "0" }'; return $this->mn_post($sendmsg_url,$data);}//获取access_tokenprivate function getAccessToken(){$corpid = Constant::$CorpId; $corpsecret = Constant::$Corpsecret;$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($ch);curl_close($ch);$jsoninfo = json_decode($output, true);$access_token = $jsoninfo["access_token"];return $access_token;}function mn_post($url,$data){ // 模拟提交数据函数 $curl = curl_init();   // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url);  // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检测 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览 curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); //解决数据包大不能提交 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_COOKIEFILE, $GLOBALS['cookie_file']); // 读取上面所储存的Cookie信息 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回   $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl); } curl_close($curl); // 关键CURL会话 return $tmpInfo; // 返回数据 }

多客服

如需开发多客服功能,则参考微信企业号多客服功能开发

微信企业号客服功能开发PHP相关推荐

  1. 微信在线客服功能开发问题记录

    由于负责公司语音客服系统开发.本着拓展客服系统功能,完善客服系统生态的原则.需要开发在线客服系统.首先对接的就是微信公众号关注用户的在线客服功能. 在微信测试平台http://mp.weixin.qq ...

  2. 微信企业号多客服功能开发PHP

    微信企业号多客服功能开发PHP 思路 单客服 多客服 客服用户对话连接 接收文本信息 发送文本信息 思路 1.点击应用的菜单-在线客服-触发事件 $result1 = $this->receiv ...

  3. C#开发微信门户及应用(7)-微信多客服功能及开发集成

    原文:C#开发微信门户及应用(7)-微信多客服功能及开发集成 最近一直在弄微信的集成功能开发,发现微信给认证账户开通了一个多客服的功能,对于客户的咨询,可以切换至客服处理的方式,而且可以添加多个客服进 ...

  4. 微信多客服功能怎么使用?

    企业微信公众号的同质化越来越严重,单纯靠内容取胜已经越来越难,而服务的优劣成为影响企业成功的重要因素.想要将微信公众号打造成优秀的客户服务工具,就需要用到微信多客服功能,那么具体怎么使用呢? 网页版微 ...

  5. java实现微信小程序客服功能开发,后台接受用户发送消息实现关键词自动回复

    最近做了一个小程序中间用到了小程序客服功能,主要实现采集用户提问,并且针对关键词自动回复及手动回复.中间踩过很多坑,所也现在记录下来提供给大家. 准备 首先准备一个小程序,配置好域名,左边菜单栏目点击 ...

  6. java实现微信小程序客服功能开发

    第一步:先在后台接入配置URL 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/custome ...

  7. java微信的客服接口开发,微信公众号 客服接口的开发实例详解

    微信平台更新之后,发现客服接口不错.研究了下 和大家分享下. 按照官方文档,是向客服接口发送规定的JSon 就可以了. 首先先封装下 JSon 的类: package com.lwz.wx.bean. ...

  8. 多客服功能终于也向所有微信认证的订阅号开放了

    多客服功能支持多人同时为一个公众号提供客服服务,经过半年多仅对认证服务号开放后,现在终于也向所有微信认证的订阅号开放了,所有微信认证的服务号和订阅号可以在"功能"-"添加 ...

  9. 微信公众号开发之客服功能的群发消息功能

    本周我们做了一个有技术含量的一个新功能:客服功能的群发消息功能.此功能主要用于微信公众号客服群发提醒,比如客户的商家认证审核通过,用户购买商品成功等功能提醒,可以有效减少网站项目开发所必要的资金节约. ...

最新文章

  1. ASP.NET Web Pages – 页面布局简介
  2. JavaScript动画:offset和匀速动画详解(含轮播图的实现)
  3. 百度地图定位地址为空
  4. [2012.04.03] Windows Phone 上的汉语拼音以及多音字处理
  5. 《企业软件交付:敏捷与高效管理精要》——2.1 引言
  6. SQL_alter_table已有表操作
  7. 编程语言 Ruby 如何还能再活 25 年?
  8. tensorflow版PSENet 文本检测模型训练和测试
  9. PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
  10. [转]Using Named Pipes (FIFOs) with Bash
  11. Android开发环境搭建(基于Android Studio)
  12. 【Python】二分法求函数零点
  13. Python图像变换及手绘效果
  14. Resolving multicopy duplications de novo using polyploid phasing 用多倍体相位法解决多拷贝复制的新问题...
  15. Orthogonal greedy algorithm降维
  16. 一文详解超纤皮和真皮的区别,别再傻傻分不清了
  17. cadence一些快捷键
  18. linux下批量修改图片分辨率
  19. 计算机硬件是怎么影响性能的,哪些硬件影响电脑的性能
  20. 青浦区科技小巨人企业和区科技小巨人培育企业给予45万元和30万元的资助

热门文章

  1. html排版标记应用,HTML的排版标记_html
  2. Webpower:2016节日营销趋势
  3. Docker容器的理解
  4. Java基本知识的回顾-01
  5. “黑天鹅”带火云安全赛道,看SaaS黄金赛道新势力的增长逻辑
  6. linux时区文件格式,技术|在 Linux 中查看你的时区
  7. 不知道从多少开始的Qt(QML)学习之旅(01)
  8. Claymore's Dual Ethereum+Decred AMD+NVIDIA GPU Miner(参数)
  9. 2021/1/10-每日三题第17弹:靓仔语塞,你知道 position 的值有哪些吗 ???
  10. 百度的年会游戏(解题报告)