微信公眾平臺配置服務器之后實現(xiàn)自動回復

參考微信公眾平臺開發(fā)者文檔

https://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

  1. 下載示例代碼
  2. 將示例代碼通過FTP傳至自己的服務器
  3. 配置域名和Token(我這里是dandan)
  4. 隨機生成EncodingAESKey
  5. 驗證

新定義一個方法

public function index(){
if (isset($_GET['echostr'])){
$this->valid();
} else {
$this->responseMsg();
}

注釋掉

//$wechatObj->valid();

新加一行

$wechatObj->index();

開發(fā)者文檔->消息管理->被動回復消息

微信的示例代碼里面自帶了一個回復文本消息的XML數(shù)據(jù)包

if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}

示例代碼改到這一步的話碰酝,你發(fā)送任意一個字符給公眾號吼鱼,他都會回復你

Welcome to wechat world雄卷!

對比一下文本消息满哪、圖片消息啃勉,語音消息的數(shù)據(jù)包結(jié)構(gòu)

文本消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

文本消息

圖片消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>

</xml>

圖片消息

語音消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>

語音消息

可以發(fā)現(xiàn)MsgType代表的就是消息類型罕拂,語音消息和圖片消息都有一個MediaID仰剿。
圖片、語音另绩、音樂儒陨、還有視頻花嘶。這些都屬于媒體,上傳到微信服務器后都會生成一個MediaID蹦漠,相當于每個文件的"身份證"椭员。

微信的示例代碼中沒有回復圖片消息和語音消息的數(shù)據(jù)包,所以需要導入笛园。

            $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>";

還有一個就是默認的示例代碼中沒有消息類型拆撼,所以需要添加一個變量。

$type = $postObj->MsgType;

然后用If 語句判斷消息類型做出相應的回復喘沿。

  1. 用戶發(fā)送文本消息回復給用戶 文本消息+'用戶發(fā)送的文本'。
  1. 用戶發(fā)送圖片消息回復給用戶同一張圖片竭贩。

  2. 用戶發(fā)送語音消息回復給用戶同樣的語音消息蚜印。

             if($type == 'text') {
                 $str = '文本消息' . $keyword; 
                  $MsgType = 'text';
             $echo = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);
             }else if ($type == 'image'){
                 $MsgType = 'image';
                 $echo = sprintf($imgTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
                
             }else if ($type =='voice'){
                 $MsgType = 'voice';
                 $echo = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
             }
    

這里要注意的是sprintf()里面需要交換fromUsername和toUsername的順序,其他的變量順序不能顛倒留量,如果顛倒則公眾號無法正痴常回復。因為fromUsername既代表用戶發(fā)給你楼熄,也代表你發(fā)送給用戶忆绰,toUsername同理,微信里面還有很多東西可以去嘗試比如語音識別接口等等可岂。

完整代碼如下

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "dandan");
$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)){
                
                $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>";
                if($type == 'text') {
                    $str = '文本消息' . $keyword; 
                     $MsgType = 'text';
                $echo = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);
                }else if ($type == 'image'){
                    $MsgType = 'image';
                    $echo = sprintf($imgTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
                   
                }else if ($type =='voice'){
                    $MsgType = 'voice';
                    $echo = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
                }
              

                    echo $echo;

        }else {
            echo "";
            exit;
        }
    }
        
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末错敢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缕粹,更是在濱河造成了極大的恐慌稚茅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平斩,死亡現(xiàn)場離奇詭異亚享,居然都是意外死亡,警方通過查閱死者的電腦和手機绘面,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門欺税,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揭璃,你說我怎么就攤上這事晚凿。” “怎么了塘辅?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵晃虫,是天一觀的道長。 經(jīng)常有香客問我扣墩,道長哲银,這世上最難降的妖魔是什么扛吞? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荆责,結(jié)果婚禮上滥比,老公的妹妹穿的比我還像新娘。我一直安慰自己做院,他們只是感情好盲泛,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著键耕,像睡著了一般寺滚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屈雄,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天村视,我揣著相機與錄音,去河邊找鬼酒奶。 笑死蚁孔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惋嚎。 我是一名探鬼主播杠氢,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼另伍!你這毒婦竟也來了鼻百?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤质况,失蹤者是張志新(化名)和其女友劉穎愕宋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體结榄,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡中贝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了臼朗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻寿。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖视哑,靈堂內(nèi)的尸體忽然破棺而出绣否,到底是詐尸還是另有隱情,我是刑警寧澤挡毅,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布蒜撮,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏段磨。R本人自食惡果不足惜取逾,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苹支。 院中可真熱鬧砾隅,春花似錦、人聲如沸债蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寻定。三九已至儒洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狼速,已是汗流浹背晶丘。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唐含,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓沫浆,卻偏偏與公主長得像捷枯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子专执,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容