GCM avec PHP (Google Cloud Messaging)

213

Mise à jour: GCM est obsolète, utilisez FCM

Comment puis-je intégrer la nouvelle messagerie Google Cloud dans un backend PHP?

user1488243
la source
4
J'ai écrit une petite bibliothèque OOP avec une implémentation de GCM-server. J'espère que cela aidera quelqu'un :) Vérifiez-le sur GitHub - github.com/CodeMonkeysRu/GCMMessage
iVariable
1
@ HelmiB: J'ai essayé votre code sur le site Web, il s'exécute sans erreur, mais le résultat $ est vide. De plus, le message ne sera pas transmis. Aidez-moi, s'il vous plaît. J'en ai vraiment besoin.
user2064667
Ma fourchette de GCMMessage prend en charge la sauvegarde exponentielle qui est obligatoire pour utiliser l'API de Google. Il utilise un serveur redis pour mettre les messages en file d'attente et prend en charge le nouveau point de terminaison ainsi que iOS: github.com/stevetauber/php-gcm-queue
Steve Tauber
C'est très simple, il vous suffit d'un serveur d'application, d'un serveur GCM et d'une application hébergeant ce service. Reportez-vous à cet exemple. Ici, localhost agit comme serveur d'application feelzdroid.com/2016/02/…
Naruto

Réponses:

236

Ce code enverra un message GCM à plusieurs ID d'enregistrement via PHP CURL.

// Payload data you want to send to Android device(s)
// (it will be accessible via intent extras)    
$data = array('message' => 'Hello World!');

// The recipient registration tokens for this notification
// https://developer.android.com/google/gcm/    
$ids = array('abc', 'def');

// Send push notification via Google Cloud Messaging
sendPushNotification($data, $ids);

function sendPushNotification($data, $ids) {
    // Insert real GCM API key from the Google APIs Console
    // https://code.google.com/apis/console/        
    $apiKey = 'abc';

    // Set POST request body
    $post = array(
                    'registration_ids'  => $ids,
                    'data'              => $data,
                 );

    // Set CURL request headers 
    $headers = array( 
                        'Authorization: key=' . $apiKey,
                        'Content-Type: application/json'
                    );

    // Initialize curl handle       
    $ch = curl_init();

    // Set URL to GCM push endpoint     
    curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');

    // Set request method to POST       
    curl_setopt($ch, CURLOPT_POST, true);

    // Set custom request headers       
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // Get the response back as string instead of printing it       
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Set JSON post data
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));

    // Actually send the request    
    $result = curl_exec($ch);

    // Handle errors
    if (curl_errno($ch)) {
        echo 'GCM error: ' . curl_error($ch);
    }

    // Close curl handle
    curl_close($ch);

    // Debug GCM response       
    echo $result;
}
Elad Nava
la source
3
ça fonctionne presque ici, mais je ne reçois aucun message par téléphone. Je veux le déboguer, mais je ne sais pas pourquoi mon résultat $ est toujours vide ...
Bertrand
9
Où puis-je obtenir des identifiants d'enregistrement?
Seshu Vinay
6
Merci pour cette réponse! Je l'ai roulé dans un framework objet PHP si cela est utile à n'importe qui: github.com/kaiesh/GCM_PHP
Kaiesh
6
@Sit La désactivation des vérifications de certificats SSL est TOUJOURS une mauvaise idée. Si votre serveur ne peut pas vérifier un certificat SSL, utilisez cette technique pour indiquer à cURL à quel certificat s'attendre: unitstep.net/blog/2009/05/05/… ou forcer cURL à utiliser le dernier cacert.pem du site Web cURL en utilisant quelque chose comme ça: gist.github.com/gboudreau/5206966
Guillaume Boudreau
4
Cela a aidé:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
zeusstl
34
<?php
    // Replace with the real server API key from Google APIs
    $apiKey = "your api key";

    // Replace with the real client registration IDs
    $registrationIDs = array( "reg id1","reg id2");

    // Message to be sent
    $message = "hi Shailesh";

    // Set POST variables
    $url = 'https://android.googleapis.com/gcm/send';

    $fields = array(
        'registration_ids' => $registrationIDs,
        'data' => array( "message" => $message ),
    );
    $headers = array(
        'Authorization: key=' . $apiKey,
        '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);
    //curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields));

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    // curl_setopt($ch, CURLOPT_POST, true);
    // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields));

    // Execute post
    $result = curl_exec($ch);

    // Close connection
    curl_close($ch);
    echo $result;
    //print_r($result);
    //var_dump($result);
?>
Shailesh Giri
la source
3
Salut Shailesh Giri, cela fonctionne bien en utilisant la clé du navigateur , mais dans le cas de la clé du serveur, il affiche l' erreur non autorisée 401 . Pouvez-vous m'aider s'il vous plaît.
Sushil Kandola
quel est le résultat attendu du serveur? Je ne reçois aucune réponse! également l'appareil ne montre aucun message.
shiladitya
3
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);est un gros non-non. Si, pour une raison quelconque, votre serveur exécutant ce code PHP ne peut pas vérifier le certificat SSL utilisé par les serveurs de Google, vous pouvez dire à cURL avec quoi vérifier. Exemple: unitstep.net/blog/2009/05/05/…
Guillaume Boudreau
18

C'est facile à faire. Le code cURL qui se trouve sur la page qu'Elad Nava a mise ici fonctionne. Elad a commenté l'erreur qu'il reçoit.

Chaîne décrivant une erreur qui s'est produite lors du traitement du message pour ce destinataire. Les valeurs possibles sont les mêmes que celles documentées dans le tableau ci-dessus, plus "Non disponible" (ce qui signifie que les serveurs GCM étaient occupés et ne pouvaient pas traiter le message pour ce destinataire particulier, il pouvait donc être réessayé).

J'ai déjà mis en place un service qui semble fonctionner (ish), et jusqu'à présent, je n'ai eu que des retours indisponibles de Google. Il est plus que probable que cela changera bientôt.

Pour répondre à la question, utilisez PHP, assurez-vous que le Zend Framework est dans votre chemin d'inclusion, et utilisez ce code:

<?php
    ini_set('display_errors',1);
    include"Zend/Loader/Autoloader.php";
    Zend_Loader_Autoloader::getInstance();

    $url = 'https://android.googleapis.com/gcm/send';
    $serverApiKey = "YOUR API KEY AS GENERATED IN API CONSOLE";
    $reg = "DEVICE REGISTRATION ID";

    $data = array(
            'registration_ids' => array($reg),
            'data' => array('yourname' => 'Joe Bloggs')
    );

    print(json_encode($data));

    $client = new Zend_Http_Client($url);
    $client->setMethod('POST');
    $client->setHeaders(array("Content-Type" => "application/json", "Authorization" => "key=" . $serverApiKey));
    $client->setRawData(json_encode($data));
    $request = $client->request('POST');
    $body = $request->getBody();
    $headers = $request->getHeaders();
    print("<xmp>");
    var_dump($body);
    var_dump($headers);

Et nous l'avons. Un exemple fonctionnel (cela fonctionnera bientôt) de l'utilisation du nouveau GCM de Googles dans Zend Framework PHP.

Roger Thomas
la source
9
MISE À JOUR MASSIVE! Apparemment, l'utilisation d'un jeu de clés API avec restriction IP ne fonctionne pas. Je viens d'échanger ma clé API côté serveur pour utiliser la clé dans la console API appelée «clé pour les applications de navigateur (avec référents)». Et devinez quoi! Il a traversé. Voici ce que j'avais renvoyé: {"multicast_id": 8466657113827057558, "success": 1, "failure": 0, "canonical_ids": 0, "results": [{"message_id": "0: 1341067903035991% 921c249a66d6cf16"}] }
Roger Thomas
1
C'est allumé et éteint maintenant. J'ai environ 3500 messages par jour et je n'ai jusqu'à présent rencontré aucun problème.
Roger Thomas
+1 Elad .. vous devez utiliser la clé API de l'application BROWSER pour les applications SERVER! Merci Google, vraiment utile FAIL là :( (gaspillé de nombreuses heures)
Jonny Nott
13

Après avoir longtemps cherché, je suis enfin capable de comprendre ce dont j'avais exactement besoin, se connecter au GCM en utilisant PHP comme langage de script côté serveur, le tutoriel suivant nous donnera une idée claire de la façon de configurer tout ce dont nous avons besoin pour commencer avec GCM

Notifications push Android utilisant Google Cloud Messaging (GCM), PHP et MySQL

Yoga Sai Krishna
la source
10

En fait, cela fonctionne maintenant dans une branche de mon arbre Zend_Mobile: https://github.com/mwillbanks/Zend_Mobile/tree/feature/gcm

Cela sera publié avec ZF 1.12, cependant, il devrait vous donner de bons exemples sur la façon de le faire.

Voici une démo rapide sur la façon dont cela fonctionnerait ....

<?php
require_once 'Zend/Mobile/Push/Gcm.php';
require_once 'Zend/Mobile/Push/Message/Gcm.php';

$message = new Zend_Mobile_Push_Message_Gcm();
$message->setId(time());
$message->addToken('ABCDEF0123456789');
$message->setData(array(
    'foo' => 'bar',
    'bar' => 'foo',
));

$gcm = new Zend_Mobile_Push_Gcm();
$gcm->setApiKey('MYAPIKEY');

$response = false;

try {
    $response = $gcm->send($message);
} catch (Zend_Mobile_Push_Exception $e) {
    // all other exceptions only require action to be sent or implementation of exponential backoff.
    die($e->getMessage());
}

// handle all errors and registration_id's
foreach ($response->getResults() as $k => $v) {
    if ($v['registration_id']) {
        printf("%s has a new registration id of: %s\r\n", $k, $v['registration_id']);
    }
    if ($v['error']) {
        printf("%s had an error of: %s\r\n", $k, $v['error']);
    }
    if ($v['message_id']) {
        printf("%s was successfully sent the message, message id is: %s", $k, $v['message_id']);
    }
}
mwillbanks
la source
1
D'accord! C'est bon. mais comment puis-je obtenir le jeton des utilisateurs. Je suppose que vous utilisez des jetons comme ID d'enregistrement. Dans mon application Android, quelle sera l'URL du serveur?
tasomaniac
Oui, les jetons sont les identifiants d'enregistrement; c'est précisément parce que la bibliothèque tente de rester quelque peu abstraite car elle implémente également APNS et MPNS. L'URL du serveur est ce que vous finissez par faire; cela fournit simplement la colle pour l'envoi, vous devrez écrire une zone dans laquelle vous publierez l'ID d'enregistrement et l'enregistrer quelque part. De là, vous pouvez utiliser le code ci-dessus pour envoyer une notification push à l'application.
mwillbanks
6

De nombreux didacticiels sont obsolètes, et même le code actuel ne tient pas compte de la date de mise à jour de l'enregistrement des appareils ou de la désinscription des appareils. Si ces éléments ne sont pas cochés, cela entraînera éventuellement des problèmes qui empêcheront la réception de messages. http://forum.loungekatt.com/viewtopic.php?t=63#p181

Panier abandonné
la source
6

Vous pouvez également essayer ce morceau de code, source :

<?php
    define("GOOGLE_API_KEY", "AIzaSyCJiVkatisdQ44rEM353PFGbia29mBVscA");
    define("GOOGLE_GCM_URL", "https://android.googleapis.com/gcm/send");

    function send_gcm_notify($reg_id, $message) {
        $fields = array(
            'registration_ids'  => array( $reg_id ),
            'data'              => array( "message" => $message ),
        );

        $headers = array(
            'Authorization: key=' . GOOGLE_API_KEY,
            'Content-Type: application/json'
        );

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, GOOGLE_GCM_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('Problem occurred: ' . curl_error($ch));
        }

        curl_close($ch);
        echo $result;
    }

    $reg_id = "APA91bHuSGES.....nn5pWrrSz0dV63pg";
    $msg = "Google Cloud Messaging working well";

    send_gcm_notify($reg_id, $msg);
dexxtr
la source
Votre code affiche l'erreur "Problème survenu: échec de connexion à 74.125.142.95: autorisation refusée". Quel est le problème?
user2064667
4
<?php

function sendMessageToPhone($deviceToken, $collapseKey, $messageText, $yourKey) {    
    echo "DeviceToken:".$deviceToken."Key:".$collapseKey."Message:".$messageText
            ."API Key:".$yourKey."Response"."<br/>";

    $headers = array('Authorization:key=' . $yourKey);    
    $data = array(    
        'registration_id' => $deviceToken,          
        'collapse_key' => $collapseKey,
        'data.message' => $messageText);  
    $ch = curl_init();    

    curl_setopt($ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send");    
    if ($headers)    
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    
    curl_setopt($ch, CURLOPT_POST, true);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    

    $response = curl_exec($ch);    
    var_dump($response);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);    
    if (curl_errno($ch)) {
        return false;
    }    
    if ($httpCode != 200) {
        return false;
    }    
    curl_close($ch);    
    return $response;    
}  

$yourKey = "YOURKEY";
$deviceToken = "REGISTERED_ID";
$collapseKey = "COLLAPSE_KEY";
$messageText = "MESSAGE";
echo sendMessageToPhone($deviceToken, $collapseKey, $messageText, $yourKey);
?>

Dans le script ci-dessus, changez simplement:

"YOURKEY" à la clé API à la clé serveur de la console API.
"ENREGISTRÉ_ID" avec l'ID d'enregistrement de votre appareil
"COLLAPSE_KEY" avec la clé que vous avez demandée
"MESSAGE" avec le message que vous voulez envoyer

Faites-moi savoir si vous rencontrez un problème, je peux obtenir une notification avec succès en utilisant le même script.

Ajit
la source
2

Vous pouvez utiliser cette bibliothèque PHP disponible sur packagist:

https://github.com/CoreProc/gcm-php

Après l'avoir installé, vous pouvez faire ceci:

$gcmClient = new GcmClient('your-gcm-api-key-here');

$message = new Message($gcmClient);

$message->addRegistrationId('xxxxxxxxxx');
$message->setData([
    'title' => 'Sample Push Notification',
    'message' => 'This is a test push notification using Google Cloud Messaging'
]);

try {

    $response = $message->send();

    // The send() method returns a Response object
    print_r($response);

} catch (Exception $exception) {

    echo 'uh-oh: ' . $exception->getMessage();

}
chrisbjr
la source
0

Voici une bibliothèque que j'ai créée à partir de CodeMonkeysRU.

La raison pour laquelle j'ai bifurqué était parce que Google nécessite une interruption exponentielle. J'utilise un serveur redis pour mettre les messages en file d'attente et les renvoyer après une durée définie.

Je l'ai également mis à jour pour prendre en charge iOS.

https://github.com/stevetauber/php-gcm-queue

Steve Tauber
la source
Bonjour, pourriez-vous me signaler les modifications apportées pour iOS, je ne vois vraiment rien de spécial par rapport à la bibliothèque d'origine.
fralbo
@ 2ndGAB, la principale raison pour laquelle j'ai bifurqué était le retard exponentiel. Quant aux changements iOS, vous pouvez les lire ici: developers.google.com/cloud-messaging/…
Steve Tauber
0

Voici le code Android pour le code PHP ci-dessus publié par @Elad Nava

MainActivity.java (Activité du lanceur)

public class MainActivity extends AppCompatActivity {
    String PROJECT_NUMBER="your project number/sender id";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        GCMClientManager pushClientManager = new GCMClientManager(this, PROJECT_NUMBER);
        pushClientManager.registerIfNeeded(new GCMClientManager.RegistrationCompletedHandler() {
            @Override
            public void onSuccess(String registrationId, boolean isNewRegistration) {

                Log.d("Registration id", registrationId);
                //send this registrationId to your server
            }

            @Override
            public void onFailure(String ex) {
                super.onFailure(ex);
            }
        });
    }
}

GCMClientManager.java

public class GCMClientManager {
    // Constants
    public static final String TAG = "GCMClientManager";
    public static final String EXTRA_MESSAGE = "message";
    public static final String PROPERTY_REG_ID = "your sender id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    // Member variables
    private GoogleCloudMessaging gcm;
    private String regid;
    private String projectNumber;
    private Activity activity;
    public GCMClientManager(Activity activity, String projectNumber) {
        this.activity = activity;
        this.projectNumber = projectNumber;
        this.gcm = GoogleCloudMessaging.getInstance(activity);
    }
    /**
     * @return Application's version code from the {@code PackageManager}.
     */
    private static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            // should never happen
            throw new RuntimeException("Could not get package name: " + e);
        }
    }
    // Register if needed or fetch from local store
    public void registerIfNeeded(final RegistrationCompletedHandler handler) {
        if (checkPlayServices()) {
            regid = getRegistrationId(getContext());
            if (regid.isEmpty()) {
                registerInBackground(handler);
            } else { // got id from cache
                Log.i(TAG, regid);
                handler.onSuccess(regid, false);
            }
        } else { // no play services
            Log.i(TAG, "No valid Google Play Services APK found.");
        }
    }
    /**
     * Registers the application with GCM servers asynchronously.
     * <p>
     * Stores the registration ID and app versionCode in the application's
     * shared preferences.
     */
    private void registerInBackground(final RegistrationCompletedHandler handler) {
        new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                try {
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(getContext());
                    }
                    InstanceID instanceID = InstanceID.getInstance(getContext());
                    regid = instanceID.getToken(projectNumber, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                    Log.i(TAG, regid);
                    // Persist the regID - no need to register again.
                    storeRegistrationId(getContext(), regid);
                } catch (IOException ex) {
                    // If there is an error, don't just keep trying to register.
                    // Require the user to click a button again, or perform
                    // exponential back-off.
                    handler.onFailure("Error :" + ex.getMessage());
                }
                return regid;
            }
            @Override
            protected void onPostExecute(String regId) {
                if (regId != null) {
                    handler.onSuccess(regId, true);
                }
            }
        }.execute(null, null, null);
    }
    /**
     * Gets the current registration ID for application on GCM service.
     * <p>
     * If result is empty, the app needs to register.
     *
     * @return registration ID, or empty string if there is no existing
     *     registration ID.
     */
    private String getRegistrationId(Context context) {
        final SharedPreferences prefs = getGCMPreferences(context);
        String registrationId = prefs.getString(PROPERTY_REG_ID, "");
        if (registrationId.isEmpty()) {
            Log.i(TAG, "Registration not found.");
            return "";
        }
        // Check if app was updated; if so, it must clear the registration ID
        // since the existing regID is not guaranteed to work with the new
        // app version.
        int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
        int currentVersion = getAppVersion(context);
        if (registeredVersion != currentVersion) {
            Log.i(TAG, "App version changed.");
            return "";
        }
        return registrationId;
    }
    /**
     * Stores the registration ID and app versionCode in the application's
     * {@code SharedPreferences}.
     *
     * @param context application's context.
     * @param regId registration ID
     */
    private void storeRegistrationId(Context context, String regId) {
        final SharedPreferences prefs = getGCMPreferences(context);
        int appVersion = getAppVersion(context);
        Log.i(TAG, "Saving regId on app version " + appVersion);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(PROPERTY_REG_ID, regId);
        editor.putInt(PROPERTY_APP_VERSION, appVersion);
        editor.commit();
    }
    private SharedPreferences getGCMPreferences(Context context) {
        // This sample app persists the registration ID in shared preferences, but
        // how you store the regID in your app is up to you.
        return getContext().getSharedPreferences(context.getPackageName(),
                Context.MODE_PRIVATE);
    }
    /**
     * Check the device to make sure it has the Google Play Services APK. If
     * it doesn't, display a dialog that allows users to download the APK from
     * the Google Play Store or enable it in the device's system settings.
     */
    private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getContext());
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(),
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.i(TAG, "This device is not supported.");
            }
            return false;
        }
        return true;
    }
    private Context getContext() {
        return activity;
    }
    private Activity getActivity() {
        return activity;
    }
    public static abstract class RegistrationCompletedHandler {
        public abstract void onSuccess(String registrationId, boolean isNewRegistration);
        public void onFailure(String ex) {
            // If there is an error, don't just keep trying to register.
            // Require the user to click a button again, or perform
            // exponential back-off.
            Log.e(TAG, ex);
        }
    }
}

PushNotificationService.java (générateur de notifications)

public class PushNotificationService extends GcmListenerService{

    public static int MESSAGE_NOTIFICATION_ID = 100;

    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        sendNotification("Hi-"+message, "My App sent you a message");
    }

    private void sendNotification(String title, String body) {
        Context context = getBaseContext();
        NotificationCompat.Builder mBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(context)
                .setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title)
                .setContentText(body);
        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(MESSAGE_NOTIFICATION_ID, mBuilder.build());
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".PushNotificationService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="package.gcmdemo" />
        </intent-filter>
    </receiver>
</application>

Akshay Paliwal
la source
0

utilisez ceci

 function pnstest(){

                $data = array('post_id'=>'12345','title'=>'A Blog post', 'message' =>'test msg');

                $url = 'https://fcm.googleapis.com/fcm/send';

                $server_key = 'AIzaSyDVpDdS7EyNgMUpoZV6sI2p-cG';

                $target ='fO3JGJw4CXI:APA91bFKvHv8wzZ05w2JQSor6D8lFvEGE_jHZGDAKzFmKWc73LABnumtRosWuJx--I4SoyF1XQ4w01P77MKft33grAPhA8g-wuBPZTgmgttaC9U4S3uCHjdDn5c3YHAnBF3H';

                $fields = array();
                $fields['data'] = $data;
                if(is_array($target)){
                    $fields['registration_ids'] = $target;
                }else{
                    $fields['to'] = $target;
                }

                //header with content_type api key
                $headers = array(
                    'Content-Type:application/json',
                  'Authorization:key='.$server_key
                );

                $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;

}
Rajkumar Kumawat
la source
0

Je sais que c'est une réponse tardive, mais elle peut être utile pour ceux qui souhaitent développer des applications similaires avec le format FCM actuel (GCM est obsolète).
Le code PHP suivant a été utilisé pour envoyer un podcast par sujet. Toutes les applications enregistrées avec le canal / topis mentionné recevraient cette notification push.

<?php

try{
$fcm_token = 'your fcm token';
$service_url = 'https://fcm.googleapis.com/fcm/send';
$channel = '/topics/'.$adminChannel;
echo $channel.'</br>';
      $curl_post_body = array('to' => $channel,
        'content_available' => true,
        'notification' => array('click_action' => 'action_open',
                            'body'=> $contentTitle,
                            'title'=>'Title '.$contentCurrentCat. ' Updates' ,
                            'message'=>'44'),
        'data'=> array('click_action' => 'action_open',
                            'body'=>'test',
                            'title'=>'test',
                            'message'=>$catTitleId));

        $headers = array(
        'Content-Type:application/json',
        'Authorization:key='.$fcm_token);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $service_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($curl_post_body));

    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('FCM Send Error: ' . curl_error($ch));
        echo 'failure';
    }else{

    echo 'success' .$result;
    }
    curl_close($ch);
    return $result;

}
catch(Exception $e){

    echo 'Message: ' .$e->getMessage();
}
?>
Jacks
la source