メモ > 技術 > サービス: AmazonSNS > Android: アプリにPHPからPushを送信
Android: アプリにPHPからPushを送信
主に以下の記事を参考に進める。
PHP/LaravelでFCMpush通知を実装した件 #PHP - Qiita
https://qiita.com/takapon21/items/47a72472541650fe3b1a
以下のとおり、Composerを使えるようにする。(PHP7.4以上が必要。)
$ cd /path/to/firebase
$ composer
Composer version 2.4.4 2022-10-27 14:39:29
以下のとおり、必要ライブラリをインストールする。(バージョン指定は無しでいいかもしれない。)
$ composer require google/apiclient:^2.15.0
23 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
6 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found
続いて、Pushを送信するためのPHPプログラムを作成する。
pushtest1-aeb26-c00a0b10addc.json の情報をもとにして、以下のプログラムを作成する。(ファイルの文字コードは UTF-8N にする。)
<?php
require_once 'vendor/autoload.php';
$googleClient = new Google_client;
$googleClient->useApplicationDefaultCredentials();
// 認証情報
$googleClient->setAuthConfig([
'type' => 'service_account',
'project_id' => 'pushtest1-aeb26',
'private_key_id' => 'c00a0b10ad00000000000000000000baebe01a4f',
'private_key' => "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnoXNCLluQ4ikO\nY7mxImNS9ft4LFWCXDUqkPajWgMYwJzyLd〜中略〜hx0RWLhN9\n7mZwLUZfLvTKeCalOeDx61eCn4cnHRhpIukGzV4NdF1KwD+v3Jpo2Ot74/pGwSWl\nKUYqj6EYTMsXropj5TFXGg0=\n-----END PRIVATE KEY-----\n",
'client_email' => 'firebase-adminsdk-ik32h@pushtest1-aeb26.iam.gserviceaccount.com',
'client_id' => '101260000000000064216',
'auth_uri' => 'https://accounts.google.com/o/oauth2/auth',
'token_uri' => 'https://oauth2.googleapis.com/token',
'auth_provider_x509_cert_url' => 'https://www.googleapis.com/oauth2/v1/certs',
'client_x509_cert_url' => 'https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-ik32h%40pushtest1-aeb26.iam.gserviceaccount.com',
]);
// FCMにアクセスするためのスコープ
$googleClient->addScope('https://www.googleapis.com/auth/firebase.messaging');
// 認証されたHTTPクライアントを取得
$httpClient = $googleClient->authorize();
// 送信対象と送信内容を作成
$project = 'https://fcm.googleapis.com/v1/projects/pushtest1-aeb26/messages:send';
$tokens = [
'envzgXQ9Tm0000000000-K:APA91bFp66znOyBVMEkFCBRXhh-ssW2iQeDnXXKDGy-Ey-cN-T9FlaXFk0eKHlvfeYtoOYQjhqFN3WayxCtFwhZnOm48Mx99LIiXD2x7YQwZ8wwYw-X756tTgRAB1QvGDbdZBcp7_x69',
];
$title = 'プッシュ通知のテスト';
$body = 'これはプッシュ通知のテストです。';
foreach ($tokens as $token) {
try {
// FCMにPOSTリクエストを送信
$response = $httpClient->post($project, [
'json' => [
'message' => [
'token' => $token,
'notification' => [
'title' => $title,
'body' => $body,
],
'apns' => [
'payload' => [
'aps' => [
'alert' => [
'title' => $title,
'body' => $body
]
]
]
],
"android" => [
"priority" => "high",
"notification" => [
"sound" => "default",
]
],
]
]
]);
// 応答の確認
if ($response->getStatusCode() == 200) {
echo "送信成功: Token = {$token}\n";
} else {
echo "送信失敗: Token = {$token}, HTTP ステータスコード = " . $response->getStatusCode() . "\n";
}
} catch (\GuzzleHttp\Exception\RequestException $e) {
// 通信エラーなどリクエスト送信時のエラー
if ($e->hasResponse()) {
$errorMessage = $e->getResponse()->getBody()->getContents();
echo "送信失敗: Token = {$token}, エラーメッセージ = {$errorMessage}\n";
} else {
echo "送信失敗: Token = {$token}, ネットワークエラーまたはその他のエラー\n";
}
} catch (\Exception $e) {
// その他のエラー
echo "送信失敗: Token = {$token}, エラーメッセージ = " . $e->getMessage() . "\n";
}
}
echo "Complete\n";
以下のとおり実行して、本番アプリにプッシュ通知を送信できることを確認できた。
$ php firebase.php
これなら、数日経ってもアクセストークンが失効されることは無かった。
一度に複数端末へ送信したい場合、上記のように送信先を配列で定義して、ループで順に送信するといい。
もしくは、FCMのトピックを使って一斉送信するといい。(未検証。)
なおPHP7環境だと、以下のエラーになるので注意。
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.3.19. in /path/to/firebase/vendor/composer/platform_check.php on line 24
この場合、PHPを8にアップデートするか、別途PHP8.1をインストールして実行するといい。
$ /path/to/php81/php firebase.php
■トラブル事例1
Composer実行時に以下のエラーになった場合、
Problem 1
- Root composer.json requires google/apiclient 2.15.0 -> satisfiable by google/apiclient[v2.15.0].
- google/apiclient v2.15.0 requires php ^7.4|^8.0 -> your php version (7.3.19) does not satisfy that requirement.
一例だがWindows環境では、以下のようにPHP8.1を参照できるようにするといい。
C:\localhost\home\test\public_html\firebase\composer.bat
@ECHO OFF
C:\php81\php.exe "%~dp0composer.phar" %*
またPHP7.3環境では、「composer require google/apiclient」とバージョン指定なしならインストールできることを確認できた。
プッシュ通知の送信もできた。
■トラブル事例2
Composer実行時に以下のエラーになった場合、
The openssl extension is required for SSL/TLS protection but is not available.
If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the 'disable-tls' option to true.
以下のページを参考にphp.iniを調整する。
composerのSSLのエラーを解決する
https://digirakuda.org/blog/2018/06/04/post-251/
■トラブル事例3
プッシュ通知送信時に以下のエラーになった場合、
PHP Warning: openssl_sign(): Supplied key param cannot be coerced into a private key in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php on line 254
Warning: openssl_sign(): Supplied key param cannot be coerced into a private key in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php on line 254
PHP Fatal error: Uncaught DomainException: OpenSSL unable to sign data in /path/to/firebase/vendor/firebase/php-jwt/src/JWT.php:256
鍵の指定が正しくできているか確認する。
鍵データには「\n」が含まれるので、正しく改行と解釈させるために、ダブルクォートでくくって指定する。
【Laravel/PHP】openssl_sign(): supplied key param cannot be coerced into a private key の 対応方法
https://engineer-jose-blog.com/%E3%80%90php%E3%80%91openssl_sign-supplied-key-param-cannot-be-coerce...
■AmazonSNSを使う準備
通知の動作を確認できたら、MyFirebaseMessagingService.kt にある以下の処理を修正しておく。(AmazonSNSからのメッセージを受け取る準備。)
★この修正を行なった後でも、問題無く通知を受け取れるみたい?
showNotification("通知タイトル", "通知メッセージ")
↓
showNotification("PushTest1", remoteMessage.data["default"])
※ひととおり試してから、上記の調整を行ったうえでプッシュ通知を再送信すると、普通にメッセージが表示された?気のせい?
Firebase側で良い感じに調整されたのか、別のアプリに届いたなど何かの勘違いか。
何度か試していると、「通知タイトル」「通知メッセージ」になったり、また「テストのタイトル」「テストのテキスト」に戻ったりするような?
※そもそも「FirebaseからPushを送信した場合、このキーで送られてくる」はあるはずなので、改めて調査したい。
後述の「AmazonSNS: PHPプログラムの作成」にある「補足」も参照。