您的位置:首页 > 移动开发 > 微信开发

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

2016-11-29 15:08 645 查看

一、简介

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

二、文本回复

 文本回复xml 结构

[php]
view plain
copy





<xml>  
<ToUserName><![CDATA[toUser]]></ToUserName>  
<FromUserName><![CDATA[fromUser]]></FromUserName>  
<CreateTime>12345678</CreateTime>  
<MsgType><![CDATA[text]]></MsgType>  
<Content><![CDATA[content]]></Content>  
</xml>  

说明:ToUserName表示接收消息方帐号,即发送请求消息的用户。填写的值是$fromUsername = $postObj->FromUserName

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

[php]
view plain
copy





function response_text($object,$content)  
{  
    $textTpl = "<xml>  
                <ToUserName><![CDATA[%s]]></ToUserName>  
                <FromUserName><![CDATA[%s]]></FromUserName>  
                <CreateTime>".time()."</CreateTime>  
                <MsgType><![CDATA[text]]></MsgType>  
                <Content><![CDATA[%s]]></Content>  
                <FuncFlag>%d</FuncFlag>  
                </xml>";  
    $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, $content, $flag);  
    return $resultStr;  
}  

说明:sprintf函数根据格式textTpl,依次输入参数。

实际程序调用上述函数

实现普通文本回复:

[php]
view plain
copy





public function handleText($postObj)  
{  
        $keyword = trim($postObj->Content);  
   
        if(!empty( $keyword ))  
        {  
            $contentStr = "微信公众平台-普通文本回复功能源代码";  
            $resultStr = _response_text($postObj,$contentStr);  
            echo $resultStr;  
        }else{  
            echo "Input something...";  
        }  
}  

说明:trim 是为了去掉字符串首尾的空格

实现关注时回复:

[php]
view plain
copy





public function handleEvent($object)  
{  
        $from_MsgType = $object->Event;  
        if ($from_MsgType == "subscribe")          
        {   
            $contentStr = "感谢您关注【你的帐号名】"."\n"."微信号:your account";  
        }  
         
        $resultStr = _response_text($object, $contentStr);  
        return $resultStr;  
}  

说明:"感谢您关注【你的帐号名】"."\n"."微信号:your account"。本行代码中插入了一个换行符,我们采用'.'拼接两个字符串

三、图文消息回复

图文回复xml 结构

[php]
view plain
copy





<xml>  
<ToUserName><![CDATA[toUser]]></ToUserName>  
<FromUserName><![CDATA[fromUser]]></FromUserName>  
<CreateTime>12345678</CreateTime>  
<MsgType><![CDATA[news]]></MsgType>  
<ArticleCount>1</ArticleCount>  
<Articles>  
<item>  
<Title><![CDATA[title1]]></Title>  
<Description><![CDATA[description1]]></Description>  
<PicUrl><![CDATA[picurl]]></PicUrl>  
<Url><![CDATA

" target=_blank>]></Url>  
</item>  
</Articles>  
<FuncFlag>0</FuncFlag>  
</xml>  

说明:

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

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

单图文消息

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

[php]
view plain
copy [url=https://code.csdn.net/snippets/171487]

[url=https://code.csdn.net/snippets/171487/fork]



private function transmitNews($object, $ArticleCount, $Title,  
            $Description, $PicUrl, $Url, $flag = 0)  
{  
    $newsTpl = "<xml>  
                <ToUserName><![CDATA[%s]]></ToUserName>  
                <FromUserName><![CDATA[%s]]></FromUserName>  
                <CreateTime>".time()."</CreateTime>  
                <MsgType><![CDATA[news]]></MsgType>  
                <ArticleCount>%s</ArticleCount>  
                <Articles>  
                <item>  
                <Title><![CDATA[%s]]></Title>  
                <Description><![CDATA[%s]]></Description>  
                <PicUrl><![CDATA[%s]]><PicUrl>  
                <Url><![CDATA[%s]]></Url>  
                </item>  
                </Articles>  
                <FuncFlag>%d</FuncFlag>  
                </xml>";      
    $resultStr = sprintf($newsTpl, $object->FromUserName,   
        $object->ToUserName, $ArticleCount, $Title, $Description,   
        $PicUrl, $Url, $flag);  
    return $resultStr;        
}  

具体步骤,请参考青龙老贼的文章

多图文消息

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

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

[php]
view plain
copy





$newsTplHead = "<xml>  
                <ToUserName><![CDATA[%s]]></ToUserName>  
                <FromUserName><![CDATA[%s]]></FromUserName>  
                <CreateTime>%s</CreateTime>  
                <MsgType><![CDATA[news]]></MsgType>  
                <ArticleCount>2</ArticleCount>  
                <Articles>";  
$newsTplBody1 = "<item>  
                <Title><![CDATA[%s]]></Title>  
                <Description><![CDATA[%s]]></Description>  
                <PicUrl><![CDATA[%s]]></PicUrl>  
                <Url><![CDATA[%s]]></Url>  
                </item>";  
  
$newsTplBody2 = "<item>  
                <Title><![CDATA[%s]]></Title>  
                <Description><![CDATA[%s]]></Description>  
                <PicUrl><![CDATA[%s]]></PicUrl>  
                <Url><![CDATA[%s]]></Url>  
                </item>";  
  
$newsTplFoot = "</Articles>   
                <FuncFlag>0</FuncFlag>   
                </xml>";  

此时,调用单图文消息函数可以修改为:

[php]
view plain
copy





//输出图文消息  
    private function transmitSingalNews($object, $newsContent)  
    {  
        $newsTplHead = "<xml>  
                    <ToUserName><![CDATA[%s]]></ToUserName>  
                    <FromUserName><![CDATA[%s]]></FromUserName>  
                    <CreateTime>".time()."</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>%d</FuncFlag>  
                    </xml>";      
          
        //图文消息开头  
        //$bodyCount = 1;  
        $head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName);  
  
        //图文消息内容  
        $Title = $newsContent['Title'];  
        $Description = $newsContent['Description'];  
        $PicUrl = $newsContent['PicUrl'];  
        $Url = $newsContent['Url'];  
        $body = sprintf($newsTplBody, $Title, $Description, $PicUrl, $Url);  
  
        $FuncFlag = 0;  
        $foot = sprintf($newsTplFoot, $FuncFlag);  
  
        return $head.$body.$foot;         
    }  

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

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

[php]
view plain
copy





//输出多图文消息  
    private function transmitMultiNews($object, $newsContent)  
    {  
        $newsTplHead = "<xml>  
                    <ToUserName><![CDATA[%s]]></ToUserName>  
                    <FromUserName><![CDATA[%s]]></FromUserName>  
                    <CreateTime>".time()."</CreateTime>  
                    <MsgType><![CDATA[news]]></MsgType>  
                    <ArticleCount>%d</ArticleCount>  
                    <Articles>";  
        $newsTplBody = "<item>  
                    <Title><![CDATA[%s]]></Title>  
                    <Description><![CDATA[%s]]></Description>  
                    <PicUrl><![CDATA[%s]]></PicUrl>  
                    <Url><![CDATA[%s]]></Url>  
                    </item>";  
        $newsTplFoot = "</Articles>  
                    <FuncFlag>%d</FuncFlag>  
                    </xml>";      
        //图文消息开头  
        $bodyCount = count($newsContent);  
        $head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName,  
                        $bodyCount);  
  
        //图文消息主要内容  
        foreach ($newsContent as $key=>$value)  
        {  
            $body.=sprintf($newsTplBody, $value['Title'], $value['Description'],  
                        $value['PicUrl'], $value['Url']);  
        }  
  
        $FuncFlag = 0;  
        $foot = sprintf($newsTplFoot, $FuncFlag);  
  
        return $head.$body.$foot;         
          
    }  

我们采用foreeach语句对数组遍历。

foreach()有两种用法:

[php]
view plain
copy





1: foreach(array_name as $value)    {       
  
statement;    
  
}  

这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
例如,foreach($newsContent as $value)即表示将数组$newsContent的值赋给$value,从而我们可以在sprintf函数中引用变量$value向消息模板$newsTplBody传值。

[php]
view plain
copy





2:foreach(array_name as $key => $value)    {       
  
  statement;      
  
}   

这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如newsContent['Title']= 'String'中的“TItle”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐