• 微信开发-回复消息


    前面写到我们怎样获取微信发送过来的xml数据包,获得用户发送的消息以及各种操作行为。那么我们应该怎样回复用户呢?

    回复主要分为六种

    ①回复文本消息

    XML结构是这样的,回复文字的时候如果保存的文本消息中有实体标签记得要用htmlspecialchars_decode转化一下。

    public function makeText($text='') 
        { 
            $CreateTime = time(); 
            $textTpl = "<xml> 
            <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> 
            <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> 
            <CreateTime>{$CreateTime}</CreateTime> 
            <MsgType><![CDATA[text]]></MsgType> 
            <Content><![CDATA[%s]]></Content> 
            </xml>"; 
            return sprintf($textTpl,$text); 
        }

    ②回复图片信息

    这是回复图片的XML结构,回复图片的media_id需要通过接口上传素材才能获得。

    public function makePic($MediaId='') 
        { 
            $CreateTime = time(); 
            $textTpl = "<xml> 
            <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> 
            <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> 
            <CreateTime>{$CreateTime}</CreateTime> 
            <MsgType><![CDATA[image]]></MsgType>
            <Image>
            <MediaId><![CDATA[%s]]></MediaId>
            </Image>
            </xml>"; 
            return sprintf($textTpl,$MediaId); 
        }

    ③回复语音

    回复语音的XML结构基本与图片类似,media_id也是通过接口上传素材获得的。

    public function makeVoice($MediaId=""){
            $CreateTime= time();
            $textTpl = "
            <xml>
            <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>
            <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>
            <CreateTime>{$CreateTime}</CreateTime>
            <MsgType><![CDATA[voice]]></MsgType>
            <Voice>
            <MediaId><![CDATA[%s]]></MediaId>
            </Voice>
            </xml>
            ";
            return sprintf($textTpl,$MediaId);
        }

     

    ④回复视频消息

    回复视频的XML结构,其中标题和描述并非是必须的,可以选择不写。

    public function makeVideo($mediaId="",$title="",$desc=""){
            $createtime=time();
            $textTpl="
                <xml>
                <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>
                <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>
                <CreateTime>{$createtime}</CreateTime>
                <MsgType><![CDATA[video]]></MsgType>
                <Video>
                <MediaId><![CDATA[%s]]></MediaId>
                <Title><![CDATA[%s]]></Title>
                <Description><![CDATA[%s]]></Description>
                </Video> 
                </xml>
            ";
            return sprintf($textTpl,$mediaId,$title,$desc);
        }

    如箭头所示,如果加了标题和描述就会显示在这里。如果有实体标签,也要转义一下,否则就直接输出实体标签了。

    ⑤回复音乐消息

    回复音乐的XML结构稍微有点多,但是很多不是必须的,如果填写了带实体标签的字符串,一定要转化一下。

    public function makeMusic($mediaId="",$title="",$desc="",$url="",$hqurl=""){
            $createtime=time();
            $textTpl="
                <xml>
                <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>
                <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>
                <CreateTime>{$createtime}</CreateTime>
                <MsgType><![CDATA[music]]></MsgType>
                <Music>
                <Title><![CDATA[%s]]></Title>
                <Description><![CDATA[%s]]></Description>
                <MusicUrl><![CDATA[%s]]></MusicUrl>
                <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
                <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
                </Music>
                </xml>
            ";
            return sprintf($textTpl,$title,$desc,$url,$hqurl,$mediaId);
        }

    回复音乐中其他的注释都很清楚,但是这个缩略图media_id描述的不是很清楚,作者使用了上传缩略图接口上传了图片,也写在了里面,但是貌似没什么用。如果有知道的童鞋们,还望告知下。

    ⑥回复图文消息

    回复图文在回复中的XML是最复杂的,也最容易出错。在Articles中的这段是最重要的,其中所有的字符串最好都转化一下,以防万一。

    public function makeNews($newsData=array()) 
        { 
            $CreateTime = time(); 
            $newTplHeader = "<xml> 
            <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> 
            <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> 
            <CreateTime>{$CreateTime}</CreateTime> 
            <MsgType><![CDATA[news]]></MsgType> 
            <ArticleCount>%s</ArticleCount><Articles>"; 
            $newTplItem = "<item> 
            <Title><![CDATA[%s]]></Title> 
            <Description><![CDATA[%s]]></Description> 
            <PicUrl><![CDATA[%s]]></PicUrl> 
            <Url><![CDATA[%s]]></Url> 
            </item>"; 
            $newTplFoot = "</Articles>
            </xml>"; 
            $Content = ''; 
            $itemsCount = count($newsData['items']);
            $itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条 
            if ($itemsCount) { 
                foreach ($newsData['items'] as $key => $item) { 
                    if ($key<=9) { 
                        $Content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']); 
                    } 
                } 
            } 
            $header = sprintf($newTplHeader,$itemsCount); 
            $footer = sprintf($newTplFoot); 
    
            return $header . $Content . $footer; 
        } 

    这个方法适合于回复所有类型的图文,只要传入一个数组就会拼接成要回复的图文模式,这个里面的字符串也是需要对实体标签解码的

    总之,无论微信返回什么,代码里的一点点小错误就会导致“该公众号暂时无法提供服务,请稍后再试”,而你根本不知道你做错了什么。所以写这个的时候要严谨,尽量避免小错误,可以节省大量的时间。

  • 相关阅读:
    每天两题02
    每天两题01
    简单看看原码、补码和反码
    简单看看java之枚举
    随意看看AtomicInteger类和CAS
    js原型链
    简单看看jdk7源码之Object和String
    简单学习js
    element的表单校验自动定位到该位置
    for循环使用element的折叠面板遇到的问题-3
  • 原文地址:https://www.cnblogs.com/lina520/p/6145189.html
Copyright © 2020-2023  润新知