1. 소개
WeChat 공개 플랫폼은 문자 답장, 음악 답장, 이미지 답장의 세 가지 메시지 답장 형식을 제공합니다. reply, 이 기사에서는 이 세 가지 메시지 응답의 형식을 간략하게 설명한 다음 독자가 사용할 수 있도록 함수로 캡슐화할 것입니다.
2. 아이디어 분석
개발자는 각 POST 요청에 대해 응답 패키지에 특정 xml 구조를 반환합니다. , 메시지에 응답합니다(이제 응답 텍스트, 그래픽, 음성, 비디오, 음악 지원).
3. 텍스트 답글
3.1 텍스트 답글 xml 구조
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[content]]></Content> </xml>
3.2 구조 설명
3.3 구체적인 구현
위에 주어진 xml 구조의 경우 해당 위치의 내용만 채우고 형식을 지정하면 됩니다. 출력입니다.
설명:
ToUserName은 $fromUsername = $postObj->FromUserName으로 채워져 메시지를 반환합니다. 메시지를 보낸 사용자가 수신자의 계정입니다.
FromUserName은 개발자의 WeChat 계정인 $toUsername = $postObj->ToUserName으로 채워집니다.
이것은 공식 텍스트 응답입니다. "Welcome to wechat world!" 메시지에 응답하려면 responseMsg() 메서드를 인스턴스화하세요.
여기서는 독자가 위 지침을 쉽게 이해할 수 있도록 약간 수정하여 fromUsername 및 toUsername 메시지를 반환합니다.
3.4 테스트 결과
3.5 호출 가능한 함수로 캡슐화
위의 내용을 넣을 수 있습니다. 내용은 함수로 캡슐화되어 있어 응답 텍스트가 필요한 곳에 직접 호출할 수 있어 편리하고 간결합니다. responseText.func.inc.php의 코드는 다음과 같습니다.
function _response_text($object,$content){ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%d</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag); return $resultStr; }
이런 방법으로 $object 및 $content를 전달한 다음 텍스트에 응답해야 하는 파일을 파일에 삽입하고 _response_text() 메서드를 호출하면 바로 응답할 수 있습니다. 텍스트.
3.6 테스트 코드
3.6.1 메인 파일에 답글 텍스트 기능 파일 도입
require_once 'responseText.func.inc.php';
3.6.2 일반 메시지 답장
public function handleText($postObj) { $keyword = trim($postObj->Content); if(!empty( $keyword )) { $contentStr = "微信公众平台-文本回复功能源代码"; //$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); $resultStr = _response_text($postObj,$contentStr); echo $resultStr; }else{ echo "Input something..."; } }
3.6.3
public function handleEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"; break; default : $contentStr = "Unknow Event: ".$object->Event; break; } $resultStr = _response_text($object, $contentStr); return $resultStr; }
팔로우 시 답장하기3.7 테스트 결과
성공적으로 문자 답장을 보내세요.
4. 그래픽 댓글
4.1 그래픽 댓글 xml 구조
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> <item> <Title><![CDATA[title]]></Title> <Description><![CDATA[description]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> </Articles> </xml>
4.2 구조 설명
텍스트 답장 형식과 유사하게 해당 위치에 해당 내용을 채워넣기만 하면 그래픽 메시지에 답할 수 있습니다.
4.3 구체적인 구현
이미지-텍스트 응답은 단일 이미지-텍스트일 수도 있고 여러 이미지-텍스트일 수도 있습니다. 여기서는 먼저 단일 이미지-텍스트 사례를 사용하여 독자를 안내한 다음 소개합니다. 다중 이미지 텍스트 .
이미지와 텍스트 응답의 xml 구조를 이미지와 텍스트 헤더, 이미지와 텍스트 본문, 이미지와 텍스트 본문이 제목인 세 가지 구조로 분해합니다. , 설명, 이미지에 답글을 달 때 표시되는 이미지 URL과 원본 URL입니다.
$newsTplHead = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>1</ArticleCount> <Articles>"; $newsTplBody = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $newsTplFoot = "</Articles> <FuncFlag>0</FuncFlag> </xml>";
다음으로 해당 콘텐츠를 세 가지 구조에 삽입합니다:
A.$newsTplHead
$header = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName, time());
B.$newsTplBody
$title = $newsContent['title']; $desc = $newsContent['description']; $picUrl = $newsContent['picUrl']; $url = $newsContent['url']; $body = sprintf($newsTplBody, $title, $desc, $picUrl, $url);
설명: $newsContent는 기본 파일에서 함수로 전달된 이미지 및 텍스트 배열입니다.
C. $newsTplFoot
$FuncFlag = 0; $footer = sprintf($newsTplFoot, $FuncFlag);
그런 다음 세 문단을 연결하여 단일 이미지와 텍스트에 답글을 달 수 있습니다.
return $header.$body.$footer;
다음 호출 테스트를 위해 위 내용을 함수에 작성하고 이름을 _response_news() 함수로 지정합니다.
4.4 테스트 코드
4.4.1 메인 파일의 이미지와 텍스트에 응답하기 위한 함수 파일 소개
require_once 'responseNews.func.inc.php';
4.4.2 배열을 생성하고 전달
메인 파일에서는 배열과 $postObj만 _response_news() 함수에 전달하면 됩니다.
$record=array( 'title' =>'山塘街', 'description' =>'山塘街东起阊门渡僧桥,西至苏州名胜虎丘山的望山桥,长约七里,所以苏州俗语说“七里山塘到虎丘”...', 'picUrl' => 'http://thinkshare.duapp.com/images/suzhou.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000046&itemidx=1&sign=9e7707d5615907d483df33ee449b378d#wechat_redirect' ); $resultStr = _response_news($postObj,$record); echo $resultStr;
4.5 测试结果
点击进入查看
单图文回复测试成功。
4.6 多图文回复
有了上面的引导,读者应该能够想到回复多图文的思路了,就是将多维数组中的值循环放到相应的位置,然后拼接起来就可以了,下面进行讲解。
4.6.1 获取图文条数
$bodyCount = count($newsContent);
4.6.2 判断图文条数
因为微信限制了回复的图文消息数为10条以内,所以需要判断图文条数,如果小于10条,则图文数等于原来的图文数,如果大于等于10条,则强制限制为10条。
$bodyCount = $bodyCount < 10 ? $bodyCount : 10;
4.6.3 组织图文体
图文头和图文尾和上面单图文一样,不再赘述,主要是图文体的组织。
用foreach 循环出数组的内容并赋予图文体,并进行拼接:
foreach($newsContent as $key => $value){ $body .= sprintf($newsTplBody, $value['title'], $value['description'], $value['picUrl'], $value['url']); }
说明:$newsContent 是从主文件传入函数的图文数组。
4.6.4 拼接并返回
return $header.$body.$footer;
将以上内容写到一个函数里,命名为 _response_multiNews() 函数,以供下面调用测试。
4.7 测试多图文
4.7.1 在主文件中引入回复多图文的函数文件
require_once 'responseMultiNews.func.inc.php';
4.7.2 创建多维数组并传入
$record[0]=array( 'title' =>'观前街', 'description' =>'观前街位于江苏苏州市区,是成街于清朝时期的百年商业老街,街上老店名店云集,名声远播海内外...', 'picUrl' => 'http://joythink.duapp.com/images/suzhou.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000052&itemidx=1&sign=90518631fd3e85dd1fde7f77c04e44d5#wechat_redirect' ); ...... $record[11]=array( 'title' =>'平江路', 'description' =>'平江路位于苏州古城东北,是一条傍河的小路,北接拙政园,南眺双塔,全长1606米,是苏州一条历史攸久的经典水巷。宋元时候苏州又名平江,以此名路...', 'picUrl' => 'http://joythink.duapp.com/images/suzhouScenic/pingjianglu.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000056&itemidx=1&sign=ef18a26ce78c247f3071fb553484d97a#wechat_redirect' ); $resultStr = _response_multiNews($postObj,$record); echo $resultStr;
4.8 测试多图文结果
点击进入查看
测试多图文成功。
五、音乐回复
微信还提供了一种消息回复的格式,即音乐回复,下面我们编写程序测试一下。
注意:由于音乐版权的问题,现在很少有回复音乐的API,开放的API 查询出来的音乐信息也有很多是不正确的。所以在这里,我们上传几首音乐到自己的服务器空间测试。
本地文件:
测试是否能够正常播放:
5.1 音乐回复xml 结构
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[TITLE]]></Title> <Description><![CDATA[DESCRIPTION]]></Description> <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl> <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl> </Music> </xml>
5.2 结构说明
5.3 具体实施
我们先做一个固定的歌曲回复来引导读者,然后再引出更高级别的歌曲查询回复。
5.3.1 在xml 结构的相应位置插入相应数据
<Music> <Title><![CDATA[Far Away From Home]]></Title> <Description><![CDATA[Groove Coverage]]></Description> <MusicUrl><![CDATA[http://thinkshare.duapp.com/music/10001.mp3]]></MusicUrl> <HQMusicUrl><![CDATA[http://thinkshare.duapp.com/music/10001.mp3]]></HQMusicUrl> </Music>
5.3.2 测试代码
$resultStr = _response_music($postObj,$keyword);echo $resultStr;
5.3.3 测试结果
5.4 模拟点歌
有了上面的简单案例引导,读者应该可以想到模拟点歌的具体实现了吧,下面就来简单介绍一下。
思路:将歌曲代码和对应的歌曲名存入数据库,用户输入歌曲名,在数据库中找到歌曲名对应的歌曲编号,然后就可以生成MusicUrl 回复用户了。
5.4.1 创建数据库
建表语句及数据文件:
CREATE TABLE IF NOT EXISTS `tbl_music` ( `music_id` int(11) NOT NULL, `music_name` varchar(40) NOT NULL, `music_singer` varchar(40) NOT NULL, `music_lrc` text NOT NULL, PRIMARY KEY (`music_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `tbl_music` (`music_id`, `music_name`, `music_singer`, `music_lrc`) VALUES(10001, 'Far Away From Home', 'Groove Coverage', 'far away from home'), (10002, 'The Dawn', 'Dreamtale', 'the dawn'), (20002, '董小姐', '宋冬野', '董小姐'), (20001, '左边', '杨丞琳', '左边');
5.4.2 _response_music() 函数编写
A. 引入数据库操作文件
require_once('mysql_bae.func.php');
B. 数据库操作及数据处理
$query = "SELECT * FROM tbl_music WHERE music_name LIKE '%$musicKeyword%'"; $result = _select_data($query); $rows = mysql_fetch_array($result, MYSQL_ASSOC); $music_id = $rows[music_id];
注: $musicKeyword 为从主文件传入的歌曲名关键字,这里使用模糊查询,只取第一条数据。
C. 判断是否查询到
if($music_id <> '') { $music_name = $rows[music_name]; $music_singer = $rows[music_singer]; $musicUrl = "http://thinkshare.duapp.com/music/".$music_id.".mp3"; $HQmusicUrl = "http://thinkshare.duapp.com/music/".$music_id.".mp3"; $resultStr = sprintf($musicTpl, $object->FromUserName, $object->ToUserName, time(), $music_name, $music_singer, $musicUrl, $HQmusicUrl); return $resultStr; }else{ return ""; }
说明:如果查询到歌曲信息,按照xml 结构返回数据;如果未查询到,则返回空,用于主文件判断。
将以上代码封装成 _response_music() 函数并保存为responseMusic.func.inc.php 文件供主文件调用。
5.4.3 测试代码
A. 引入回复音乐和回复文本的函数文件
//引入回复音乐的函数文件require_once 'responseMusic.func.inc.php';//引入回复文本的函数文件require_once 'responseText.func.inc.php';
B. 调用
if(!empty( $keyword )) { $resultStr = _response_music($postObj,$keyword); if($resultStr <> '') { echo $resultStr; }else { echo _response_text($postObj,"未查询到【".$keyword."】的歌曲信息!"); } }
说明:如果查询到歌曲信息,则返回所得信息,如果未查询到,则调用 _response_text() 函数返回文本信息。
5.5 模拟点歌测试
回复音乐测试成功。
更多WeChat 공개 플랫폼 개발 메시지 응답 요약 및 소개相关文章请关注PHP中文网!