在 Laravel 中使用 極光推送

一個人的江湖發表於2019-07-13

最近在專案中需要用到推送,抽出時間看了看極光推送,記錄一下
Github地址:https://github.com/jpush/jpush-api-php-cli...
Push API:https://github.com/jpush/jpush-api-php-cli...
極光推送官方文件地址:https://docs.jiguang.cn/jpush/server/push/...

  • PHP 7.1.29
  • Laravel 5.6

composer.json 檔案中的 require 下新增 "jpush/jpush": "^3.6"

"require": {
        "jpush/jpush": "^3.6",
},

執行命令:composer install

config 目錄下新建檔案 Jpush.php 並進行如下配置:

return [
        'android_app_key' => env('JPUSH_APP_KEY'),
        'android_master_secret' => env('JPUSH_APP_MASTER_SECRET'),

        'ios_app_key' => env('JPUSH_IOS_KEY'),
        'ios_master_secret' => env('JPUSH_IOS_MASTER_SECRET'),

        // 環境 true-生產環境 false-開發環境
        'environment' => env('JPUSH_APNS_PRODUCTION', true),
];

.env 檔案進行如下配置:

JPUSH_APP_KEY=極光推送的app_key(android)
JPUSH_APP_MASTER_SECRET=極光推送的master_secret(android)
JPUSH_IOS_KEY=極光推送的app_key(ios)
JPUSH_IOS_MASTER_SECRET=極光推送的master_secret(ios)
JPUSH_APNS_PRODUCTION=true

Modules 目錄下新建目錄 Jpush,然後在 Jpush 目錄下新建檔案 JpushService.php 內容如下:

<?php
namespace App\Modules\Jpush;

use App\BaseService;
use App\Exceptions\BaseResponseException;
use JPush\Client;
use Log;

class JpushService extends BaseService
{
    /**
     * 初始化 JPushClient
     * @param $app
     * @return Client
     */
    public static function newJpushClient($app)
    {
        if ($app == 'android') {
            $appKey = config('Jpush.android_app_key');
            $master = config('Jpush.android_master_secret');
        } elseif ($app == 'ios') {
            $appKey = config('Jpush.ios_app_key');
            $master = config('Jpush.ios_master_secret');
        } else {
            throw new BaseResponseException('APP型別錯誤');
        }
        $client = new Client($appKey, $master);
        return $client;
    }

    /**
     * android 或 ios 透過 別名 給單個裝置或多個裝置推送訊息
     * @param $params
     * @return array
     */
    public static function androidOrIosPushByAlias($params)
    {
        // 推送平臺
        $platform = array_get($params, 'platform');
        // 推送標題
        $title = array_get($params, 'title');
        // 推送內容
        $content = array_get($params, 'content');
        // 通知欄樣式 ID
        $builderId = array_get($params, 'builderId');
        // 附加欄位 (可用於給前端返回,進行其他業務操作,例如:返回orderId,用於點選通知後跳轉到訂單詳情頁面)
        $extras = array_get($params, 'extras');
        // 推送目標 (別名)
        $alias = array_get($params, 'alias');
        // 推送目標 (註冊ID)
        $registrationId = array_get($params, 'registrationId');
        // 推送型別 (1-別名 2-註冊id 3-全部(ios 或 android))
        $type = array_get($params, 'type');

        // 返回一個推送 Payload 構建器
        $push = self::newJpushClient($platform)->push();

        $push->setPlatform($platform);
        switch ($type) {
            // 透過別名推送
            case 1:
                $push->addAlias($alias);
                break;
            // 透過註冊 ID 推送
            case 2:
                $push->addRegistrationId($registrationId);
                break;
            // 推送全部(android 或 ios)
            case 3:
                $push->addAllAudience();
                break;
        }

        $push->androidNotification($content, [ // android 通知
            "title" => $title,
            "builder_id" => $builderId,
            "extras" => $extras,
        ])->iosNotification($content, [ // ios 通知
            "sound" => "sound", // 通知提示聲音,如果無此欄位,則此訊息無聲音提示;
            "badge" => "+1", // 應用角標(APP右上角的數字)0 清除 預設 +1
            "extras" => $extras
        ])->options([ // 推送引數
            'apns_production' => config('Jpush.environment') // APNs 是否生產環境 (ios)
        ]);

        $response = $push->send();

        if ($response['http_code'] != 200) {
            Log::info('推送失敗 by alias',
                compact('response', 'type', 'platform', 'alias', 'registrationId', 'title', 'content')
            );
        }

        return $response;
    }
}

新建路由:

// 手動推送測試(極光推送)
Route::post('message/jpush', 'MessageController@testJpush');

新建控制器並新增方法如下:

  /**
     * 手動測試推送(極光推送)
     */
    public function testJpush()
    {
        // 推送平臺 ios android
        $params['platform'] = 'android';
        // 推送標題
        $params['title'] = '恭喜您中獎了!';
        // 推送內容
        $params['content'] = '恭喜您中獎了!500萬元大獎哦!';
        // 通知欄樣式 ID
        $params['builderId'] = 1;
        // 附加欄位(這裡自定義 Key / value 資訊,以供業務使用)
        $params['extras'] = [
            'orderid' => 13545,
        ];
        // 推送型別 1-別名 2-註冊id 3-全部
        $params['type'] = 1;

        // 註冊ID 可以是單個 也可以是 陣列
        // $params['registrationId'] = '170976fsdas554ewerr98f28';
        // or
        // $params['registrationId'] = [
        //     '170976fsdas554ewerr98f28',
        //     '120c8545we15we46b8929e'
        // ];

        // 別名 可以是單個 也可以是 陣列
        // $params['alias'] = '51651545154';
        // or
        // $params['alias'] = [
        //     '51651545154',
        //     '61654564897',
        // ];

        // 開始推送
        $data = JpushService::androidOrIosPushByAlias($params);

        dd($data);
    }

最後,請求該測試方法,得到返回結果如下:

在 Laravel 中使用 極光推送

在 Laravel 中使用 極光推送

在 Laravel 中使用 極光推送

本文只用到了最常用的通知欄推送,如需其他方式請參考 官方文件

以上方法在 android demo 以及 ios 真機測試過,可用,Good Luck,Thanks♪(・ω・)ノ。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章