FCM Server - Push notify from app server to client device with PHP

1. Giới thiệu về Firebase Cloud Messaging Server (FCM)

Notify là gì ? chắc các bạn đều biết cả và không còn lạ lẫm gì nếu các bạn đã từng dùng app trên điện thoại, web app... Hôm nay mình sẽ đi tìm hiểu về Coud Messaging Server, cách gửi một message từ app server tới thiết bị android bằng PHP. Hiểu một cách đại khái một chút thì server side của Firebase Cloud Messaging Server bao gồm hai phần đó là :

  1. FCM connection servers cung cấp bới Google. Những servers này sẽ nhận messages từ một app server và gửi đến cho các app đang chạy theo một cái id gọi là token_device, token_device được sinh ra từ lần đầu cài app, và app server sẽ lưu device_token đó để khi nào cần bắn cho user nào thì sẽ bắn theo token đó, tất nhiên firebase đảm bảo được việc token này là unique.
  2. Một app server cái mà bạn cẩn triển khai trên chính môi trường của bạn, nói cách đễ hiểu đó là source đặt trên host của bạn. App server này sẽ gửi dữ liệu cần chuyển đến điện thoại thông qua Firebase, sử dụng một trong hai phương thức HTTP hoặc XMPP, mình sẽ tình hiểu với HTTP trước vì nó dễ gần với mọi người.

2. Làm thế nào để gửi được message thông qua FCM

Tiếp đó, bạn cần đăng ký một app với firebase, điều đó tương tự như việc bạn đăng ký một hộ chiếu, để App server của bạn có thể kết nối và Firebase có thể nhận diện được server của bạn. Một cái bắt tay giữa hai anh bạn (server) trước khi cùng nhau làm một việc gì đó thôi mà. Bạn có thể tạo app tại link sau: https://console.firebase.google.com/?hl=vi Sau khi tạo xong, bạn click vào app, click tiếp vào hình bánh xe và chọn Project setting, sau đó chuyển sang tab Cloud Messaging và copy dòng ** Legacy Server key** để làm chia khóa giúp server của bạn có thể kết nối được với Firebase Cloud Messaging Server. Đến đây đã đủ thủ tục để push notify rồi. Để gửi một message, bạn cần tạo gửi một request method POST tới https://fcm.googleapis.com/fcm/send Một tin nhắn gửi đi sẽ bao gồm 2 pahafn chính là HTTP header và the HTTP body.

HTTP header phải chứa những thông tin sau:

  • Authorization: key=YOUR_SERVER_KEY
  • Content-Type: application/json for JSON; application/x-www-form-urlencoded;charset=UTF-8 for plain text. Ví dụ :
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

Ở server của mình, mình sẽ dùng CURL của PHP request tới Firebase như sau:

function sendCloudMessaseToAndroid($deviceToken = "", $message = "", $push_data = array()) {        
    $url = 'https://fcm.googleapis.com/fcm/send ';
    $serverKey = "*** Key mà ở trên mình đã bảo bạn copy ra ý ***";
    $msg = array(
        'message' => $message,
        'data' => $push_data
    );            
    $fields = array();
    $fields['data'] = $msg;
    if (is_array($deviceToken)) {
        $fields['registration_ids'] = $deviceToken;
    } else {
        $fields['to'] = $deviceToken;
    }
    $headers = array(
        'Content-Type:application/json',
        'Authorization:key=' . $serverKey
    );   
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('FCM Send Error: '  .  curl_error($ch));
    }
    curl_close($ch);
    return $result;
}   

Ok rồi, tới đấy mình đã tạo được một chức năng giúp kết nối từ server của mình với Firebase Cloud Message và gửi data tới cho điện thoại theo device_token rồi đó. Việc còn lại của bạn là kiếm 1 token_device và test nó nhé. Cảm ơn các bạn đã xem bài viết, bài viết được mình viết lại dưới góc nhìn chủ quan nên k tránh gói sai xót, rất mong nhận được nhận xét và chỉnh sửa từ phía mọi người (bow)(bow)(bow).

3. Tham khảo

https://firebase.google.com/docs/cloud-messaging/server?hl=vi

All Rights Reserved