接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

请注意:

1、关于重试的消息排重,推荐使用msgid排重。

2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,

可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。

3、如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息-被动回复消息”接口向用户被动回复消息时,可以在

公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服

接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。

各消息类型的推送XML数据包结构如下:

文本消息

<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[text]]></MsgType>

 <Content><![CDATA[this is a test]]></Content>

 <MsgId>1234567890123456</MsgId>

 </xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType text

Content 文本消息内容

MsgId 消息id,64位整型

使用网页调试工具调试该接口

图片消息

<xml>

 <ToUserName><![CDATA[toUser]]></ToUserName>

 <FromUserName><![CDATA[fromUser]]></FromUserName>

 <CreateTime>1348831860</CreateTime>

 <MsgType><![CDATA[image]]></MsgType>

 <PicUrl><![CDATA[this is a url]]></PicUrl>

 <MediaId><![CDATA[media_id]]></MediaId>

 <MsgId>1234567890123456</MsgId>

 </xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType image

PicUrl 图片链接(由系统生成)

MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

MsgId 消息id,64位整型

使用网页调试工具调试该接口

语音消息

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1357290913</CreateTime>

<MsgType><![CDATA[voice]]></MsgType>

<MediaId><![CDATA[media_id]]></MediaId>

<Format><![CDATA[Format]]></Format>

<MsgId>1234567890123456</MsgId>

</xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType 语音为voice

MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。

Format 语音格式,如amr,speex等

MsgID 消息id,64位整型

使用网页调试工具调试该接口


请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1357290913</CreateTime>

<MsgType><![CDATA[voice]]></MsgType>

<MediaId><![CDATA[media_id]]></MediaId>

<Format><![CDATA[Format]]></Format>

<Recognition><![CDATA[腾讯微信团队]]></Recognition>

<MsgId>1234567890123456</MsgId>

</xml>

参数说明:

参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType 语音为voice

MediaID 语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体

Format 语音格式:amr

Recognition 语音识别结果,UTF8编码

MsgID 消息id,64位整型

视频消息

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1357290913</CreateTime>

<MsgType><![CDATA[video]]></MsgType>

<MediaId><![CDATA[media_id]]></MediaId>

<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>

<MsgId>1234567890123456</MsgId>

</xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType 视频为video

MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。

ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

MsgId 消息id,64位整型

使用网页调试工具调试该接口

小视频消息

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1357290913</CreateTime>

<MsgType><![CDATA[shortvideo]]></MsgType>

<MediaId><![CDATA[media_id]]></MediaId>

<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>

<MsgId>1234567890123456</MsgId>

</xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType 小视频为shortvideo

MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。

ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

MsgId 消息id,64位整型

使用网页调试工具调试该接口

地理位置消息

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1351776360</CreateTime>

<MsgType><![CDATA[location]]></MsgType>

<Location_X>23.134521</Location_X>

<Location_Y>113.358803</Location_Y>

<Scale>20</Scale>

<Label><![CDATA[位置信息]]></Label>

<MsgId>1234567890123456</MsgId>

</xml>


参数 描述

ToUserName 开发者微信号

FromUserName 发送方帐号(一个OpenID)

CreateTime 消息创建时间 (整型)

MsgType location

Location_X 地理位置维度

Location_Y 地理位置经度

Scale 地图缩放大小

Label 地理位置信息

MsgId 消息id,64位整型

使用网页调试工具调试该接口

链接消息

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1351776360</CreateTime>

<MsgType><![CDATA[link]]></MsgType>

<Title><![CDATA[公众平台官网链接]]></Title>

<Description><![CDATA[公众平台官网链接]]></Description>

<Url><![CDATA[url]]></Url>

<MsgId>1234567890123456</MsgId>

</xml>


参数 描述

ToUserName 接收方微信号

FromUserName 发送方微信号,若为普通用户,则是一个OpenID

CreateTime 消息创建时间

MsgType 消息类型,link

Title 消息标题

Description 消息描述

Url 消息链接

MsgId 消息id,64位整型



<?php

/**

  * wechat php test

  */


//define your token

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();

// $wechatObj->valid();

$wechatObj->index();


class wechatCallbackapiTest

{


    public function index(){

        if(isset($_GET['echostr'])) {

            $this->valid();

        } else {

            $this->responseMsg();

        }

    }


    public function valid()

    {

        $echoStr = $_GET["echostr"];


        //valid signature , option

        if($this->checkSignature()){

            echo $echoStr;

            exit;

        }

    }


    public function responseMsg()

    {

        //get post data, May be due to the different environments

        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];


        //extract post data

        if (!empty($postStr)){

                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,

                   the best way is to check the validity of xml by yourself */

                libxml_disable_entity_loader(true);

                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

                $fromUsername = $postObj->FromUserName;

                $toUsername = $postObj->ToUserName;

                $keyword = trim($postObj->Content);

                $type = $postObj->MsgType;

                $time = time();

                $textTpl = "<xml>

                            <ToUserName><![CDATA[%s]]></ToUserName>

                            <FromUserName><![CDATA[%s]]></FromUserName>

                            <CreateTime>%s</CreateTime>

                            <MsgType><![CDATA[%s]]></MsgType>

                            <Content><![CDATA[%s]]></Content>

                            <FuncFlag>0</FuncFlag>

                            </xml>";  


                $imgTpl = "<xml>

                            <ToUserName><![CDATA[%s]]></ToUserName>

                            <FromUserName><![CDATA[%s]]></FromUserName>

                            <CreateTime>%s</CreateTime>

                            <MsgType><![CDATA[%s]]></MsgType>

                            <Image>

                            <MediaId><![CDATA[%s]]></MediaId>

                            </Image>

                            </xml>"; 


                $voiceTpl = "<xml>

                                <ToUserName><![CDATA[%s]]></ToUserName>

                                <FromUserName><![CDATA[%s]]></FromUserName>

                                <CreateTime>%s</CreateTime>

                                <MsgType><![CDATA[%s]]></MsgType>

                                <Voice>

                                <MediaId><![CDATA[%s]]></MediaId>

                                </Voice>

                                </xml>";

                $videoTpl = "<xml>

                            <ToUserName><![CDATA[%s]]></ToUserName>

                            <FromUserName><![CDATA[%s]]></FromUserName>

                            <CreateTime>%s</CreateTime>

                            <MsgType><![CDATA[%s]]></MsgType>

                            <Video>

                            <MediaId><![CDATA[%s]]></MediaId>

                            <Title><![CDATA[%s]]></Title>

                            <Description><![CDATA[%s]]></Description>

                            </Video> 

                            </xml>

                            ";

            $musicTpl = "<xml>

                        <ToUserName><![CDATA[%s]]></ToUserName>

                        <FromUserName><![CDATA[%s]]></FromUserName>

                        <CreateTime>%s</CreateTime>

                        <MsgType><![CDATA[%s]]></MsgType>

                        <Music>

                        <Title><![CDATA[%s]]></Title>

                        <Description><![CDATA[%s]]></Description>

                        <MusicUrl><![CDATA[%s]]></MusicUrl>

                        <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>

                        <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>

                        </Music>

                        </xml>

                        ";


                $newsTpl = "<xml>

                        <ToUserName><![CDATA[%s]]></ToUserName>

                        <FromUserName><![CDATA[%s]]></FromUserName>

                        <CreateTime>%s</CreateTime>

                        <MsgType><![CDATA[%s]]></MsgType>

                        <ArticleCount>2</ArticleCount>

                        <Articles>

                        <item>

                        <Title><![CDATA[%s]]></Title> 

                        <Description><![CDATA[%s]]></Description>

                        <PicUrl><![CDATA[%s]]></PicUrl>

                        <Url><![CDATA[%s]]></Url>

                        </item>

                        <item>

                        <Title><![CDATA[%s]]></Title>

                        <Description><![CDATA[%s]]></Description>

                        <PicUrl><![CDATA[%s]]></PicUrl>

                        <Url><![CDATA[%s]]></Url>

                        </item>

                        </Articles>

                        </xml>";


                if($type == 'text') {

                        $picurl = 'http://i3.mifile.cn/a4/T1UQAgB7_v1RXrhCrK.jpg';


                       $echo  = sprintf($newsTpl,$fromUsername,$toUsername,$time,'news','title1','description1',$picurl,'http://baidu.com','title2','description2',$picurl,'http://taikr.com');




                    // if ($keyword == 1) {

                        // $musicUrl = 'http://sc.111ttt.com/up/mp3/161940/AAA1CD69EBEED018C3AC9CE6CCB8C3B3.mp3';

                        // $media_id = '7Wn1YzkjjNMJ-ZFIUbbQjItbMi6zVzlKoCdvRpkZYSg8yew5yV8yCe8QRx4X4NAR';

                        //     $echo = sprintf($musicTpl,$fromUsername,$toUsername,$time,'music','音乐标题','音乐描述',$musicUrl,$musicUrl,$media_id);

                        // } else {

                        //     $str = '你发送的是文本消息' . $keyword;

                        //      $MsgType = 'text';

                        //      $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);

                        // }



                  

                } else if ($type == 'image'){

                    $MsgType = 'image';


                    $media_id = '7Wn1YzkjjNMJ-ZFIUbbQjItbMi6zVzlKoCdvRpkZYSg8yew5yV8yCe8QRx4X4NAR';

                    $media_id = $postObj->MediaId;

                    $echo = sprintf($imgTpl,$fromUsername,$toUsername,$time,$MsgType,$media_id);

                    

                } else if ($type == 'voice') {

                

                    $str = $postObj->Recognition;

                     $str = '你说话的语音识别结果是' . $postObj->Recognition;

                    $MsgType = 'text';

                     $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);


                } else if ($type == 'video') {

                    $str = '你发送的是视频消息,Id是' . $postObj->MediaId;

                    $MsgType = 'text';

                     $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);

                   // $MsgType = 'video';

                   // $title = '视频标题';

                   // $desc = '视频描述';

                   // $echo = sprintf($videoTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId,$title,$desc);

                } else if ($type == 'location') {

                    $str = '你发送的是地理位置消息,纬度是' . $postObj->Location_X. " 经度是" . $postObj->Location_Y . "名称" . $postObj->Label . "精度是" . $postObj->Scale;

                    $MsgType = 'text';

                     $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);

                } else if ($type == 'link') {

                     $str = '你发送的是链接消息'  . $postObj->title  . $postObj->Description . $postObj->Url;

                    $MsgType = 'text';

                     $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);

                } else if ($type == 'event') {

                    if ($postObj->EventKey == 'V1001_TODAY_MUSIC') {

                          $musicUrl = 'http://sc.111ttt.com/up/mp3/161940/AAA1CD69EBEED018C3AC9CE6CCB8C3B3.mp3';

                         $media_id = '7Wn1YzkjjNMJ-ZFIUbbQjItbMi6zVzlKoCdvRpkZYSg8yew5yV8yCe8QRx4X4NAR';

                         $echo = sprintf($musicTpl,$fromUsername,$toUsername,$time,'music','音乐标题','音乐描述',$musicUrl,$musicUrl,$media_id);

                    } else if ($postObj->EventKey == 'V1001_GOOD') {

                        $str = 'thank you for your zan';

                       $MsgType = 'text';

                       $echo  = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);

                    }

                }



               

                echo $echo;


        }else {

            echo "";

            exit;

        }

    }

        

    private function checkSignature()

    {

        // you must define TOKEN by yourself

        if (!defined("TOKEN")) {

            throw new Exception('TOKEN is not defined!');

        }

        

        $signature = $_GET["signature"];

        $timestamp = $_GET["timestamp"];

        $nonce = $_GET["nonce"];

                

        $token = TOKEN;

        $tmpArr = array($token, $timestamp, $nonce);

        // use SORT_STRING rule

        sort($tmpArr, SORT_STRING);

        $tmpStr = implode( $tmpArr );

        $tmpStr = sha1( $tmpStr );

        

        if( $tmpStr == $signature ){

            return true;

        }else{

            return false;

        }

    }

}


?>

本文转自  陈小龙哈   51CTO博客,原文链接:http://blog.51cto.com/chenxiaolong/1782640
上一篇:利用交换机解决局域网ARP问题(51CTO博客出书活动)


下一篇:一文教你创建VPN网关!