PHP微信開發(fā)之微信消息自動(dòng)回復(fù)下所遇到的坑

字號(hào):


    微信回復(fù)原理:
    當(dāng)普通微信用戶向公眾賬號(hào)發(fā)送消息時(shí),微信服務(wù)器首先收到用戶發(fā)送的消息;
    然后將用戶信息和消息打包成XML格式的數(shù)據(jù)包,再將這個(gè)XML數(shù)據(jù)包通過POST方法提交到開發(fā)者設(shè)置的URL上。
    疑問一:為何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST過來的數(shù)據(jù),而非$_POST數(shù)組?
    回答:
    POST只能保存標(biāo)準(zhǔn)的數(shù)據(jù)類型,對(duì)于XML、SOAP或Application/Octet-steam之類的內(nèi)容則無法解析。
    而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一樣的,如果POST過來的數(shù)據(jù)PHP能夠識(shí)別,則可以用$GLOBALS["HTTP_RAW_POST_DATA"]來接收。
    疑問二:simplexml_load_file()各參數(shù)和返回值是什么?
    回答:
    參數(shù)含義
    string:需要處理的XML字符串。
    class:用來指定新對(duì)象,通常設(shè)置為"SimpleXMLElement",生成一個(gè)簡(jiǎn)單XML元素的類。
    options:指定附加的Libxml參數(shù),通常設(shè)置為常量LIBXML_NOCDATA,表示把CDATA設(shè)置為文本節(jié)點(diǎn)。
    ns:一般省略
    is_prefix:一般省略
    函數(shù)執(zhí)行完成后返回SimpleXMLElement類的一個(gè)對(duì)象。
    功能:公眾號(hào)只接受文字消息,且做出相應(yīng)的文字回復(fù)。
    <span><?php 
    define("TOKEN","weixin"); 
    $weixinObj = new Wechat(); 
    $weixinObj->valid(); 
    class Wechat{ 
    public function valid(){ 
    $echoStr = $_GET['echostr']; 
    //如果是第一次接入 
    if($this->checkSignature() && $echoStr ){ 
    echo $echoStr; 
    exit; 
    }else{ 
    $this->responseMsg(); 
    } 
    } 
    //校驗(yàn)方法 
    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; 
    } 
    } 
    /* 普通文本消息 
    <xml> 
    <ToUserName><![CDATA[toUser]]></ToUserName> 
    <FromUserName><![CDATA[fromUser]]></FromUserName> 
    <CreateTime>1348831860</CreateTime> 
    <MsgType><![CDATA[text]]></MsgType> 
    <Content><![CDATA[this is a test]]></Content> 
    </xml> 
    */
    public function responseMsg(){ 
    //獲取微信服務(wù)器POST請(qǐng)求中的數(shù)據(jù) 
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
    if( !empty($postStr) ){ 
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $fromUser = $postObj->FromUserName; 
    $toUser = $postObj->ToUserName; 
    $keyword = trim($postObj->Content); 
    $time = time(); 
    $template = "<xml> 
    <ToUserName><![CDATA[%s]]></ToUserName> 
    <FromUserName><![CDATA[%s]]></FromUserName> 
    <CreateTime>%s</CreateTime> 
    <MsgType><![CDATA[%s]]></MsgType> 
    <Content><![CDATA[%s]]></Content> 
    </xml>"; 
    if( strtolower($postObj->MsgType)!='text' ){ 
    $msgType = "text"; 
    $content = "我只接受文本消息"; 
    }else{ 
    $msgType = "text"; 
    if( !empty($keyword) ){ 
    $content = "您發(fā)送的消息是:".$postObj->Content; 
    }else{ 
    $content = "請(qǐng)輸入關(guān)鍵字";//消息為空 
    } 
    } 
    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 
    echo $info; 
    }else{ 
    echo ""; 
    exit; 
    } 
    } 
    }</span>
    功能:公眾號(hào)只接受圖片消息,且做出相應(yīng)的文字回復(fù)。
    <span><?php 
    define("TOKEN","weixin"); 
    $weixinObj = new Wechat(); 
    $weixinObj->valid(); 
    class Wechat{ 
    public function valid(){ 
    $echoStr = $_GET['echostr']; 
    //如果是第一次接入 
    if($this->checkSignature() && $echoStr ){ 
    echo $echoStr; 
    exit; 
    }else{ 
    $this->responseMsg(); 
    } 
    } 
    //校驗(yàn)方法 
    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; 
    } 
    } 
    /* 接收?qǐng)D片消息格式 
    <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> 
    */
    public function responseMsg(){ 
    //獲取微信服務(wù)器POST請(qǐng)求中的數(shù)據(jù) 
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
    if( !empty($postStr) ){ 
    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
    $fromUser = $postObj->FromUserName; 
    $toUser = $postObj->ToUserName; 
    $time = time(); 
    $msgType= $postObj->MsgType; 
    $picUrl = $postObj->PicUrl; 
    $mediaId = $postObj->MediaId; 
    $template = "<xml> 
    <ToUserName><![CDATA[%s]]></ToUserName> 
    <FromUserName><![CDATA[%s]]></FromUserName> 
    <CreateTime>%s</CreateTime> 
    <MsgType><![CDATA[%s]]></MsgType> 
    <Content><![CDATA[%s]]></Content> 
    </xml>"; 
    if( strtolower($msgType)!='image' ){ 
    $msgType = "text"; 
    $content = "我只接受圖片消息"; 
    }else{ 
    $msgType = "text"; 
    if( !empty( $picUrl ) ){ 
    $content = "圖片鏈接為:".$picUrl."\n"; 
    $content .= "媒體id:".$mediaId; 
    }else{ 
    $content = "請(qǐng)發(fā)送圖片";//消息為空 
    } 
    } 
    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 
    echo $info; 
    }else{ 
    echo ""; 
    exit; 
    } 
    } 
    }</span>
    以上是小編給大家分享的微信消息自動(dòng)回復(fù)下所遇到的坑的相關(guān)知識(shí),希望對(duì)大家有所幫助!