error->details[0]->errorCode == 'SENDER_ID_MISMATCH') // trigger_error("Rimosso destinatario push per SENDER_ID_MISMATCH"); // $q = "delete from ".sharableTable("fcm")." where token = '".addslashes($data['token'])."'"; // if(is_indi()) db_q($q); // else $PARAMETRO->db_q($q); // } function send($data){ //https://firebase.google.com/docs/cloud-messaging/migrate-v1#update-the-payload-of-send-requests if($data['notification']['sound']){ trigger_error("configurazione da migrare (sound)"); $data['apns']['payload']['aps']['sound'] = $data['notification']['sound']; unset($data['notification']['sound']); } if(strpos($data['to'], '/topics/') === 0){ trigger_error("configurazione da migrare (topic)"); $data['topic'] = substr($data['to'], strlen('/topics/')); unset($data['to']); } if($data['data']) foreach($data['data'] as $k=>$d) if(!is_string($d)){ trigger_error("parametro convertito a string (la nuova versione di gcm vuole solo values string)"); $data['data'][$k] = (string)$d; } $maxRetries = 5; $ultima_risposta_negativa = ""; for($try=0; $try<$maxRetries; $try++){ if($return = $this->request('service', 'POST', 'https://fcm.googleapis.com/v1/projects/'.$this->private_json_key->project_id.'/messages:send', ["message"=>$data])){ if($return->error->details[0]->errorCode){ if(in_array($return->error->details[0]->errorCode, ['SENDER_ID_MISMATCH', 'UNREGISTERED']) && method_exists($this, 'onInvalidToken')){ if($return->error->details[0]->errorCode == 'SENDER_ID_MISMATCH') trigger_error("Rimosso destinatario push per SENDER_ID_MISMATCH"); $this->onInvalidToken($data['token'], $return->error->details[0]->errorCode); return false; } else{ $ultima_risposta_negativa = $return; //altro errore, riprovo //https://firebase.google.com/docs/cloud-messaging/scale-fcm?hl=it // Per gli errori 400, 401, 403, 404: interrompi l'operazione e non riprovare. // Per gli errori 429: riprova dopo aver atteso la durata impostata nell'intestazione retry-after. Se non è impostata l'intestazione retry-after, il valore predefinito è 60 secondi. // Per gli errori 500: riprova con il backoff esponenziale. // Ecco altre impostazioni consigliate: // Intervallo minimo: non riprovare immediatamente una richiesta non riuscita con FCM. Attendi almeno 10 secondi prima di riprovare una richiesta non riuscita. } } else{ if($try && $ultima_risposta_negativa->error->code != 500) mail("c@localhost", "Push inviata dopo $try tentativi falliti (ultimo errcode: ".$ultima_risposta_negativa->error->code.")", __FILE__.":".__LINE__."\n".print_r(array( "ultima_risposta_negativa" => $ultima_risposta_negativa, "data" => $data, '$_REQUEST' => $_REQUEST, '$_SERVER' => $_SERVER ), true)); return $return;//ok } } //ritento sia in caso di request fallita che in caso di errore ricevuto if($try < ($maxRetries-1)) sleep(2**$try);//exponential back-off retry mechanism } //8/5/25 da poldoexpress da' errore THIRD_PARTY_AUTH_ERROR mandando una push a un token dell'iphone di lorenzo (strano): cancellato token mail("c@localhost", "Fallito invio push dopo $maxRetries tentativi", __FILE__.":".__LINE__."\n".print_r(array( "reference" => "https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode", "data" => $data, '$_REQUEST' => $_REQUEST, '$_SERVER' => $_SERVER ), true)); return false; } } ?>