登录微信公众平台企业号后台,依次进入“服务中心”|“企业客服”,如图20-4所示。

图20-4 企业客服
选择“外部客户服务”,点击右侧启用链接进入配置页面,如图20-5所示。

图20-5 设置客服列表和回调接口
在配置页面中,选择企业号通讯录中的部门或成员作为客服列表,然后设置服务回调接口。
回调接口代码如下。
1 require_once("WXBizMsgCrypt.php"); 2 $encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; 3 $token = "FangBei"; 4 $corpId = "wx82e2c31215d9a5a7"; 5 6 class wechatCallbackapiTest extends WXBizMsgCrypt 7 { 8 // 验证URL有效 9 public function valid 10 { 11 $sVerifyMsgSig = $_GET["msg_signature"]; 12 $sVerifyTimeStamp = $_GET["timestamp"]; 13 $sVerifyNonce = $_GET["nonce"]; 14 $sVerifyEchoStr = $_GET["echostr"]; 15 $sEchoStr = ""; 16 $errCode = $this->VerifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr); 17 if ($errCode == 0) { 18 // 验证URL成功,将sEchoStr返回 19 echo $sEchoStr; 20 } 21 } 22 23 // 响应消息 24 public function responseMsg 25 { 26 $sReqMsgSig = $_GET['msg_signature']; 27 $sReqTimeStamp = $_GET['timestamp']; 28 $sReqNonce = $_GET['nonce']; 29 $sReqData = $GLOBALS["HTTP_RAW_POST_DATA"]; 30 $sMsg = ""; // 解析之后的明文 31 $this->logger(" DE \r\n".$sReqData); 32 $errCode = $this->DecryptMsg($sReqMsgSig, $sReqTimeStamp, $sReqNonce, $sReqData, $sMsg); 33 $this->logger(" RR \r\n".$sMsg); 34 $postObj = simplexml_load_string($sMsg, 'SimpleXMLElement', LIBXML_NOCDATA); 35 // 客服模式 36 if (isset($postObj->AgentType)){ 37 $sRespData = trim($postObj->PackageId); 38 $this->logger(" RT \r\n".$sRespData); 39 // 解析出OpenID,调用服务号客服接口发送消息 40 echo $sRespData; 41 } 42 } 43 44 // 日志记录 45 public function logger($log_content) 46 { 47 if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ // LOCAL 48 $max_size = 500000; 49 $log_filename = "log.xml"; 50 if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)) {unlink($log_filename);} 51 file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content. "\r\n", FILE_APPEND); 52 } 53 } 54 } 55 56 $wechatObj = new wechatCallbackapiTest($token, $encodingAesKey, $corpId); 57 $wechatObj->logger(' http:// '.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].(empty ($_SERVER['QUERY_STRING'])?"":("?".$_SERVER['QUERY_STRING']))); 58 59 if (!isset($_GET['echostr'])) { 60 $wechatObj->responseMsg; 61 }else{ 62 $wechatObj->valid; 63 }
上述代码解读如下。
第9~21行:验证URL有效的函数。先取GET参数,然后计算出错误码。如果错误码为0,则验证URL成功。
第23~42行:响应消息的函数。先取GET参数以及POST数据,对取得的XML数据进行解密,然后判断是否为客服模式,并提取其中的PackageId参数进行回显。