I'm trying to send push messages from PHP but I'm getting the following error message:
{"multicast_id":4832091122368281316,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
I suppose there is a mismatch with the browser ID but I don't know which one I'm supposed to use.
When I register the push notification through JS, I receive the following payload on my PHP server:
{"endpoint":"https://fcm.googleapis.com/fcm/send/XXX:YYY","expirationTime":null,"keys":{"p256dh":"ZZZ","auth":"AAA"}}
To send the message in PHP, I have used the following code (found on stackexchange):
function sendnotification($to, $title, $message, $img = "", $datapayload = "")
{
$msg = urlencode($message);
$data = array(
'title'=>$title,
'sound' => "default",
'msg'=>$msg,
'data'=>$datapayload,
'body'=>$message,
'color' => "#79bc64"
);
if($img)
{
$data["image"] = $img;
$data["style"] = "picture";
$data["picture"] = $img;
}
$fields = array(
'to'=>$to,
'notification'=>$data,
'data'=>$datapayload,
"priority" => "high",
);
$headers = array(
'Authorization: key=MYSERVERKEY',
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
curl_close( $ch );
return $result;
I think I'm using the right server key, when I don't, I get a different error message.
For $to, I'm wondering what I should use. I thought I had to use XXX:YYY after the endpoint but it's not working (XXX is very short, YYY is very long). I have also tried ZZZ and AAA but it doesn't help either.
My questions:
What kind of ID should I be using to send the message to one specific browser ?
What should I do to send a notification to all registered browser?
Thanks!
Well you have to make sure store the token of your user browser, which you can only get when they allow on request prompt e.g.
On user Allow the request it generate the token which look like as below
This token you can use for send the message to specific browser.
So in your code where as your $to = it should be the device token.
i.e. "to": "<DEVICE_REGISTRATION_TOKEN>"
I am building a Facebook messenger bot using PHP, I have gotten to a stage and am confused.
I asked a question and expecting an answer, this works but want a condition such that when answer is provided to that particular question, another question shows.
My problem is tracking the exact questions. I can't do it since I supposed I can't use text and payload. Please how I do this?
$senderId = $input['entry'][0]['messaging'][0]['sender']['id'];
$messageText = $input['entry'][0]['messaging'][0]['message']['text'];
if ($messageText == "origin"){
$output = "Please enter your phone number";
$response = [
'recipient' => ['id' => $senderId],
'message' => ['text' => $output]
];
} //How to specify other conditions
$ch = curl_init($url);
/* curl setting to send a json post data */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($message != "") {
curl_exec($ch); // user will get the message
}
curl_close($ch);
I am using FCM to send push notification to IOS app, IOS dev provide me device token and SERVER_KEY, I search on google and tried different solutions but nothing worked for me , So let me know what is wrong with my code, Getting error {
"multicast_id": 8569689262516537799,
"success": 0,
"failure": 1,
"canonical_ids": 0,
"results": [
{
"error": "InvalidRegistration"
}
]
}
Thanks in advance
$ch = curl_init("https://fcm.googleapis.com/fcm/send");
//The device token.
$token = "c2420d68a0838d8fb6b26ef06278e899de73a149e93c9fe13df11f70f3dd5cc1"; //token here
//Title of the Notification.
$title = "Carbon";
//Body of the Notification.
$body = "Bear island knows no king but the king in the north, whose name is stark.";
//Creating the notification array.
$notification = array('title' => $title, 'text' => $body);
//This array contains, the token and the notification. The 'to' attribute stores the token.
$arrayToSend = array('to' => $token, 'notification' => $notification, 'priority' => 'high');
//Generating JSON encoded string form the above array.
$json = json_encode($arrayToSend);
//print_r($json); die();
//Setup headers:
$headers = array();
$headers[] = 'Content-Type: application/json';
$headers[] = 'Authorization: key=AAAAx6P1Nz0:APA91bEqkVCA9YRw9gpUvmF8UOVrYJ5T8672wfS_I7UAT3dA0g1QS7z-Z4fpn8JMiJ5kFRz9ZGc2K64hKZG-4__PAUqm733hqNDuFCDv9'; // key here
//Setup curl, add headers and post parameters.
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//Send the request
$response = curl_exec($ch);
//Close request
print_r($response);
curl_close($ch);
//return $response;
token number ur sending is most probably wrong. try "/topics/all" this will send notification to all the users registered.
With the new update, FCM is now going to be used.
I tried the sample app from git and it's working all fine. I can send notifications from the console.
But I want to send the notification from the server after a certain event is triggered. I followed the same approach like in GCM but it's not working.
05-20 20:40:58.941 30132-30919/com.google.firebase.quickstart.fcm E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.google.firebase.quickstart.fcm, PID: 30132
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.messaging.RemoteMessage$Notification.getBody()' on a null object reference
at com.google.firebase.quickstart.fcm.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:53)
at com.google.firebase.messaging.FirebaseMessagingService.zzo(Unknown Source)
at com.google.firebase.messaging.FirebaseMessagingService.zzn(Unknown Source)
at com.google.firebase.messaging.FirebaseMessagingService.zzm(Unknown Source)
at com.google.firebase.iid.zzb$2.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
05-20 20:40:59.118 30132-30279/com.google.firebase.quickstart.fcm E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9e83390
Am following this PHP Script to send the notification.
If I try to execute the script, I get the following result.
{"multicast_id":4679427854122301046,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1463757518309261%31bd1c96f9fd7ecd"}]}
NOTE : I went through their docs and modified the code is gist to have only body and title. Even then it's not working.
You can use this complete code
<?php
function sendFCM($mess,$id) {
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array (
'to' => $id,
'notification' => array (
"body" => $mess,
"title" => "Title",
"icon" => "myicon"
)
);
$fields = json_encode ( $fields );
$headers = array (
'Authorization: key=' . "AIzaSyA9vpL9OuX6moOYw-4n3YTSXpoSGQVGnyM",
'Content-Type: application/json'
);
$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_POSTFIELDS, $fields );
$result = curl_exec ( $ch );
curl_close ( $ch );
}
?>
Pass message and token id as a parameter to the sendFCM($mess,$id) call.
I tried this and worked:
<?php
$ch = curl_init("https://fcm.googleapis.com/fcm/send");
$header=array('Content-Type: application/json',
"Authorization: key=GoGdfsflknEFñslknaglksjfnklj");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{ \"notification\": { \"title\": \"Test desde curl\", \"text\": \"Otra prueba\" }, \"to\" : \"SGferg-qWEFWbI:dflñkndfakllvakrgalkgjdgjslfkgjdglksdjflksjglkjlkñerhTHDFSHFZDHzdfakjsdhskjhgkjashfdasjdkf\"}");
curl_exec($ch);
curl_close($ch);
?>
This is the result:
{"multicast_id":4913280949692448120,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1473389987003950%ab9a0bb6ab9a0bb6"}]}
In order to receive the notification using remoteMessage.getNotification().getBody(), you have to use the predefined set of key option for notification.
In this case, "notification" is the key word.
The JSON response has to be formatted like this.
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
}
}
You can also send notification and data payload in the same JSON response
{
"to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
see this: https://firebase.google.com/docs/cloud-messaging/concept-options#messages-with-both-notification-and-data-payloads
From the php gist you are sending a data only message. Your receiver is expecting a notification message so when you get the notification from the remote message it will be null, resulting in a NPE when you call getBody.
Send a notification message and it should work as expected. See notification message requirements here:
https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
I was facing the same issue and after spending some time trying to find out the cause , my observation was --
Since the "notification" field is JSON representation of the RemoteMessage.Notification .
If you set any of the predefined fields of the Notification class in the "notification" field , on client side the JSON is successfully parsed and you have a non-null value for RemoteMessage.getNotification() on which you can call the getBody() / getTopic() / getIcon().
But if you don't set any field of the Notification class in the "notification" json field, the parsing to class fails and you will have a null value for RemoteMessage.getNotification()
So, any of the following three JSONs is a valid POST body for pushing a RemoteMessage.Notification ( in addition to the two examples shared by Andrea in earlier answer ) , i.e. these three won't cause the above NPE
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
"body" : "Notification Message Body"
}
}
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
"title" : "Notification Title"
}
}
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
"icon" : "Notification icon"
}
}
And none of the following three are valid for pushing a RemoteMessage.Notification -
Doesn't have the "notification" field
{
"to" : "<<FIREBASE_INSTANCE_ID>>"
}
"notification" field is an empty json
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
}
}
"notification" field has some key value pairs , but none of the fields defined in RemoteMessage.Notification class
{
"to" : "<<FIREBASE_INSTANCE_ID>>",
"notification" : {
"messageText" : "Notification Message Text",
"messageBody" : "Notification Message Body"
}
}
function send_fcm($tokens,$message)
{
$url = 'https://fcm.googleapis.com/fcm/send';
$priority="high";
$fields = array(
'registration_ids' =>$tokens,
'data' =>$message
);
$headers = array(
'Authorization:key=your key',
'Content-Type: application/json'
);
$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));
echo json_encode($fields);
$result = curl_exec($ch);
curl_error($ch);
if ($result === FALSE)
{
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
return $result;
}
store device ids in token variable in an array format
Try this below code this will give push notication for Android from php server side and you can get the device token from android you need pass dynamically to get push notication for more android device.
<?php
function sendmessage_android($devicetoken,$message){
$api_key = 'AIzaSyCtDch9K3ZqGF_SSLYCz4JjMS4-fkJuW';//get the api key from FCM backend
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array('registration_ids' => array($devicetoken));//get the device token from Android
$headers = array( 'Authorization: key=' . $api_key,'Content-Type: application/json');
$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, 0);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($fields) );
$result = curl_exec($ch);
if(curl_errno($ch)){
return 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
$cur_message=json_decode($result);
if($cur_message->success==1)
return true;
else
return false;
}
?>
I am trying to send push notification using cakephp but push notification are not sent.
Now a days GCM id looks different is google change something in push notification process for eg (fRAvDRuNUU8:APA91bHvSGxi4AVPx2wGTFWb7OyAPPvXoIAcT).
Every time I get a json which is below give:
{
"multicast_id": 5873180458565135923,
"success": 0,
"failure": 1,
"canonical_ids": 0,
"results": [
{
"error": "NotRegistered"
}
]
}
I tried so many code from internet but every time I get the same result.
The code I am using is working on so many other application perfectly.
Below is my code:
` public function sendMessageAndroid($registatoin_ids, $message){
$url = 'https://android.googleapis.com/gcm/send';
$apiKey = "AIzaSyBf5vaONLbMyGdDoOEeC_MTTh9x1G4Qm-4";
$fields = array(
'registration_ids' => $registatoin_ids,//here my gcm id come in //array form array($device_id)
'data' => $message,//this is my message //$send_message['m']=array('msg'=>$message,'type'=>'chat');
);
$headers = array(
'Authorization: key=' . $apiKey,
'Content-Type: application/json'
);
$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_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
//die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
return $result;
}`
I tried everything with no luck. Please help.
Yes my problem is solved now.There were no mistake in my code.it was my mobile developers mistake.Whenever you got response like this way below
` {
"multicast_id": 5873180458565135923,
"success": 0,
"failure": 1,
"canonical_ids": 0,
"results": [ { "error": "NotRegistered" }
`
It is defiantly mistake in android code.