PHP 服務端友盟推送


以前也用過友盟推送,但是整合的方法當時沒整理

結果前段時間在使用的時候,找不到了誒

友盟推送文檔地址:https://developer.umeng.com/docs/67966/detail/68343

於是再次百度了一番

找到了現在這篇,整合的比較不錯,適合我這種面向百度編程的

廢話不多說

直接開始

首先對應配置

在友盟 的 應用中找到對應Android與ios的 AppKey 和 App Master Secret

 

 

 

 

 

或者對應配置信息並在配置中配置

'umeng' => [
        'android_app_key'    => '####',  //友盟android AppKey
        'android_app_secret' => '####',  //友盟android App Master Secret
        'ios_app_key'        => '####',  //友盟ios AppKey
        'ios_app_secret'     => '####',  //友盟android App Master Secret
    ],

 

然后推送核心類庫

代碼如下:

<?php
namespace umeng;
/**
 * 友盟消息 安卓 IOS 推送類
 *
 */
class Push 
{
    protected $host; //發送地址
    protected $app_key; //appkey
    protected $appMasterSecret; //app secret
    protected $description; //app secret
    //
    public function __construct($options = null) 
    {
        if (is_array($options)) {
            $this->host = 'https://msgapi.umeng.com/api/send';
            $this->app_key = $options['app_key'];
            $this->appMasterSecret = $options['appMasterSecret'];
            $this->description = "友盟接口推送";
        } else {
            return false;
        }
    }
    /**
     * @param $info
     * @param $device_token
     * @return mixed|string
     * 用戶單播 和 列播
     */
    public function Android_Device_Push($info, $device_token) 
    {
        $data['appkey'] = $this->app_key;
        $data['timestamp'] = time(); //時間戳
        if (is_array($device_token)) {
            //批量用戶列播
            $data['type'] = 'listcast';
            $data['device_tokens'] = implode(',', $device_token); //數組轉字符串
            
        } else {
            //一個用戶單播
            $data['type'] = 'unicast';
            $data['device_tokens'] = $device_token;
        }
        //payload內容
        $data['payload']['display_type'] = 'notification'; //通知消息
        //payload body內容
        $data['payload']['body']['after_open'] = "go_custom"; //后續操作打開app
        $data['payload']['body']['ticker'] = $info['ticker'];
        $data['payload']['body']['title'] = $info['title'];
        $data['payload']['body']['text'] = $info['title']; //廣播通知不能為空補填
        //這里可以寫附加字段
        $data['payload']['extra']['type'] = $info['type']; //附加字段類型
        $data['production_mode'] = $info['production_mode'];
        $data['description'] = $this->description;
        return $this->send($data, $this->host, $this->appMasterSecret);
    }
    /**
     * @param $info
     * @return mixed|string
     * 廣播
     */
    public function Android_Broadcast($info) 
    {
        $data['appkey'] = $this->app_key;
        $data['timestamp'] = time(); //時間戳
        //廣播消息
        $data['type'] = 'broadcast';
        //payload內容
        $data['payload']['display_type'] = 'notification'; //通知消息
        //payload body內容
        $data['payload']['body']['after_open'] = "go_custom"; //后續操作打開app
        $data['payload']['body']['ticker'] = $info['ticker'];
        $data['payload']['body']['title'] = $info['title'];
        $data['payload']['body']['text'] = $info['title']; //廣播通知不能為空補填
        $data['payload']['extra']['type'] = $info['type']; //附加字段類型1 跳轉消息詳情
        $data['payload']['extra']['prod_id'] = $info['prod_id']; //附加字段消息詳情id
        $data['payload']['extra']['text'] = $info['text']; //
        $data['production_mode'] = $info['production_mode'];
        $data['description'] = $this->description;
        return $this->send($data, $this->host, $this->appMasterSecret);
    }
    /**
     * @param $info
     * @param $device_token
     * @return mixed|string
     * 單播 和 列播
     */
    public function Ios_Device_Push($info, $device_token) 
    {
        $data = array();
        $data['appkey'] = $this->app_key;
        $data['timestamp'] = time(); //時間戳
        if (is_array($device_token)) {
            //批量用戶列播
            $data['type'] = 'listcast';
            $data['device_tokens'] = implode(',', $device_token); //數組轉字符串
            
        } else {
            //一個用戶單播
            $data['type'] = 'unicast';
            $data['device_tokens'] = $device_token;
        }
        //payload內容
        $data['payload']['aps']['alert'] = $info['text']; //消息主體
        $data['payload']['aps']['sound'] = 'default'; //聲音
        $data['payload']['type'] = $info['type']; //消息類型 0打開消息詳情
        $data['payload']['prod_id'] = $info['prod_id']; //消息id
        $data['payload']['title'] = $info['title'];
        $data['payload']['text'] = $info['text']; //
        $data['production_mode'] = $info['production_mode'];
        $data['description'] = $this->description;
        return $this->send($data, $this->host, $this->appMasterSecret);
    }

    public function Ios_Broadcast($info) 
    {
        $data = array();
        $data['appkey'] = $this->app_key;
        $data['timestamp'] = time(); //時間戳
        //廣播消息
        $data['type'] = 'broadcast';
        //payload內容
        $data['payload']['aps']['alert'] = $info['title']; //消息主體
        $data['payload']['aps']['sound'] = 'chime'; //聲音
        $data['payload']['aps']['badge'] = 1; //顯示角標
        $data['payload']['type'] = $info['type']; //消息類型 0打開消息詳情
        $data['payload']['prod_id'] = $info['prod_id']; //消息id
        $data['payload']['title'] = $info['title'];
        $data['payload']['text'] = $info['ticker']; //
        $data['production_mode'] = $info['production_mode'];
        $data['description'] = $this->description;
        return $this->send($data, $this->host, $this->appMasterSecret);
    }
    /**
     * @param $data
     * @param $url_s
     * @param $appMasterSecret
     * @return mixed|string
     * curl 請求
     */
    private function send($data, $url_s, $appMasterSecret) 
    {
        $postBody = json_encode($data);
        //加密
        $sign = md5("POST" . $url_s . $postBody . $appMasterSecret);
        $url = $url_s . "?sign=" . $sign;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody);
        $result = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curlErrNo = curl_errno($ch);
        $curlErr = curl_error($ch);
        curl_close($ch);
        // print_r($result);
        // exit;
        if ($httpCode == "0") {
            // Time out
            return ("Curl error number:" . $curlErrNo . " , Curl error details:" . $curlErr . "\r\n");
        } else if ($httpCode != "200") {
            return ("Http code:" . $httpCode . " details:" . $result . "\r\n");
        } else {
            return $result;
        }
    }
}
?>

調用方法示例:

use umeng\Push;
function umengsend($device_token)
{

    $info['ticker'] = '推送測試提示欄';  #提示欄文字
    $info['title'] ='推送測試標題';    #通知標題
    $info['text'] = '推送測試文字描述';  #文字描述
    $info['type'] = 4;     //附加字段類型1 跳轉消息詳情
    $info['production_mode'] = 'false';
    $info['prod_id'] = "";

    #IOS 單播與廣播
    $options_ios = [
            'app_key' => config('umeng.ios_app_key'),
            'appMasterSecret' => config('umeng.ios_app_secret'),
        ];
    $ios_umeng = new Push($options_ios);
    #IOS單播
    $ios_umeng->Ios_Device_Push($info,$device_token);
    #IOS廣播
    $ios_umeng->Ios_Broadcast($info);


    #Android 單播與廣播
    $options_android = [
            'app_key' => config('umeng.android_app_key'),
            'appMasterSecret' => config('umeng.android_app_secret'),
        ];
    $android_umeng = new Push($options_android);

    #安卓單播
    $android_umeng->Android_Device_Push($info,$device_token);
    #安卓廣播
    $android_umeng->Android_Broadcast($info);
}

 自己使用:

#推送相關設定
use umeng\Push;
    

#公共測試
#$title 通知標題
#$text  文字描述
#$type  類型 1單播2廣播
#$userlist  device_token 列表
function umengpublic($title,$text,$type="1",$userlist=[])
{
    $info = [];
    $info['ticker'] = $title;  #提示欄文字
    $info['title'] = $title;    #通知標題
    $info['text'] = $text;  #文字描述
    $info['type'] = 4;     //附加字段類型1 跳轉消息詳情
    $info['production_mode'] = 'false';  #false 測試  true 正式
    $info['prod_id'] = "";
    if($type == '1')
    {
        umengpushuser($info,$userlist);
    }else{
        umengpushpublic($info);
    }
    return true;
}

#公共推送 -- 廣播
function  umengpushpublic($info)
{
    #安卓廣播
    $android_umeng = new Push(['app_key' => config('umeng.android_app_key'),'appMasterSecret' => config('umeng.android_app_secret')]);
    $android_umeng->Android_Broadcast($info);
    #########################################
    #IOS廣播
    $ios_umeng = new Push(['app_key' => config('umeng.ios_app_key'),'appMasterSecret' => config('umeng.ios_app_secret')]);
    $ios_umeng->Ios_Broadcast($info);
    return true;
}

#公共推送  -- 單播
function umengpushuser($info,$userlist)
{
    #對應相關用戶
    $userlists = []; #獲取device_token 列表
    foreach($userlists as $key=>$val)
    {
        #安卓單推
        if($val['ismodel'] == '1')
        {
            #安卓配置
            $android_umeng = new Push(['app_key' => config('umeng.android_app_key'),'appMasterSecret' => config('umeng.android_app_secret')]);
            $android_umeng->Android_Device_Push($info,$val['device_token']);
        }
        #ios 單推
        else if($val['ismodel'] == '2')
        {
            #IOS配置
            $ios_umeng = new Push(['app_key' => config('umeng.ios_app_key'),'appMasterSecret' => config('umeng.ios_app_secret')]);
            $ios_umeng->Ios_Device_Push($info,$val['device_token']);
        }
        else
        {
            // return 
        }
    }
    return true;
}

 

 附錄::

推送相關參數

Android:

{
    "appkey":"xx",        // 必填,應用唯一標識
    "timestamp":"xx",    // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾
    "type":"xx",        // 必填,消息發送類型,其值可以為: 
                        //   unicast-單播
                        //   listcast-列播,要求不超過500個device_token
                        //   filecast-文件播,多個device_token可通過文件形式批量發送
                        //   broadcast-廣播
                        //   groupcast-組播,按照filter篩選用戶群, 請參照filter參數
                        //   customizedcast,通過alias進行推送,包括以下兩種case:
                        //     - alias: 對單個或者多個alias進行推送
                        //     - file_id: 將alias存放到文件后,根據file_id來推送
    "device_tokens":"xx",    // 當type=unicast時, 必填, 表示指定的單個設備
                            // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔
    "alias_type": "xx",    // 當type=customizedcast時, 必填
                        // alias的類型, alias_type可由開發者自定義, 開發者在SDK中
                        // 調用setAlias(alias, alias_type)時所設置的alias_type
    "alias":"xx",        // 當type=customizedcast時, 選填(此參數和file_id二選一)
                        // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔
                        // 在SDK中調用setAlias(alias, alias_type)時所設置的alias
    "file_id":"xx",    // 當type=filecast時,必填,file內容為多條device_token,以回車符分割
                    // 當type=customizedcast時,選填(此參數和alias二選一)
                    //   file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應
                    //   的alias_type必須和接口參數alias_type一致。
                    // 使用文件播需要先調用文件上傳接口獲取file_id,參照"文件上傳"
    "filter":{},    // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。
                    // filter的內容長度最大為3000B)
    "payload": {    // 必填,JSON格式,具體消息內容(Android最大為1840B)
        "display_type":"xx",    // 必填,消息類型: notification(通知)、message(消息)
        "body": {    // 必填,消息體。
                // 當display_type=message時,body的內容只需填寫custom字段。
                // 當display_type=notification時,body包含如下參數:
            // 通知展現內容:
            "ticker":"xx",    // 必填,通知欄提示文字
            "title":"xx",    // 必填,通知標題
            "text":"xx",    // 必填,通知文字描述 

            // 自定義通知圖標:
            "icon":"xx",    // 可選,狀態欄圖標ID,R.drawable.[smallIcon],
            // 如果沒有,默認使用應用圖標。
            // 圖片要求為24*24dp的圖標,或24*24px放在drawable-mdpi下。
            // 注意四周各留1個dp的空白像素
            "largeIcon":"xx",    // 可選,通知欄拉開后左側圖標ID,R.drawable.[largeIcon],
            // 圖片要求為64*64dp的圖標,
            // 可設計一張64*64px放在drawable-mdpi下,
            // 注意圖片四周留空,不至於顯示太擁擠
            "img": "xx",    // 可選,通知欄大圖標的URL鏈接。該字段的優先級大於largeIcon。
                            // 該字段要求以http或者https開頭。

            // 自定義通知聲音:
            "sound": "xx",    // 可選,通知聲音,R.raw.[sound]。
                            // 如果該字段為空,采用SDK默認的聲音,即res/raw/下的
                            // umeng_push_notification_default_sound聲音文件。如果
                            // SDK默認聲音文件不存在,則使用系統默認Notification提示音。

            // 自定義通知樣式:
            "builder_id": xx,    // 可選,默認為0,用於標識該通知采用的樣式。使用該參數時,
                                // 開發者必須在SDK里面實現自定義通知欄樣式。

            // 通知到達設備后的提醒方式,注意,"true/false"為字符串
            "play_vibrate":"true/false",    // 可選,收到通知是否震動,默認為"true"
            "play_lights":"true/false",        // 可選,收到通知是否閃燈,默認為"true"
            "play_sound":"true/false",        // 可選,收到通知是否發出聲音,默認為"true"

            // 點擊"通知"的后續行為,默認為打開app。
            "after_open": "xx",    // 可選,默認為"go_app",值可以為:
                                //   "go_app": 打開應用
                                //   "go_url": 跳轉到URL
                                //   "go_activity": 打開特定的activity
                                //   "go_custom": 用戶自定義內容。
            "url": "xx",    // 當after_open=go_url時,必填。
                            // 通知欄點擊后跳轉的URL,要求以http或者https開頭
            "activity":"xx",    // 當after_open=go_activity時,必填。
                                // 通知欄點擊后打開的Activity
            "custom":"xx"/{}    // 當display_type=message時, 必填
                                // 當display_type=notification且
                                // after_open=go_custom時,必填
                                // 用戶自定義內容,可以為字符串或者JSON格式。
        },
        extra:{    // 可選,JSON格式,用戶自定義key-value。只對"通知"
                // (display_type=notification)生效。
                // 可以配合通知到達后,打開App/URL/Activity使用。
            "key1": "value1",
            "key2": "value2",
            ...
        }
    },
    "policy":{    // 可選,發送策略
        "start_time":"xx",    // 可選,定時發送時,若不填寫表示立即發送。
                            // 定時發送時間不能小於當前時間
                            // 格式: "yyyy-MM-dd HH:mm:ss"。 
                            // 注意,start_time只對任務類消息生效。
        "expire_time":"xx",    // 可選,消息過期時間,其值不可小於發送時間或者
                            // start_time(如果填寫了的話),
                            // 如果不填寫此參數,默認為3天后過期。格式同start_time
        "max_send_num": xx,    // 可選,發送限速,每秒發送的最大條數。最小值1000
                            // 開發者發送的消息如果有請求自己服務器的資源,可以考慮此參數。
        "out_biz_no": "xx"    // 可選,消息發送接口對任務類消息的冪等性保證。
                            // 強烈建議開發者在發送任務類消息時填寫這個字段,友盟服務端會根據這個字段對消息做去重避免重復發送。
                            // 同一個appkey下面的多個消息會根據out_biz_no去重,不同發送任務的out_biz_no需要保證不同,否則會出現后發消息被去重過濾的情況。
                            // 注意,out_biz_no只對任務類消息有效。
    },
    "production_mode":"true/false",    // 可選,正式/測試模式。默認為true
                                    // 測試模式只對“廣播”、“組播”類消息生效,其他類型的消息任務(如“文件播”)不會走測試模式
                                    // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。
                                    // Android: 測試設備屬於正式設備的一個子集。
    "description": "xx",    // 可選,發送消息描述,建議填寫。  
    //系統彈窗,只有display_type=notification生效
    "mipush": "true/false",    // 可選,默認為false。當為true時,表示MIUI、EMUI、Flyme系統設備離線轉為系統下發
    "mi_activity": "xx",    // 可選,mipush值為true時生效,表示走系統通道時打開指定頁面acitivity的完整包路徑。
    "channel_properties":{ //可選,廠商通道相關的特殊配置
      "xiaomi_channel_id":"",//小米channel_id,具體使用及限制請參考小米推送文檔 https://dev.mi.com/console/doc/detail?pId=2086
      "vivo_classification":"1" , //vivo消息分類:0 運營消息,1 系統消息, 需要到vivo申請,具體使用及限制參考[vivo消息推送分類功能說明]https://dev.vivo.com.cn/documentCenter/doc/359
      "oppo_channel_id":"xx"  //可選, android8以上推送消息需要新建通道,否則消息無法觸達用戶。push sdk 6.0.5及以上創建了默認的通道:upush_default,消息提交廠商通道時默認添加該通道。如果要自定義通道名稱或使用私信,請自行創建通道,推送消息時攜帶該參數 具體可參考 [oppo通知通道適配] https://open.oppomobile.com/wiki/doc#id=10289
    }
}

IOS相關參數:

{
  "appkey":"xx",    // 必填,應用唯一標識
  "timestamp":"xx", // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾
  "type":"xx",      // 必填,消息發送類型,其值可以為: 
                    //   unicast-單播
                    //   listcast-列播,要求不超過500個device_token
                    //   filecast-文件播,多個device_token可通過文件形式批量發送
                    //   broadcast-廣播
                    //   groupcast-組播,按照filter篩選用戶群, 請參照filter參數
                    //   customizedcast,通過alias進行推送,包括以下兩種case:
                    //     - alias: 對單個或者多個alias進行推送
                    //     - file_id: 將alias存放到文件后,根據file_id來推送
  "device_tokens":"xx", // 當type=unicast時, 必填, 表示指定的單個設備
                        // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔
  "alias_type": "xx", // 當type=customizedcast時, 必填
                      // alias的類型, alias_type可由開發者自定義, 開發者在SDK中
                      // 調用setAlias(alias, alias_type)時所設置的alias_type
  "alias":"xx", // 當type=customizedcast時, 選填(此參數和file_id二選一)
                // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔
                // 在SDK中調用setAlias(alias, alias_type)時所設置的alias
  "file_id":"xx", // 當type=filecast時,必填,file內容為多條device_token,以回車符分割
                  // 當type=customizedcast時,選填(此參數和alias二選一)
                  //   file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應
                  //   的alias_type必須和接口參數alias_type一致。
                  // 使用文件播需要先調用文件上傳接口獲取file_id,參照"2.4文件上傳接口"
  "filter":{}, // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。
  "payload":   // 必填,JSON格式,具體消息內容(iOS最大為2012B)
  {
    "aps":      // 必填,嚴格按照APNs定義來填寫
    {
        "alert":""/{ // 當content-available=1時(靜默推送),可選; 否則必填。
                     // 可為JSON類型和字符串類型
            "title":"title",
            "subtitle":"subtitle",
            "body":"body"
        }                   
        "badge": xx,           // 可選        
        "sound": "xx",         // 可選         
        "content-available":1  // 可選,代表靜默推送     
        "category": "xx",      // 可選,注意: ios8才支持該字段。
    },
    "key1":"value1",       // 可選,用戶自定義內容, "d","p"為友盟保留字段,
                           // key不可以是"d","p"
    "key2":"value2",       
    ...
  },
  "policy":               // 可選,發送策略
  {
      "start_time":"xx",   // 可選,定時發送時間,若不填寫表示立即發送。
                           // 定時發送時間不能小於當前時間
                           // 格式: "yyyy-MM-dd HH:mm:ss"。 
                           // 注意,start_time只對任務生效。
      "expire_time":"xx",  // 可選,消息過期時間,其值不可小於發送時間或者
                           // start_time(如果填寫了的話), 
                           // 如果不填寫此參數,默認為3天后過期。格式同start_time
      "out_biz_no": "xx"   // 可選,消息發送接口對任務類消息的冪等性保證。
                           // 強烈建議開發者在發送任務類消息時填寫這個字段,友盟服務端會根據這個字段對消息做去重避免重復發送。
                           // 同一個appkey下面的多個消息會根據out_biz_no去重,不同發送任務的out_biz_no需要保證不同,否則會出現后發消息被去重過濾的情況。
                           // 注意,out_biz_no只對任務類消息有效。
      "apns_collapse_id": "xx" // 可選,多條帶有相同apns_collapse_id的消息,iOS設備僅展示
                               // 最新的一條,字段長度不得超過64bytes
  },
  "production_mode":"true/false" // 可選,正式/測試模式。默認為true
                                 // 測試模式只對“廣播”、“組播”類消息生效,其他類型的消息任務(如“文件播”)不會走測試模式
                                 // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。
  "description": "xx"      // 可選,發送消息描述,建議填寫。     
}

 

 

分享完畢..

漫漫人生路,終究還是要找合得來的人...

2020年08月28日

 


免責聲明!

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



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