worknova.manus/cron/push_notification.php
LAPTOP-V9RRD1TL\Michelle's Computer f8f8fcaf96 first commit
2025-07-21 21:38:17 +08:00

140 lines
4.9 KiB
PHP

<?php
include '../connect/cms-config.php' ;
include '../requires/function.php' ;
include_once( '../vendor/autoload.php' ) ;
use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$credentialsPath = 'hr-system-b0af6-firebase-adminsdk-u5wel-5bcb3596d4.json' ; // Replace with your actual path
$projectId = '517510861795' ; // Your Firebase project ID or project number
function getAccessToken($credentialsPath) {
$scopes = ['https://www.googleapis.com/auth/firebase.messaging'];
// Get OAuth2 token using service account credentials
$credentials = json_decode(file_get_contents($credentialsPath), true);
$client = new Google_Client();
$client->setAuthConfig($credentials);
$client->setScopes($scopes);
// Get the token
$accessToken = $client->fetchAccessTokenWithAssertion()['access_token'];
return $accessToken;
}
// single send
function sendFCMNotification($projectId, $deviceTokens, $messageTitle, $messageBody, $dataPayload, $credentialsPath) {
$accessToken = getAccessToken($credentialsPath);
$url = 'https://fcm.googleapis.com/v1/projects/' . $projectId . '/messages:send';
$client = new \GuzzleHttp\Client();
foreach ($deviceTokens as $deviceToken) {
$message = [
'message' => [
'token' => $deviceToken,
'notification' => [
'title' => $messageTitle,
'body' => $messageBody
],
'android' => [
'notification' => [
'sound' => 'default' // Use this for Android specific sound settings
]
],
'apns' => [
'payload' => [
'aps' => [
'sound' => 'default' // Use this for iOS specific sound settings
]
]
],
'data' => $dataPayload // Custom data payload
]
];
$headers = [
'Authorization' => 'Bearer ' . $accessToken,
'Content-Type' => 'application/json',
];
print_r($message) ;
print_r($headers) ;
try {
$response = $client->post($url, [
'headers' => $headers,
'json' => $message
]);
echo 'Notification sent to ' . $deviceToken . ': ' . $response->getBody()->getContents() . PHP_EOL;
} catch (RequestException $e) {
if ($e->hasResponse()) {
echo 'Error sending to ' . $deviceToken . ': ' . $e->getResponse()->getBody()->getContents() . PHP_EOL;
} else {
echo 'Error: ' . $e->getMessage() . PHP_EOL;
}
}
}
}
function pushToNotificationUser( $type, $type_id, $staff_id, $title, $message, $cron_id = '', $inbox_id = '' ){
global $mysqli, $projectId, $credentialsPath ;
$push = array() ;
$notifications_query = $mysqli->query( "SELECT notificationid, notification, badge FROM staff_notification
WHERE deleted_at IS NULL AND staff_id = '".$staff_id."' ORDER BY notificationid DESC LIMIT 1") ;
if ( $notifications_query->num_rows > 0 ){
$notification = $notifications_query->fetch_assoc() ;
$token_id = $notification['notificationid'] ;
$badge = ( $notification['badge'] + 1 ) ;
$is_create = true ;
if ( $inbox_id != '' && $inbox_id > 0 ){
$is_create = false ;
}
if ( $is_create ){
$mysqli->query( "INSERT INTO inbox ( staff_id, from_table, from_id, receiver_type, view_format, title, description, created_at ) VALUES ( '/".$staff_id."/', '".$type."', '".$type_id."', '3', 'message', '".$title."', '".$message."', '".TODAYDATE."' )" ) ;
$inbox_id = $mysqli->insert_id ;
$mysqli->query( "INSERT INTO staff_inbox_view ( inbox_id, staff_id, is_read ) VALUES ( '".$inbox_id."', '".$staff_id."', '0' )" ) ;
$mysqli->query( "UPDATE staff_notification_cron SET inbox_id = '".$inbox_id."' WHERE cron_id = '".$cron_id."'" ) ;
}
sendFCMNotification( $projectId, [ $notification['notification'] ], dataFilter( $title ), dataFilter( $message ), [
'go_messageid' => '',
'go_page' => '',
'go_param' => ''
], $credentialsPath ) ;
// update badge
$mysqli->query("UPDATE staff_notification SET badge = '".$badge."' WHERE notificationid = '".$token_id."'") ;
}
}
$select = $mysqli->query( "SELECT * FROM staff_notification_cron
WHERE deleted_at IS NULL AND is_sent = 'no' LIMIT 50" ) ;
if ( $select->num_rows > 0 ){
while ( $row = $select->fetch_assoc() ){
pushToNotificationUser( $row['type'], $row['type_id'], $row['staff_id'], $row['title'], $row['message'], $row['cron_id'], $row['inbox_id'] ) ;
$mysqli->query( "UPDATE staff_notification_cron SET is_sent = 'yes' WHERE cron_id = '".$row['cron_id']."'" ) ;
}
}
?>