FCM Server - Push notify from app server to client device with PHP
Bài đăng này đã không được cập nhật trong 3 năm
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à :
- 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.
- 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
Bình luận
Bai viet hay moi toi ong de lo bo thong tin cua minh trong bai viet roi ha ha. Cai nay free hinh nhu 20k request / ngay thi phai. Co the dung 1 thang nua thay the thang nay do la https://aws.amazon.com/sns/
@hunghanam Thank ông đã chia sẻ, còn về thông tin để lộ thì xin đính chính chút là trong quá viết bài, một số hình ảnh tôi lười chụp lên search trên mạng ảnh tương tự luôn
, bình thường nếu là của tôi thì tôi sẽ làm mờ phần thông tin đó.
ngon hi hi
Thực ra thì kết hợp với Google docs (TestListCategoryAbbott) với ví dụ của bạn thì mình mới hiểu. Theo mình thì bạn nên nêu rõ, bạn đang sử dụng api gì của Google (cũ - legacy hay mới - v1), sử dụng loại protocal nào (PHP hay XMPP - nếu được thì cho biết thêm XMPP khác gì với PHP), để người đọc tiện theo dõi, cũng như là có được cái nhìn tổng thể. Trong đoạn code của bạn thì ghi chú có lẽ hơi ít, nhưng đoán + đọc tài liệu miếng thì cũng hiểu được. Dù sao đi nữa, cũng cám ơn bạn nhiều
.
a cho e hỏi chút ạ.giờ e muốn set time sẽ push thì có đc ko a.e thấy mặc định đang là send now
Theo như a biết thì không được e ạ
Cơ mà thông thường nếu không có vấn đề gì thì sau khi em gọi push() thì notify sẽ được gửi đi luôn nên à em có thể set time push ở chính server của em bằng cách tạo 1 task để nó gọi push() vào thời gian em muốn.
vâng tks a.nó ko như onesignal a nhỉ.vấn đề là cái thời gian push nó ko cố định mà nó thay đổi theo thời gian nhận đc từ client a ạ
Mình gặp vấn đề về phần này bạn chỉ giao giúp được không ib mình thông tin mình liên hệ lại
@linzlinz001 bạn cứ raise vấn đề bạn đang gặp lên đi. Nếu mình biết mình sẽ trả lời, còn không thì cũng sẽ có nhiều thánh có thể giúp bạn được đó
Hiện tại em có sử dụng 1 app điện thoại có sử dụng FCM để chứng thực otp
Có cách nào mình có thể bắn otp tới fcm token đã được đăng ký khi login để lấy mã otp xác thực không ạ.
@linzlinz001
mình cũng chưa có kinh nghiệm làm về OTP, bạn thử đăng câu hỏi vào đây, để mọi người cùng thảo luận đc không. https://viblo.asia/questions/ask Mình nghĩ sẽ có nhiều câu trả lời tốt cho câu hỏi của bạn.