• File: PushNotification.php
  • Full Path: /var/www/imaliapitest/app/Classes/PushNotification.php
  • Date Modified: 05/19/2025 4:29 PM
  • File size: 4.72 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

namespace App\Classes;

use Google\Client as GoogleClient;
use Illuminate\Support\Facades\Log;

class PushNotification
{

    private $icon;
    private $image;
    private $title;
    private $shortMsg;
    private $userFirebaseToken;
    private $clickAction;

    public function __construct(
        $title,
        $shortMsg,
        $userFirebaseToken,
        $clickAction = 'com.imali.payapp.payment_NOTICIA',
        $image = '',
        $icon = 'ic_imali_logo_verde_01',
    ) {

        $this->title = $title;
        $this->shortMsg = $shortMsg;
        $this->userFirebaseToken = $userFirebaseToken;
        $this->clickAction = $clickAction;
        $this->icon = $icon;
    }


    //? Send Push notification
    public function sendPush($data = array('sms' => '', 'route' => 'NOTICIA', 'terminal' => 'firebase'))
    {

        if (!$this->userFirebaseToken) {
            Log::info('[ERROR_SEND_PUSH_PAYMENT_PUSH]', ['error' => 'Firebase Token Vazio']);
            return false;
        }

        $notification = array(
            'title' => $this->title,
            'body' => $this->shortMsg,
            'icon' =>  $this->icon,
            'image' =>  $this->image,
            'click_action' => $this->clickAction,
            'color' => '#ffffff'
        );

        $pushResp = $this->pushNotifification($this->userFirebaseToken, $notification, $data);

        if (isset($pushResp['name'])) {
            Log::info('[SUCCESS_SEND_PUSH_PAYMENT_PUSH]', ['data' => $pushResp]);
            return true;
        } else {
            Log::info('[ERROR_SEND_PUSH_PAYMENT_PUSH]', ['error' => $pushResp]);
            return false;
        }
    }

    private function getAccessToken()
    {
        $client = new GoogleClient();
        // $client->setAuthConfig(storage_path('app/imaliapp-5155e-firebase-adminsdk-gv3wp-2713d42c5b.json')); // Caminho do arquivo JSON da conta de serviço
        $client->setAuthConfig($this->getFirebaseAuthConf()); // Caminho do arquivo JSON da conta de serviço
        $client->addScope($_ENV['FIREBASE_MESSAGE_SCOPE']);
        $client->setAccessType('offline');

        $token = $client->fetchAccessTokenWithAssertion();
        return $token['access_token'];
    }

    private function getFirebaseAuthConf()
    {
        return [
            "type" => $_ENV['TYPE'],
            "project_id" => $_ENV['PROJECT_ID'],
            "private_key_id" => $_ENV['PRIVATE_KEY_ID'],
            "private_key" => $_ENV['PRIVATE_KEY'],
            "client_email" => $_ENV['CLIENT_EMAIL'],
            "client_id" => $_ENV['CLIENT_ID'],
            "auth_uri" => $_ENV['AUTH_URI'],
            "token_uri" => $_ENV['TOKEN_URI'],
            "auth_provider_x509_cert_url" => $_ENV['AUTH_PROVIDER_X509_CERT_URL'],
            "client_x509_cert_url" => $_ENV['CLIENT_X509_CERT_URL'],
            "universe_domain" => $_ENV['UNIVERSE_DOMAIN']
        ];
    }

    public function pushNotifification($token, $notification = array(), $data = array())
    {
        $fields = [
            'message' => [
                'token' => $token,
                'android' => [
                    'notification' => $notification
                ],
                "apns" => [
                    "payload" => [
                        "aps" => [
                            "category" => "NEW_MESSAGE_CATEGORY"
                        ]
                    ]
                ],
                'data' => $this->convert_array_values_to_string($data) ?? [],
            ]
        ];

        $headers = array('Authorization: Bearer ' . $this->getAccessToken(), 'Content-Type: application/json');
        $url = $_ENV['FIREBASE_NEW_URL'];

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
        $result = curl_exec($curl);
        curl_close($curl);

        return json_decode($result, true);
    }

    public function setShortMsg($shortMsg)
    {
        $this->shortMsg = $shortMsg;
    }

    public function setClickAction($clickAction)
    {
        $this->clickAction = $clickAction;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }
    public function setFirebaseToken($userFirebaseToken)
    {
        $this->userFirebaseToken = $userFirebaseToken;
    }

    private function convert_array_values_to_string($array)
    {
        return array_map(function ($value) {
            return (string) $value; // Convert each value to a string
        }, array_combine(array_map('strval', array_keys($array)), $array));
    }
}