PHP微信公众平台开发 - 消息回复的封装_PHP教程
【PHP微信公众平台开发系列】
01.配置微信接口
02.公众平台示例代码分析
03.订阅事件(subscribe)处理
04.简单回复功能开发
05.天气预报功能开发
06.翻译功能开发
07.聊天机器人功能开发
08.自定义菜单功能
09.数据库操作
10.消息回复的封装
本文地址:http://www.phpchina.com/archives/view-43418-1.html
本系列由PHPChina特邀作者@David_Tang供稿,转载请注明作者信息与本文地址。
一、简介
微信公众平台提供了三种消息回复的格式,即文本回复、音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用。
二、思路分析
对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本、图文、语音、视频、音乐)。
三、文本回复
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 位置上填写的是$toUsername = $postObj->ToUserName,既是开发者微信号。
这是官方的文本回复,只需实例化它的responseMsg() 方法就可以回复 “Welcome to wechat world!” 消息了。
这里我们稍做修改,返回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.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 创建数组并传入
在主文件中,只需要向 _response_news() 函数中传入一个数组和$postObj 即可。

$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 创建数据库

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。
