微信企业号客服功能开发PHP
微信企业号客服功能开发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×tamp=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相关推荐
- 微信在线客服功能开发问题记录
由于负责公司语音客服系统开发.本着拓展客服系统功能,完善客服系统生态的原则.需要开发在线客服系统.首先对接的就是微信公众号关注用户的在线客服功能. 在微信测试平台http://mp.weixin.qq ...
- 微信企业号多客服功能开发PHP
微信企业号多客服功能开发PHP 思路 单客服 多客服 客服用户对话连接 接收文本信息 发送文本信息 思路 1.点击应用的菜单-在线客服-触发事件 $result1 = $this->receiv ...
- C#开发微信门户及应用(7)-微信多客服功能及开发集成
原文:C#开发微信门户及应用(7)-微信多客服功能及开发集成 最近一直在弄微信的集成功能开发,发现微信给认证账户开通了一个多客服的功能,对于客户的咨询,可以切换至客服处理的方式,而且可以添加多个客服进 ...
- 微信多客服功能怎么使用?
企业微信公众号的同质化越来越严重,单纯靠内容取胜已经越来越难,而服务的优劣成为影响企业成功的重要因素.想要将微信公众号打造成优秀的客户服务工具,就需要用到微信多客服功能,那么具体怎么使用呢? 网页版微 ...
- java实现微信小程序客服功能开发,后台接受用户发送消息实现关键词自动回复
最近做了一个小程序中间用到了小程序客服功能,主要实现采集用户提问,并且针对关键词自动回复及手动回复.中间踩过很多坑,所也现在记录下来提供给大家. 准备 首先准备一个小程序,配置好域名,左边菜单栏目点击 ...
- java实现微信小程序客服功能开发
第一步:先在后台接入配置URL 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/custome ...
- java微信的客服接口开发,微信公众号 客服接口的开发实例详解
微信平台更新之后,发现客服接口不错.研究了下 和大家分享下. 按照官方文档,是向客服接口发送规定的JSon 就可以了. 首先先封装下 JSon 的类: package com.lwz.wx.bean. ...
- 多客服功能终于也向所有微信认证的订阅号开放了
多客服功能支持多人同时为一个公众号提供客服服务,经过半年多仅对认证服务号开放后,现在终于也向所有微信认证的订阅号开放了,所有微信认证的服务号和订阅号可以在"功能"-"添加 ...
- 微信公众号开发之客服功能的群发消息功能
本周我们做了一个有技术含量的一个新功能:客服功能的群发消息功能.此功能主要用于微信公众号客服群发提醒,比如客户的商家认证审核通过,用户购买商品成功等功能提醒,可以有效减少网站项目开发所必要的资金节约. ...
最新文章
- ASP.NET Web Pages – 页面布局简介
- JavaScript动画:offset和匀速动画详解(含轮播图的实现)
- 百度地图定位地址为空
- [2012.04.03] Windows Phone 上的汉语拼音以及多音字处理
- 《企业软件交付:敏捷与高效管理精要》——2.1 引言
- SQL_alter_table已有表操作
- 编程语言 Ruby 如何还能再活 25 年?
- tensorflow版PSENet 文本检测模型训练和测试
- PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
- [转]Using Named Pipes (FIFOs) with Bash
- Android开发环境搭建(基于Android Studio)
- 【Python】二分法求函数零点
- Python图像变换及手绘效果
- Resolving multicopy duplications de novo using polyploid phasing 用多倍体相位法解决多拷贝复制的新问题...
- Orthogonal greedy algorithm降维
- 一文详解超纤皮和真皮的区别,别再傻傻分不清了
- cadence一些快捷键
- linux下批量修改图片分辨率
- 计算机硬件是怎么影响性能的,哪些硬件影响电脑的性能
- 青浦区科技小巨人企业和区科技小巨人培育企业给予45万元和30万元的资助
热门文章
- html排版标记应用,HTML的排版标记_html
- Webpower:2016节日营销趋势
- Docker容器的理解
- Java基本知识的回顾-01
- “黑天鹅”带火云安全赛道,看SaaS黄金赛道新势力的增长逻辑
- linux时区文件格式,技术|在 Linux 中查看你的时区
- 不知道从多少开始的Qt(QML)学习之旅(01)
- Claymore's Dual Ethereum+Decred AMD+NVIDIA GPU Miner(参数)
- 2021/1/10-每日三题第17弹:靓仔语塞,你知道 position 的值有哪些吗 ???
- 百度的年会游戏(解题报告)