微信多客服
2015-12-18 17:15
549 查看
如何在没有接触过微信开发时在第三方添加多客服
看文档
动手
完
看了两篇前辈的文章:微信公众平台代码详解-php语言 &《微信公众平台入门到精通》Vol.9 以及 官方开发文档的DEMO_PHP,对微信的消息处理方式有了初步了解。然后看了多客服的文档以及大概扫了下微信公众平台开发(92) 多客服。
找到个文件有个私有方法reply,再看到下面注释有语音功能以及多图文什么的注释,没错就是它了。
第一条注释是我从代码里别处找来的,写文件,对于微信开发,不能直接输出,调试方法就只有在执行后查看日志文件了。第一个参数是写文件的路径,第二个是要写入文件的String(数组的话可以用serialize方法写),第三个是FILE_APPEND追加,其余用法不赘述。调试一直都用的它的=-=
这个reply里面处理了很多东西,所以直接来暴力的,直接到此函数底部,看到最后一句
返回了个什么鬼,先不去管。在返回前面加
这是第一次打出来的,上面有两三处错误。
1. MsgType不应该被赋值,而是应直接定为多客服的transfer_customer_service消息,sprintf里面也需要去掉最后一个参数
2.常规是应该直接返回$result xml,但是第三方不一样,查看了下,别的代码是如此
进行返回的。
所以正确写法应该是:
然后经过几次测试发送消息,多客服端终于有反应了。:)
但是有功能不能用,比如非链接的菜单,比如有个生成名片的应用到第三方程序的都不能用。肯定是我阻挡的哪个返回值。经测试,改成如下:
然后代码坚强的坚持了一天之后,我也不知怎么它就失效了,无论怎么发送消息再也无法触发到多客服。
所以继续用文件法debug,目前为止只改了这一个函数,对三方平台的架构还不了解,往上查询看什么地方调用了reply方法(=-=暴力的全局搜索)。最终锁定响应文件,主函数通过reply()函数返回值,然后list()之后再去调用response()函数:
在给公众号发送了几百条垃圾消息后><,两函数分别改成如下:
测试,还好。接着添加菜单[我要咨询]触发多客服这种事就很简单了。
看文档
动手
完
看文档
以前,只看过文档里面的一个接入指南。这次要加多客服看到是XML格式数据,不懂数据代表什么以及要怎么处理。先看文档的接收消息:<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
看了两篇前辈的文章:微信公众平台代码详解-php语言 &《微信公众平台入门到精通》Vol.9 以及 官方开发文档的DEMO_PHP,对微信的消息处理方式有了初步了解。然后看了多客服的文档以及大概扫了下微信公众平台开发(92) 多客服。
动手
第三方平台不好找啊,但找找肯定可以找到,先找消息处理。private function reply($data) { //file_put_contents("log2.txt",'咦,where is here?',FILE_APPEND); //语音功能 if (isset($data['MsgType'])) { if ('voice' == $data['MsgType']) { $data['Content'] = $data['Recognition']; $this->data['Content'] = $data['Recognition']; ....
找到个文件有个私有方法reply,再看到下面注释有语音功能以及多图文什么的注释,没错就是它了。
第一条注释是我从代码里别处找来的,写文件,对于微信开发,不能直接输出,调试方法就只有在执行后查看日志文件了。第一个参数是写文件的路径,第二个是要写入文件的String(数组的话可以用serialize方法写),第三个是FILE_APPEND追加,其余用法不赘述。调试一直都用的它的=-=
这个reply里面处理了很多东西,所以直接来暴力的,直接到此函数底部,看到最后一句
return $this->keyword($data['Content']);
返回了个什么鬼,先不去管。在返回前面加
if(!empty( $data )){ $xmlTpl = " <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> </xml>"; $result = sprintf($xmlTpl, $this->data['ToUserName'], $this->data['FromUserName'], time(),$this->data['MsgType']); return $result; }
这是第一次打出来的,上面有两三处错误。
1. MsgType不应该被赋值,而是应直接定为多客服的transfer_customer_service消息,sprintf里面也需要去掉最后一个参数
2.常规是应该直接返回$result xml,但是第三方不一样,查看了下,别的代码是如此
return array($result,'msgType');
进行返回的。
所以正确写法应该是:
if(!empty( $data )){ $xmlTpl = " <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[transfer_customer_service]]></MsgType> </xml>"; $result = sprintf($xmlTpl, $this->data['ToUserName'], $this->data['FromUserName'], time()); return array($result,'event'); }
然后经过几次测试发送消息,多客服端终于有反应了。:)
但是有功能不能用,比如非链接的菜单,比如有个生成名片的应用到第三方程序的都不能用。肯定是我阻挡的哪个返回值。经测试,改成如下:
$gaisidexx=$data['Content']; if($gaisidexx == '[xx]'){ return $this->keyword($data['Content']); } else{ //这里是上面的代码段 }
然后代码坚强的坚持了一天之后,我也不知怎么它就失效了,无论怎么发送消息再也无法触发到多客服。
所以继续用文件法debug,目前为止只改了这一个函数,对三方平台的架构还不了解,往上查询看什么地方调用了reply方法(=-=暴力的全局搜索)。最终锁定响应文件,主函数通过reply()函数返回值,然后list()之后再去调用response()函数:
list($content, $type) = $this->reply($data); $weixin->response($content, $type);
public function response($content, $type = 'text', $flag = 0){ $this -> data = array('ToUserName' => $this -> data['FromUserName'], 'FromUserName' => $this -> data['ToUserName'], 'CreateTime' => NOW_TIME, 'MsgType' => $type); $this -> $type($content); $this -> data['FuncFlag'] = $flag; $xml = new SimpleXMLElement('<xml></xml>'); ....
在给公众号发送了几百条垃圾消息后><,两函数分别改成如下:
//reply()底部代码段:在发送消息中包含'客服'关键词时候,就触发到多客服,不会影响到别的功能(除了关键词一样) if(strstr($data['Content'],'客服')){ $xmlTpl = " <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[transfer_customer_service]]></MsgType> </xml>"; $result = sprintf($xmlTpl, $this->data['ToUserName'], $this->data['FromUserName'], time()); return array($result,'xxxx');//经过别的函数会传送到response里面 }else { return $this->keyword($data['Content']); }
//response()顶部代码段 public function response($content, $type = 'text', $flag = 0){ if($type=='xxxx'){ $this -> data = array('ToUserName' => $this -> data['FromUserName'], 'FromUserName' => $this -> data['ToUserName'], 'CreateTime' => NOW_TIME, 'MsgType' =>'transfer_customer_service');//懒得弄变量,就直接把复制上来改MsgType }else { $this -> data = array('ToUserName' => $this -> data['FromUserName'], 'FromUserName' => $this -> data['ToUserName'], 'CreateTime' => NOW_TIME, 'MsgType' => $type); $this -> $type($content);//会调用别的函数,比如 function text($content); function music($content); function new($content),因为没有属于多客服的函数transfer_customer_service($content),所以在数组构造好了后就略过这步,继续构造完整xml } $this -> data['FuncFlag'] = $flag; $xml = new SimpleXMLElement('<xml></xml>');
测试,还好。接着添加菜单[我要咨询]触发多客服这种事就很简单了。
完
相关文章推荐
- QQ公众号如何正确接收消息并被动响应消息
- 微信分享到朋友圈or聊天列表
- PHP判断当前访问的是 微信、iphone、android 浏览器
- QQ公众号如何获取接口调用凭据
- OAuth2.0微信code获取失败怎么办
- QQ公众号接口使用要求
- 着手微信企业号的一些尝试
- CSDN博客QQ加群、微信
- 微信公众号菜单openid 点击菜单即可打开并登录微站
- Copy小程序
- 仿微信添加触摸图片阴影效果
- ios/iphone手机请求微信用户头像错位BUG及解决方法
- 微信公众平台下载多媒体文件
- 微信企业号接口调用
- 仿照微信首页下拉拍照的demo
- [微信开发五]--图文消息回复
- 微信开发四----实例代码分析
- 微信开发三---SAE服务器
- 微信开发开发者模式----微信开发二(2)
- 订阅号的编辑模式----微信开发二(1)