Rumah > applet WeChat > pembangunan WeChat > 微信公众平台开发 多客服

微信公众平台开发 多客服

高洛峰
Lepaskan: 2017-02-24 17:05:30
asal
1749 orang telah melayarinya

在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统。

本文分为以下三个部分:

回复多客服消息

触发多客服会话

其他说明

 

一、回复多客服消息

在新的微信协议中,开发模式也可以接入客服系统。 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个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>

Salin selepas log masuk

该消息的实现如下

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;

    }

Salin selepas log masuk

二、触发多客服会话

一般情况下,用户想要咨询问题是,经常会问“你好”,“在吗”,这样的问题。

我们以这些词为触发关键词,当用户发送的文本消息内容中包含这些词的时候,就返回多客服消息给用户(用户在微信端感觉不到任何内容,但微信公众账号会将用户本次及以后一段时间的消息都转发到客服)。

实现代码如下:

1

2

3

4

5

6

7

8

9

10

//接收文本消息

    private function receiveText($object)

    {

        $keyword = trim($object->Content);

        if (strstr($keyword, "投诉") || strstr($keyword, "你好") || strstr($keyword, "在吗")){

            $result = $this->transmitService($object);

        }

 

        return $result;

    }

Salin selepas log masuk

三、完整代码

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

190

191

192

193

194

195

196

197

198

199

200

201

202

203

<!--?php

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 = "<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);

        }

    }

}

?>

Salin selepas log masuk

四、其他注意事项

1. 经测试,在自定义菜单中返回多客服消息,无法让用户进入多客服状态。 

2. 使用多客服消息后,后续所有消息在一段时间内都将作为客服消息转发,原来的开发模式下的自动回复都将失效!!!

更多微信公众平台开发 多客服相关文章请关注PHP中文网!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan