從小米推送 php 服務端框架中看看代碼該怎麼寫

小米推送框架

近期由於有須要稍微看了一下小米推送的 php 版本服務端框架,這個推送平臺免費的,咱們只須要告訴小米平臺咱們要推什麼設備,它會本身幫咱們推,並且還會統計不少信息給咱們分析,如抵達率和點擊率等等,固然客戶端也要用小米平臺提供的 sdk 來註冊設備。我感受這個代碼寫得挺優雅的,故分享一下個人見解。你能夠去官網下載 sdk, 詳細的文檔在 這裏
我看能夠發現小米推送目錄結構是這樣的:php

├── xmpush
   ├── Builder.php
   ├── Constants.php
   ├── DevTools.php
   ├── ErrorCode.php
   ├── Feedback.php
   ├── HttpBase.php
   ├── IOSBuilder.php
   ├── Message.php
   ├── Result.php
   ├── Sender.php
   ├── Stats.php
   ├── Subscription.php
   ├── TargetedMessage.php
   └── Tracer.php

其中 HttpBase.php 是底層的網絡庫,主要是封裝了 HTTP 的 POST 和 GET 方法請求遠程的服務器並利用 Result.php 提供的類來接收服務器返回的數據,代碼十分優雅,咱們能夠看看。編程

//發送請求,獲取result,帶重試
    public function postResult($url,$fields,$retries){
        $result = new Result($this->postReq($url, $fields));
        if($result->getErrorCode() == ErrorCode::Success){
            return $result;
        }
        //重試
        for($i=0;$i<$retries;$i++){
            $result = new Result($this->postReq($url, $fields));
            if($result->getErrorCode() == ErrorCode::Success){
                break;
            }
        }
        return $result;
    }
    
    //post方式發送請求
    public function postReq($url,$fields,$timeout=10){
        $headers = array('Authorization: key=' . $this->appSecret, 
        'Content-Type: application/x-www-form-urlencoded');
        // Open connection
        $ch = curl_init();
    
        // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
        print_r('HTTP Params <br> '.urldecode(http_build_query($fields)));
        echo'<br>';
        // Execute post
        $result = curl_exec($ch);
            
        // Close connection
        curl_close($ch);
        return $result;
    }

從名字就能夠看出,上面是利用 POST 方法請求小米服務器,返回值用result包裝了一下,若是返回碼不爲 0,那麼久重試一下。在發送請求的時候把發送的 field 打印出來,讓開發者能看到請求的內容。雖然代碼很簡單,可是值得新手區學習這樣的代碼規範。有時候你本身寫框架的時候也能夠借鑑這種方式。json

builder.php 實現的實例繼承了 message 能夠承載着咱們的發送給服務端的消息數據,這就是咱們消息體,全部數據承載的地方。數組

ErrorCode.php 是存放狀態碼的文件,咱們在包含了這個文件後,能夠經過 ErrorCode::Success 來訪問咱們定義狀態碼。服務器

Sender.php 是一個發送文件,和發送相關的函數都會在這個文件上,內部會調用底層的網絡庫。網絡

Result.php 是一個存放服務器返回結果的文件。app

Constants.php 是一個存放常量和靜態變量的地方。框架

大體上最有用的就是上面描述的文件。curl

小米推送實踐

由於小米推送支持不少種推送方式,好比按 alias 推送,account 推送,全量推送,按標籤推送(客戶端訂閱的方式)。這裏僅僅介紹全量推送。
首先你須要在Constant類中配置好從小米平臺上註冊的 app 的包名和 secret函數

$secret = 'your app secret';
$package = 'your app packagename';

// 常量設置必須在new Sender()方法以前調用
Constants::setPackage($package);
Constants::setSecret($secret);

若是有多個應用,你能夠在一個新的 config 類中存放好配置信息。
而後開始構建消息體。

$message = new Builder();
$message->title($title);
$message->description($desc);
$message->notifyType(1);
$message->passThrough($passThrough);
$message->payload($payload);
$message->extra(Builder::notifyEffect, 1);
$message->notifyId(1);
$message->timeToSend($timeToSend);
$message->build();

而後你能夠設置建立一個發送類,並調用全量推送的接口。

$sender = new Sender();
$res = $sender->broadcastAll($message);
print_r($res->getRaw());                  // 查看返回的數據

你看,是否是很簡單,輕輕鬆鬆實現小米推送,僅須要10分鐘左右的時間,可是必定要注意返回值得錯誤檢查。不要讓程序崩了,也不要讓程序返回一些人類很難看懂的字符和錯誤碼,養成良好的編程習慣,有助於提升開發效率。
返回的數組用 json_encode 函數轉爲 json 格式

{
    "result": "ok",
    "trace_id": "Xcm56b094851588122700z",
    "code": 0,
    "data": {
        "id": "tcm56b09485158812276t8"
    },
    "description": "成功",
    "info": "Received push messages for 1 TOPIC"
}

若是有同窗在使用小米推送平臺的過程遇到問題的歡迎提出來你們一塊兒交流!

相關文章
相關標籤/搜索