其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多客服功能怎么使用,我找了下网上也没什么好的教程,今天我就给大家发一篇比较简单易懂的教程吧!
在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统。
一、回复多客服消息
在新的微信协议中,开发模式也可以接入客服系统。 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_service的消息,微信服务器在收到这条消息时,会把用户这次发送的和以后一段时间内发送的消息转发客服系统。
返回的消息举例如下
1
2
3
4
5
6
|
<xml>
<ToUserName><![CDATA[touser]]></ToUserName>
<FromUserName><![CDATA[fromuser]]></FromUserName>
<CreateTime>1399197672</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>
|
该消息的实现如下(以方倍工作室的微信公众平台PHP SDK为基础)
1
2
3
4
5
6
7
8
9
10
11
12
|
//回复多客服消息
private function transmitService( $object )
{
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
$result = sprintf( $xmlTpl , $object ->FromUserName, $object ->ToUserName, time());
return $result ;
}
|
二、触发多客服会话
一般情况下,用户想要咨询问题是,经常会问“你好”,“在吗”,这样的问题。
我们以这些词为触发关键词,当用户发送的文本消息内容中包含这些词的时候,就返回多客服消息给用户(用户在微信端感觉不到任何内容,但微信公众账号会将用户本次及以后一段时间的消息都转发到客服)。
实现代码如下:
1
2
3
4
5
6
7
8
9
|
//接收文本消息
private function receiveText( $object )
{
$keyword = trim( $object ->Content);
if ( strstr ( $keyword , "投诉" ) || strstr ( $keyword , "你好" ) || strstr ( $keyword , "在吗" )){
$result = $this ->transmitService( $object );
}
return $result ;
}
|
三、完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
<?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" => "/wp-content/uploads/202505/29/18571.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 = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf( $textTpl , $object ->FromUserName, $object ->ToUserName, time(), $content );
return $result ;
}
private function transmitNews( $object , $newsArray )
{
if (! is_array ( $newsArray )){
return ;
}
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "" ;
foreach ( $newsArray as $item ){
$item_str .= sprintf( $itemTpl , $item [ 'Title' ], $item [ 'Description' ], $item [ 'PicUrl' ], $item [ 'Url' ]);
}
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str </Articles>
</xml>";
$result = sprintf( $newsTpl , $object ->FromUserName, $object ->ToUserName, time(), count ( $newsArray ));
return $result ;
}
private function transmitMusic( $object , $musicArray )
{
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
$item_str = sprintf( $itemTpl , $musicArray [ 'Title' ], $musicArray [ 'Description' ], $musicArray [ 'MusicUrl' ], $musicArray [ 'HQMusicUrl' ]);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";
$result = sprintf( $textTpl , $object ->FromUserName, $object ->ToUserName, time());
return $result ;
}
//回复多客服消息
private function transmitService( $object )
{
$xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
$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);
}
}
}
?>
|
本段代码经过测试,在自定义菜单中返回多客服消息,无法让用户进入多客服状态,使用多客服消息后,后续所有消息在一段时间内都将作为客服消息转发,原来的开发模式下的自动回复都将失效。
本文写的不好,还望海涵,有好的意见欢迎分享,大家共同学习进步。同时,感谢大家一直以来对快网idc网站的支持。
相关文章
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-29 38
-
2025-06-04 43
-
2025-05-29 15
-
asp.net实现上传图片时判断图片的模式GRB或CMYK的方法
2025-05-29 44 -
2025-05-25 67