💻

PHP(Cake4)からFCMでPush通知を送った時の話

2022/03/04に公開約3,600字

過去の案件で自前のPHPアプリケーションからPush通知を送信した話です。
参考記事がだいぶ参考になりましたが、自分なりに補完した内容です。

環境

  • Windows(10)
  • Firebase
  • PHP(7.3)
    • Cake(4.3.5)
  • Composer

事前準備

  • Firebaseの登録
  • Push通知を受け取れるアプリ
    受け取れなくても確認はできます。

手順

firebaseの準備

1. 送信者IDを取得する

送信者IDを取得します。

2. 認証用のJSONを取得する

赤枠のボタンをクリックして認証用のJSONを取得します。

後程[file_get_contents]で内容を読み込みますので、Cakeプロジェクト内とかに配置してください。

Cakeアプリの準備

前提として、php.iniなどの設定は完了していることを想定してます。

1. Cakeプロジェクトを作成

コマンドプロンプトを開いて、下記のコマンドを実行します。

composer create-project --prefer-dist cakephp/app {任意のプロジェクト名}

2. Googleクライアントをインストール

PHPには公式のFCM用FirebaseAdminSDKが提供されていないので、GoogleApiを使用して認証を行うので、Composerを使用してGoogleクライアントをインストールします。

cd {プロジェクト名}
composer require google/apiclient:^2.12.1

3. バッチプロジェクトを作成

cd {プロジェクト名}
bin\cake bake command {任意のファイル名}

とりあえず、生成したPHPファイルの中身は、こんな感じに修正します。

生成したPHPファイル.php
<?php
declare(strict_types=1);

namespace App\Command;

use Cake\Command\Command;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
use Google_client;

/**
 * PushNotification command.
 */
class PushNotificationCommand extends Command
{
    /**
     * Implement this method with your command's logic.
     *
     * @param \Cake\Console\Arguments $args The command arguments.
     * @param \Cake\Console\ConsoleIo $io The console io
     * @return null|void|int The exit code or null for success
     */
    public function execute(Arguments $args, ConsoleIo $io)
    {
        $authJson = file_get_contents({認証用のJSONのファイルパス});
        $authData = json_decode($authJson, true);

        $googleClient = new Google_client;
        $googleClient->useApplicationDefaultCredentials();
        $googleClient->setAuthConfig($authData);
        $googleClient->addScope('https://www.googleapis.com/auth/firebase.messaging');
        $httpClient = $googleClient->authorize();

        $data = [
            'message' => 
                [
                    'token' => '{Push通知を送りたい端末から取得したToken}',
                    'notification' => 
                        [
                            'body' => '通知がありまする。',
                            'title' => 'タイトルでござる'
                        ]
                ]
            ];
        $fcmApi = 'https://fcm.googleapis.com/v1/projects/{取得した送信者ID}/messages:send';
        $result = $httpClient->post($fcmApi, ['json' => $data]);
        $this->log(print_r($result, true), LOG_DEBUG);
    }
}

4. 動作確認

下記のコマンドを実行します。

bin\cake {作成したコマンド}

コンソールに下記のようにレスポンスとなっていれば送信できているはずです。

2022-03-04 02:59:08 notice: GuzzleHttp\Psr7\Response Object
(
    [reasonPhrase:GuzzleHttp\Psr7\Response:private] => OK
    [statusCode:GuzzleHttp\Psr7\Response:private] => 200
    [headers:GuzzleHttp\Psr7\Response:private] => Array
        (
	:以下略

ちなみに、アプリではこんな感じ

Firebase側の確認をするのでしたら、
エンゲージメント>Cloud Messaging>レポート
にある『送信数』がカウントアップされていると思います。

あとがき

過去に同じことしていらっしゃる方がいて大変ありがたいですね。
実はJava(Spring)でも同じことをしたのですが、PHPの情報もあってよかったです。
にしても、GoogleAPIはもう少し踏み込んで理解したいと思いました。
他のアプリケーションを作ってるときも出現したので・・・笑

今回Flutterアプリも一緒に作ったのですが、以前受け取り用アプリ作った時より、手順変わってたので、別途記事に出来たらします。

参考記事

Github

pushnotification_sample

Discussion

ログインするとコメントできます