【php】微信公众帐号开发接口--消息回复

一、简介

微信公众平台提供了三种消息回复的格式,即文本回复、图文回复和音乐回复,在这里我想跟大家分享下自己的体会,以供读者使用。


二、文本回复

 文本回复xml 结构

  1. <xml>  
  2. <ToUserName><![CDATA[toUser]]></ToUserName>  
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>  
  4. <CreateTime>12345678</CreateTime>  
  5. <MsgType><![CDATA[text]]></MsgType>  
  6. <Content><![CDATA[content]]></Content>  
  7. </xml>  
说明:ToUserName表示接收消息方帐号,即发送请求消息的用户。填写的值是$fromUsername = $postObj->FromUserName


我们可以将该结构封装成函数,在需要回复文本的地方直接调用:

  1. function response_text($object,$content)  
  2. {  
  3.     $textTpl = "<xml>  
  4.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  5.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  6.                 <CreateTime>".time()."</CreateTime>  
  7.                 <MsgType><![CDATA[text]]></MsgType>  
  8.                 <Content><![CDATA[%s]]></Content>  
  9.                 <FuncFlag>%d</FuncFlag>  
  10.                 </xml>";  
  11.     $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, $content$flag);  
  12.     return $resultStr;  
  13. }  
说明:sprintf函数根据格式textTpl,依次输入参数。


实际程序调用上述函数

实现普通文本回复:

  1. public function handleText($postObj)  
  2. {  
  3.         $keyword = trim($postObj->Content);  
  4.    
  5.         if(!empty$keyword ))  
  6.         {  
  7.             $contentStr = "微信公众平台-普通文本回复功能源代码";  
  8.             $resultStr = _response_text($postObj,$contentStr);  
  9.             echo $resultStr;  
  10.         }else{  
  11.             echo "Input something...";  
  12.         }  
  13. }  
说明:trim 是为了去掉字符串首尾的空格

实现关注时回复:

  1. public function handleEvent($object)  
  2. {  
  3.         $from_MsgType = $object->Event;  
  4.         if ($from_MsgType == "subscribe")          
  5.         {   
  6.             $contentStr = "感谢您关注【你的帐号名】"."\n"."微信号:your account";  
  7.         }  
  8.          
  9.         $resultStr = _response_text($object$contentStr);  
  10.         return $resultStr;  
  11. }  
说明:"感谢您关注【你的帐号名】"."\n"."微信号:your account"。本行代码中插入了一个换行符,我们采用'.'拼接两个字符串

三、图文消息回复

图文回复xml 结构

  1. <xml>  
  2. <ToUserName><![CDATA[toUser]]></ToUserName>  
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>  
  4. <CreateTime>12345678</CreateTime>  
  5. <MsgType><![CDATA[news]]></MsgType>  
  6. <ArticleCount>1</ArticleCount>  
  7. <Articles>  
  8. <item>  
  9. <Title><![CDATA[title1]]></Title>  
  10. <Description><![CDATA[description1]]></Description>  
  11. <PicUrl><![CDATA[picurl]]></PicUrl>  
  12. <Url><![CDATA[url]]></Url>  
  13. </item>  
  14. </Articles>  
  15. <FuncFlag>0</FuncFlag>  
  16. </xml>  
说明:

ToUserName 接收方帐号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息创建时间 (整型)
MsgType news
可以看出,前四个参数与文本消息相同,不同之处在于MsgType 由text 变为news了。

ArticleCount 图文消息个数,限制为10条以内。此处为1,表示有单图文消息
Articles 多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
Title 图文消息标题
Description 图文消息描述
PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
Url 点击图文消息跳转链接

单图文消息

如果只是发送单图文消息,我们已经可以直接调用函数,传入参数即可实现首次关注发送单图文消息,完整代码如下:

  1. private function transmitNews($object$ArticleCount$Title,  
  2.             $Description$PicUrl$Url$flag = 0)  
  3. {  
  4.     $newsTpl = "<xml>  
  5.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                 <CreateTime>".time()."</CreateTime>  
  8.                 <MsgType><![CDATA[news]]></MsgType>  
  9.                 <ArticleCount>%s</ArticleCount>  
  10.                 <Articles>  
  11.                 <item>  
  12.                 <Title><![CDATA[%s]]></Title>  
  13.                 <Description><![CDATA[%s]]></Description>  
  14.                 <PicUrl><![CDATA[%s]]><PicUrl>  
  15.                 <Url><![CDATA[%s]]></Url>  
  16.                 </item>  
  17.                 </Articles>  
  18.                 <FuncFlag>%d</FuncFlag>  
  19.                 </xml>";      
  20.     $resultStr = sprintf($newsTpl$object->FromUserName,   
  21.         $object->ToUserName, $ArticleCount$Title$Description,   
  22.         $PicUrl$Url$flag);  
  23.     return $resultStr;        
  24. }  
具体步骤,请参考 青龙老贼的文章

多图文消息

多图文消息与单图文消息基本类似,在标签<item>...</item>之后在插入一个或者多个<item>...</item>。

在讨论多图文之前,我们先对单图文消息结构做一些变动。此时我们将消息结构分解为三层,头部,主体,尾部,如下所示:

  1. $newsTplHead = "<xml>  
  2.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  3.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  4.                 <CreateTime>%s</CreateTime>  
  5.                 <MsgType><![CDATA[news]]></MsgType>  
  6.                 <ArticleCount>2</ArticleCount>  
  7.                 <Articles>";  
  8. $newsTplBody1 = "<item>  
  9.                 <Title><![CDATA[%s]]></Title>  
  10.                 <Description><![CDATA[%s]]></Description>  
  11.                 <PicUrl><![CDATA[%s]]></PicUrl>  
  12.                 <Url><![CDATA[%s]]></Url>  
  13.                 </item>";  
  14.   
  15. $newsTplBody2 = "<item>  
  16.                 <Title><![CDATA[%s]]></Title>  
  17.                 <Description><![CDATA[%s]]></Description>  
  18.                 <PicUrl><![CDATA[%s]]></PicUrl>  
  19.                 <Url><![CDATA[%s]]></Url>  
  20.                 </item>";  
  21.   
  22. $newsTplFoot = "</Articles>   
  23.                 <FuncFlag>0</FuncFlag>   
  24.                 </xml>";  

此时,调用单图文消息函数可以修改为:
  1. //输出图文消息  
  2.     private function transmitSingalNews($object$newsContent)  
  3.     {  
  4.         $newsTplHead = "<xml>  
  5.                     <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                     <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                     <CreateTime>".time()."</CreateTime>  
  8.                     <MsgType><![CDATA[news]]></MsgType>  
  9.                     <ArticleCount>1</ArticleCount>  
  10.                     <Articles>";  
  11.         $newsTplBody = "    <item>  
  12.                     <Title><![CDATA[%s]]></Title>  
  13.                     <Description><![CDATA[%s]]></Description>  
  14.                     <PicUrl><![CDATA[%s]]><PicUrl>  
  15.                     <Url><![CDATA[%s]]></Url>  
  16.                     </item>";  
  17.         $newsTplFoot = "</Articles>  
  18.                     <FuncFlag>%d</FuncFlag>  
  19.                     </xml>";      
  20.           
  21.         //图文消息开头  
  22.         //$bodyCount = 1;  
  23.         $head = sprintf($newsTplHead$object->FromUserName, $object->ToUserName);  
  24.   
  25.         //图文消息内容  
  26.         $Title = $newsContent['Title'];  
  27.         $Description = $newsContent['Description'];  
  28.         $PicUrl = $newsContent['PicUrl'];  
  29.         $Url = $newsContent['Url'];  
  30.         $body = sprintf($newsTplBody$Title$Description$PicUrl$Url);  
  31.   
  32.         $FuncFlag = 0;  
  33.         $foot = sprintf($newsTplFoot$FuncFlag);  
  34.   
  35.         return $head.$body.$foot;         
  36.     }  

那么,只需要将newsContent数组设置为多维数组,循环载入数组参数值到newsTplBody中,即可实现自动回复单图文消息

稍作改动即可实现多图文消息,如下所示:

  1. //输出多图文消息  
  2.     private function transmitMultiNews($object$newsContent)  
  3.     {  
  4.         $newsTplHead = "<xml>  
  5.                     <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                     <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                     <CreateTime>".time()."</CreateTime>  
  8.                     <MsgType><![CDATA[news]]></MsgType>  
  9.                     <ArticleCount>%d</ArticleCount>  
  10.                     <Articles>";  
  11.         $newsTplBody = "<item>  
  12.                     <Title><![CDATA[%s]]></Title>  
  13.                     <Description><![CDATA[%s]]></Description>  
  14.                     <PicUrl><![CDATA[%s]]></PicUrl>  
  15.                     <Url><![CDATA[%s]]></Url>  
  16.                     </item>";  
  17.         $newsTplFoot = "</Articles>  
  18.                     <FuncFlag>%d</FuncFlag>  
  19.                     </xml>";      
  20.         //图文消息开头  
  21.         $bodyCount = count($newsContent);  
  22.         $head = sprintf($newsTplHead$object->FromUserName, $object->ToUserName,  
  23.                         $bodyCount);  
  24.   
  25.         //图文消息主要内容  
  26.         foreach ($newsContent as $key=>$value)  
  27.         {  
  28.             $body.=sprintf($newsTplBody$value['Title'], $value['Description'],  
  29.                         $value['PicUrl'], $value['Url']);  
  30.         }  
  31.   
  32.         $FuncFlag = 0;  
  33.         $foot = sprintf($newsTplFoot$FuncFlag);  
  34.   
  35.         return $head.$body.$foot;         
  36.           
  37.     }  

我们采用foreeach语句对数组遍历。
foreach()有两种用法:

  1. 1: foreach(array_name as $value)    {       
  2.   
  3. statement;    
  4.   
  5. }  

这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。

例如,foreach($newsContent as $value)即表示将数组$newsContent的值赋给$value,从而我们可以在sprintf函数中引用变量$value向消息模板$newsTplBody传值。

  1. 2:foreach(array_name as $key => $value)    {       
  2.   
  3.   statement;      
  4.   
  5. }   

这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如newsContent['Title']= 'String'中的“TItle”

猜你喜欢

转载自blog.csdn.net/czh0423/article/details/53392948
今日推荐