微信事件推送接口(原創總結)


微信中所有的推送事件都會發送到開發者填寫的URL,MP中的,左側最下面的開發-》基本配置-》服務器配置-》第一個就是,這個URL有要有處理所有事件推送的能力,當然不是每個都需要處理,只需要將需要的接受處理即可,其他的可直接忽略。

1.首先接收推送過來的數據包。

$postStr = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : "";

2.判斷數據包是不是空的,空的當然無需處理了,非空數據包轉換為php對象。

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

然后根據研究各個事件推送過來的xml數據包,普通消息和事件消息等共用的有以下字段:

①ToUserName      開發者微信號

②FromUserName  發送方帳號(一個OpenID)

③CreateTime       消息創建時間(整型)

④MsgType           消息的類型

3.根據消息類型將事件分類。

普通消息包括(文本、語音、圖片、視頻、小視頻、地理位置、鏈接),事件消息(event),除了普通消息,其他的全部是event。

MsgType           消息類型        這個來區分普通消息和事件消息,將事件推送分成了兩大部分。

普通消息一般是轉發給客服處理或者是做關鍵詞匹配處理等。

4. 根據事件消息的事件名將事件分類,單個去處理。

每個事件消息的共用部分是Event,代表了事件類型。

事件名稱(Event的值)

關注(subscribe)

取消關注(unsubscribe)

上報地理位置(LOCATION)

自定義菜單拉取消息(CLICK)

點擊菜單跳轉(VIEW)

掃描帶參數二維碼(SCAN)

掃碼推事件(scancode_push)

掃描顯示消息接受中(scancode_waitmsg)

彈出系統拍照發圖(pic_sysphoto)

彈出拍照或者相冊發圖(pic_photo_or_album)

彈出微信相冊發圖器(pic_weixin)

彈出地理位置選擇器(location_select)

模板消息送達情況提醒(TEMPLATESENDJOBFINISH)

群發消息后的通知(MASSSENDJOBFINISH)

微信小店訂單支付后的通知(merchant_order)

資質認證成功(qualification_verify_success)

資質認證失敗(qualification_verify_fail)

名稱認證成功(naming_verify_success)

名稱認證失敗(naming_verify_fail)

年審通知(annual_renew)

認證過期失效通知(verify_expired)

對各個事件的處理基本都是大同小異的。

5. 掃描帶參數二維碼與關注。

這是唯一一個比較別扭的地方,當掃描帶參數二維碼的時候需要判斷用戶是否已經關注了公眾賬號,如果關注了,那么了Event為SCAN,如果未關注的話,則是跳轉到了公眾號的關注頁面,如果點了關注,會觸發subscribe類型的事件,同時會把掃描帶參數二維碼里面的信息帶到xml數據包中,也就是現在的關注和普通的搜索或者按照名片的關注不一樣了,多帶了參數,處理的時候要注意。

$Event = $postObj->Event;
if($Event == 'subscribe'){ // 關注 if(isset($postObj->EventKey) || isset($postObj->Ticket)){ // 掃描帶參數二維碼,未關注推送 $EventKey = $postObj->EventKey; //事件KEY值,qrscene_為前綴,后面為二維碼的參數值 $Ticket = $postObj->Ticket; //二維碼的ticket }else{ // 普通關注 } }
// elseif中處理其他類型的事件
elseif($Event == 'SCAN'){
        // 掃描帶參數二維碼,已關注推送
        $EventKey = $postObj->EventKey;// 事件KEY值,是一個32位無符號整數,即創建二維碼時的二維碼scene_id
        $Ticket   = $postObj->Ticket;  //二維碼的ticket
}

 

6.模板消息推送事件中,需要再往下根據送達狀態分類。

if($Event == 'TEMPLATESENDJOBFINISH'){
    // 模板消息發送結果提醒
    $status = $postObj->Status;
    if($status == 'success'){
        // 送達成功
    }elseif($status == 'failed:user block'){
        // 送達由於用戶拒收
    }elseif($status == 'failed: system failed'){
        // 其他原因
    }else{
        echo "success";
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM