203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
defined('BASEPATH') or exit('No direct script access allowed');
 | 
						|
 | 
						|
/**
 | 
						|
 * FCM simple server side implementation in PHP
 | 
						|
 *
 | 
						|
 * @author Abhishek
 | 
						|
 */
 | 
						|
class Fcm
 | 
						|
{
 | 
						|
 | 
						|
    /** @var string     push message title */
 | 
						|
    private $title;
 | 
						|
 | 
						|
    /** @var string     message */
 | 
						|
    private $message;
 | 
						|
    
 | 
						|
    /** @var string     URL String */
 | 
						|
    private $image;
 | 
						|
 | 
						|
    /** @var array     Custom payload */
 | 
						|
    private $data;
 | 
						|
 | 
						|
    /**
 | 
						|
     * flag indicating whether to show the push notification or not
 | 
						|
     * this flag will be useful when perform some opertation
 | 
						|
     * in background when push is recevied
 | 
						|
     */
 | 
						|
 | 
						|
    /** @var bool     set background or not */
 | 
						|
    private $is_background;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to set the title
 | 
						|
     *
 | 
						|
     * @param string    $title  The title of the push message
 | 
						|
     */
 | 
						|
    public function setTitle($title)
 | 
						|
    {
 | 
						|
        $this->title = $title;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to set the message
 | 
						|
     *
 | 
						|
     * @param string    $message    Message
 | 
						|
     */
 | 
						|
    public function setMessage($message)
 | 
						|
    {
 | 
						|
        $this->message = $message;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to set the image (optional)
 | 
						|
     *
 | 
						|
     * @param string    $imageUrl    URI string of image
 | 
						|
     */
 | 
						|
    public function setImage($imageUrl)
 | 
						|
    {
 | 
						|
        $this->image = $imageUrl;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to set the custom payload (optional)
 | 
						|
     *
 | 
						|
     * eg:
 | 
						|
     *      $payload = array('user' => 'user1');
 | 
						|
     *
 | 
						|
     * @param array    $data    Custom data array
 | 
						|
     */
 | 
						|
    public function setPayload($data)
 | 
						|
    {
 | 
						|
        $this->data = $data;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to specify if is set background (optional)
 | 
						|
     *
 | 
						|
     * @param bool    $is_background
 | 
						|
     */
 | 
						|
    public function setIsBackground($is_background)
 | 
						|
    {
 | 
						|
        $this->is_background = $is_background;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Generating the push message array
 | 
						|
     *
 | 
						|
     * @return array  array of the push notification data to be send
 | 
						|
     */
 | 
						|
    public function getPush()
 | 
						|
    {
 | 
						|
        $res = array();
 | 
						|
        $res['data']['title'] = $this->title;
 | 
						|
        $res['data']['is_background'] = $this->is_background;
 | 
						|
        $res['data']['message'] = $this->message;
 | 
						|
        //$res['data']['image'] = $this->image;
 | 
						|
        $res['data']['payload'] = $this->data;
 | 
						|
        $res['data']['timestamp'] = date('Y-m-d G:i:s');
 | 
						|
        return $res;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to send notification to a single device
 | 
						|
     *
 | 
						|
     * @param   string   $to     registration id of device (device token)
 | 
						|
     * @param   array   $message    push notification array returned from getPush()
 | 
						|
     *
 | 
						|
     * @return  array   array of notification data and to address
 | 
						|
     */
 | 
						|
    public function send($to, $message)
 | 
						|
    {
 | 
						|
        $fields = array(
 | 
						|
            'to' => $to,
 | 
						|
            // 'data' => $message,
 | 
						|
            'notification' => $message,
 | 
						|
        );
 | 
						|
        return $this->sendPushNotification($fields);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to send notification to a topic by topic name
 | 
						|
     *
 | 
						|
     * @param   string   $to     topic
 | 
						|
     * @param   array   $message    push notification array returned from getPush()
 | 
						|
     * 
 | 
						|
     * @return  array   array of notification data and to address (topic)
 | 
						|
     */
 | 
						|
    public function sendToTopic($to, $message)
 | 
						|
    {
 | 
						|
        $fields = array(
 | 
						|
            'to' => '/topics/' . $to,
 | 
						|
            'data' => $message,
 | 
						|
        );
 | 
						|
        return $this->sendPushNotification($fields);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function to send notification to multiple users by firebase registration ids
 | 
						|
     *
 | 
						|
     * @param   array   $to         array of registration ids of devices (device tokens)
 | 
						|
     * @param   array   $message    push notification array returned from getPush()
 | 
						|
     * 
 | 
						|
     * @return  array   array of notification data and to addresses
 | 
						|
     */
 | 
						|
    public function sendMultiple($registration_ids, $message)
 | 
						|
    {
 | 
						|
        $fields = array(
 | 
						|
            'registration_ids' => $registration_ids,
 | 
						|
            'data' => $message,
 | 
						|
        );
 | 
						|
 | 
						|
        return $this->sendPushNotification($fields);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Function makes curl request to firebase servers
 | 
						|
     *
 | 
						|
     * @param   array   $fields    array of registration ids of devices (device tokens)
 | 
						|
     * 
 | 
						|
     * @return  string   returns result from FCM server as json
 | 
						|
     */
 | 
						|
    private function sendPushNotification($fields)
 | 
						|
    {
 | 
						|
 | 
						|
        $CI = &get_instance();
 | 
						|
        $CI->load->config('androidfcm'); //loading of config file
 | 
						|
 | 
						|
        // Set POST variables
 | 
						|
        $url = $CI->config->item('fcm_url');
 | 
						|
 | 
						|
        $headers = array(
 | 
						|
            'Authorization: key=' . $CI->config->item('key'),
 | 
						|
            'Content-Type: application/json',
 | 
						|
        );
 | 
						|
        // Open connection
 | 
						|
        $ch = curl_init();
 | 
						|
 | 
						|
        // Set the url, number of POST vars, POST data
 | 
						|
        curl_setopt($ch, CURLOPT_URL, $url);
 | 
						|
 | 
						|
        curl_setopt($ch, CURLOPT_POST, true);
 | 
						|
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | 
						|
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 | 
						|
 | 
						|
        // Disabling SSL Certificate support temporarly
 | 
						|
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 | 
						|
 | 
						|
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
 | 
						|
 | 
						|
        // Execute post
 | 
						|
        $result = curl_exec($ch);
 | 
						|
        if ($result === false) {
 | 
						|
            die('Curl failed: ' . curl_error($ch));
 | 
						|
        }
 | 
						|
 | 
						|
        // Close connection
 | 
						|
        curl_close($ch);
 | 
						|
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
} |