php 微信公众号客服,微信公众平台开发多客服
在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统。
本文分为以下三个部分:回复多客服消息
触发多客服会话
其他说明
一、回复多客服消息
在新的微信协议中,开发模式也可以接入客服系统。 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_service的消息,微信服务器在收到这条消息时,会把用户这次发送的和以后一段时间内发送的消息转发客服系统。
返回的消息举例如下
1399197672
该消息的实现如下//回复多客服消息
private function transmitService($object)
{
$xmlTpl = "
%s
";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
二、触发多客服会话
一般情况下,用户想要咨询问题是,经常会问“你好”,“在吗”,这样的问题。
我们以这些词为触发关键词,当用户发送的文本消息内容中包含这些词的时候,就返回多客服消息给用户(用户在微信端感觉不到任何内容,但微信公众账号会将用户本次及以后一段时间的消息都转发到客服)。
实现代码如下://接收文本消息
private function receiveText($object)
{
$keyword = trim($object->Content);
if (strstr($keyword, "投诉") || strstr($keyword, "你好") || strstr($keyword, "在吗")){
$result = $this->transmitService($object);
}
return $result;
}
三、完整代码<?php
/*
方倍工作室
CopyRight 2014 All Rights Reserved
*/
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
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, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
//响应消息
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$this->logger("R ".$postStr);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE)
{
case "event":
$result = $this->receiveEvent($postObj);
break;
case "text":
$result = $this->receiveText($postObj);
break;
}
$this->logger("T ".$result);
echo $result;
}else {
echo "";
exit;
}
}
//接收事件消息
private function receiveEvent($object)
{
switch ($object->Event)
{
case "subscribe":
$content[] = array("Title" =>"欢迎关注方倍工作室", "Description" =>"使用方法:\n1.发送快递单号,例如6367532560,可查询快递详情", "PicUrl" =>"http://www.3856.cc/weixin/weixin/logo.jpg", "Url" =>"");
break;
default:
$content = "receive a new event: ".$object->Event;
break;
}
if(is_array($content)){
if (isset($content[0])){
$result = $this->transmitNews($object, $content);
}else if (isset($content['MusicUrl'])){
$result = $this->transmitMusic($object, $content);
}
}else{
$result = $this->transmitText($object, $content);
}
return $result;
}
//接收文本消息
private function receiveText($object)
{
$keyword = trim($object->Content);
if($keyword == "时间" || $keyword == "测试"){
$content = date("Y-m-d H:i:s",time());
$result = $this->transmitText($object, $content);
}
//触发多客服模式
else if (strstr($keyword, "您好") || strstr($keyword, "你好") || strstr($keyword, "在吗") || strstr($keyword, "有人吗")){
$result = $this->transmitService($object);
return $result;
}
return $result;
}
private function transmitText($object, $content)
{
$textTpl = "
%s
";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
private function transmitNews($object, $newsArray)
{
if(!is_array($newsArray)){
return;
}
$itemTpl = "
";
$item_str = "";
foreach ($newsArray as $item){
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
}
$newsTpl = "
%s
%s
$item_str
";
$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
return $result;
}
private function transmitMusic($object, $musicArray)
{
$itemTpl = "
";
$item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
$textTpl = "
%s
$item_str
";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
//回复多客服消息
private function transmitService($object)
{
$xmlTpl = "
%s
";
$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
private 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 if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
$max_size = 10000;
$log_filename = "log.xml";
if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
}
}
}
?>
四、其他注意事项
1. 经测试,在自定义菜单中返回多客服消息,无法让用户进入多客服状态。
2. 使用多客服消息后,后续所有消息在一段时间内都将作为客服消息转发,原来的开发模式下的自动回复都将失效!!!
php 微信公众号客服,微信公众平台开发多客服相关推荐
- php 微信公众号客服,微信公众平台开发 多客服
在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统. 本文分为以下三个部分: 回复多客服消息 触发多客服会话 其他说明 一.回复多客服消息 在新的微信协议中,开发模式也可以接入客服 ...
- 微信公众平台开发(73) 客服接口发送客服消息
微信公众平台开发(73) 客服接口发送客服消息 原文:微信公众平台开发(73) 客服接口发送客服消息 微信公众平台开发 客服接口 发送客服消息 作者:方倍工作室 地址:http://www.cnbl ...
- 请签收裂变指南—公众号联动企业微信双向获客
大家好,我是Linkflow增长黑客.最近很多客户都问,如何利用裂变海报功能进行公众号和企业微信双重裂变,既能带来公众号粉丝,又能沉淀企业微信好友.今天我就给大家拆解整套裂变玩法,如何通过Linkfl ...
- 选择Confluence,而不是有道云笔记、微信公众号、Git、Markdown、CSDN博客、记事本
雷哥喜欢把事情.知识.任务,管理得紧紧有条,不喜欢乱糟糟的. 经常总结个人的经验教训,日常工作. 怎么很好地管理自己的知识,一直是个大难题. 现状如下: 浏览器收藏夹 用QQ浏览器,收藏有价值的网站. ...
- 微信公众号之接入微信公众号服务器开发(一)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶概述 公众号与公众平台 1. 微信账号类型 个人号 公众号 订阅号 服务号 企业号 2. 公众号 微信公众号主要面向名人.政府 ...
- 【分享】微信公众号在 “集简云平台“ 集成应用的常见问题与解决方案
"function category of API need be confirmed by component rid"错误 是由于使用未认证的微信公众号或者个人微信公众号没有此 ...
- 微信公众号如何接入微信机器人
微信对话开放平台文档 官方文档 平台简介 微信对话开放平台开放了微信在对话领域积累多年的的智能对话技术,开发者及非开发者可简单.快速地搭建智能对话机器人(智能客服), 并接入公众号.小程序等,为业务赋 ...
- 微信第三方平台公众号授权流程1—第三方平台概述概述
一.概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认证后的开发 ...
- 微信公众号支付java前后端分离开发
微信公众号支付java前后端分离开发 微信公众号支付java前后端分离开发 我们开发的是基于河北银行的支付,支付宝微信都做了,这里就介绍一下微信公众号支付,这个公众号支付需要配置的东西太多了,官方文档 ...
- 微信公众号网页调用微信扫一扫功能
目录 前言: 准备条件: 用到的微信接口 代码: 效果: 总结: 前言: 最近其他项目组需要在微信公众号里面调用微信的扫一扫功能,于是就帮忙一起搞了搞,一开始以为挺简单,从网上搜一下教程弄一下就可以了 ...
最新文章
- Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了
- html使用highcharts绘制饼图,html js highcharts绘制圆饼图表
- MySQL列的别名 insert into select from
- SQL Server-表表达式基础
- jQuery文本框(input textare)事件绑定方法教程
- Android 通过onTouchEvent判断是否为双击事件
- python进阶 多线程编程 —— threading和queue库实现多线程编程
- 【数据结构与算法】之深入解析“组合总和III”的求解思路与算法示例
- 【Boost】boost库asio详解9——TCP的简单例子2
- 公共子串 字符串哈希
- 《Adobe Illustrator大师班:经典作品与完美技巧赏析》—Svetlana Makarova
- postgres 禁止远程登录_Windows 7禁止可移动存储设备写入数据,只有想不到,没有做不到...
- SPOJ9534 JZPLIT - Turn on the lights(高斯消元)
- VB编程用经常要用到的算法
- PAT-1052 卖个萌
- win10环境下的telnet工具使用(客户端和服务端)
- python语言简单界面选择苏康码图片文字识别
- python基础:面向对象的应用--搬家具。
- 【机器学习】(十)核支持向量机SVM:make_blobs方法,hstack() 函数
- 如何让我们的人生,拥有更多的可能性?