GCM dengan PHP (Google Cloud Messaging)

213

Pembaruan: GCM sudah usang, gunakan FCM

Bagaimana saya bisa mengintegrasikan Google Cloud Messaging baru dalam backend PHP?

pengguna1488243
sumber
4
Saya telah menulis perpustakaan OOP kecil dengan implementasi GCM-server. Semoga ini bisa membantu seseorang :) Periksa di GitHub - github.com/CodeMonkeysRu/GCMMessage
iVariable
1
@HelmiB: Saya mencoba kode Anda di situs web, dijalankan tanpa kesalahan, tetapi hasil $ kosong. Juga pesan tidak akan terkirim. Tolong bantu aku. Saya benar-benar membutuhkannya.
user2064667
Garpu saya dari GCMMessage mendukung cadangan eksponensial yang wajib untuk menggunakan API Google. Ia menggunakan server redis untuk mengantri pesan dan mendukung titik akhir baru serta iOS: github.com/stevetauber/php-gcm-queue
Steve Tauber
Sangat sederhana, yang Anda butuhkan hanyalah server aplikasi, server GCM, dan aplikasi hosting layanan itu. Lihat contoh ini. Di sini localhost bertindak sebagai server aplikasi feelzdroid.com/2016/02/...
Naruto

Jawaban:

236

Kode ini akan mengirim pesan GCM ke beberapa ID pendaftaran melalui 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
sumber
3
hampir berfungsi di sini, tetapi saya tidak menerima pesan apa pun di telepon. Saya ingin men-debug-nya, tetapi saya tidak tahu mengapa hasil $ saya selalu kosong ...
Bertrand
9
Di mana saya bisa mendapatkan id pendaftaran?
Seshu Vinay
6
Terima kasih atas jawaban ini! Saya menggulirkannya ke dalam kerangka objek PHP jika ini berguna bagi siapa pun: github.com/kaiesh/GCM_PHP
Kaiesh
6
@Sit Menonaktifkan pemeriksaan sertifikat SSL SELALU merupakan ide yang buruk. Jika server Anda tidak dapat memverifikasi sertifikat SSL, gunakan teknik ini untuk memberi tahu cURL sertifikat apa yang diharapkan: unitstep.net/blog/2009/05/05/… atau memaksa cURL untuk menggunakan cacert.pem terbaru dari situs web cURL menggunakan sesuatu seperti ini: gist.github.com/gboudreau/5206966
Guillaume Boudreau
4
Ini membantu: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
sumber
3
Hai Shailesh Giri, itu berfungsi baik dengan menggunakan kunci Browser , tetapi dalam kasus kunci Server, itu menunjukkan Kesalahan 401 tidak sah . Bisakah Anda menolong saya.
Sushil Kandola
apa hasil yang diharapkan dari server? Saya tidak mendapat tanggapan! juga perangkat tidak menampilkan pesan apa pun.
shiladitya
3
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);adalah no-no besar. Jika, karena alasan tertentu, server Anda yang menjalankan kode PHP ini tidak dapat memverifikasi sertifikat SSL yang digunakan oleh server Google, Anda dapat memberi tahu cURL apa yang harus diverifikasi dengan. Contoh: unitstep.net/blog/2009/05/05/…
Guillaume Boudreau
18

Itu mudah dilakukan. The Curl kode yang ada di halaman yang Elad Nava telah menempatkan di sini bekerja. Elad berkomentar tentang kesalahan yang diterimanya.

String yang menggambarkan kesalahan yang terjadi saat memproses pesan untuk penerima itu. Nilai yang mungkin sama dengan yang didokumentasikan dalam tabel di atas, ditambah "Tidak Tersedia" (artinya server GCM sibuk dan tidak dapat memproses pesan untuk penerima tertentu, sehingga dapat dicoba kembali).

Saya sudah menyiapkan layanan yang sepertinya berfungsi (ish), dan sejauh ini yang saya miliki adalah pengembalian yang tidak tersedia dari Google. Kemungkinan besar ini akan segera berubah.

Untuk menjawab pertanyaan, gunakan PHP, pastikan Zend Framework ada di jalur sertakan Anda, dan gunakan kode ini:

<?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);

Dan di sana kita memilikinya. Contoh yang berfungsi (ini akan segera bekerja) menggunakan GoCM GCM baru di Zend Framework PHP.

Roger Thomas
sumber
9
PEMBARUAN BESAR! Tampaknya menggunakan kunci API yang ditetapkan dengan Pembatasan IP gagal berfungsi. Saya baru saja menukar Kunci API saya di sisi Server untuk menggunakan Kunci di Konsol API yang disebut 'Kunci untuk aplikasi browser (dengan referensi)' Dan coba tebak! Itu terjadi. Inilah yang telah saya kembalikan: {"multicast_id": 8466657113827057558, "sukses": 1, "kegagalan": 0, "canonical_ids": 0, "hasil": [{"message_id": "0: 1341067903035991% 921c249a66d6cf16"}] }
Roger Thomas
1
Nyala dan mati sekarang. Saya mendapat sekitar 3500 pesan per hari dan tidak ada masalah untuk dilaporkan.
Roger Thomas
+1 Elad .. Anda harus menggunakan kunci API aplikasi BROWSER untuk aplikasi SERVER! Terima kasih Google, GAGAL sangat membantu di sana :( (terbuang berjam-jam)
Jonny Nott
13

Setelah mencari dalam waktu yang lama akhirnya saya bisa mengetahui apa yang sebenarnya saya butuhkan, Menghubungkan ke GCM menggunakan PHP sebagai bahasa scripting sisi server, Tutorial berikut ini akan memberi kita gambaran yang jelas tentang cara mengatur semua yang kita butuhkan untuk memulai. dengan GCM

Notifikasi Dorong Android menggunakan Google Cloud Messaging (GCM), PHP dan MySQL

Yoga Sai Krishna
sumber
10

Saya sebenarnya memiliki ini berfungsi sekarang di cabang di pohon Zend_Mobile saya: https://github.com/mwillbanks/Zend_Mobile/tree/feature/gcm

Ini akan dirilis dengan ZF 1.12, namun, itu akan memberi Anda beberapa contoh yang bagus tentang bagaimana melakukan ini.

Berikut ini adalah demo singkat tentang cara kerjanya ....

<?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
sumber
1
Baik! Ini bagus. tapi bagaimana saya bisa mendapatkan token dari pengguna. Saya kira Anda menggunakan token sebagai registrasi ID. Di aplikasi Android saya, apa yang akan menjadi URL server?
tasomaniac
Ya, token adalah id pendaftaran; ini secara khusus karena perpustakaan berusaha untuk tetap abstrak karena perpustakaan juga mengimplementasikan APNS dan MPNS. URL server adalah apa pun yang Anda akhirnya hasilkan; ini hanya memberikan lem untuk pengiriman, Anda harus menulis area di mana Anda akan memposting id pendaftaran dan menyimpannya di suatu tempat. Dari sana Anda dapat menggunakan kode di atas untuk benar-benar mengirim pemberitahuan push ke aplikasi.
mwillbanks
6

Banyak tutorial yang kedaluwarsa, dan bahkan kode saat ini tidak menjelaskan kapan pendaftaran perangkat diperbarui atau perangkat tidak terdaftar. Jika barang-barang itu tidak dicentang, pada akhirnya akan menyebabkan masalah yang mencegah pesan diterima. http://forum.loungekatt.com/viewtopic.php?t=63#p181

Keranjang yang ditinggalkan
sumber
6

Anda juga dapat mencoba bagian kode ini, sumber :

<?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
sumber
Kode Anda menunjukkan kesalahan "Masalah terjadi: Gagal terhubung ke 74.125.142.95: Izin ditolak". Apa masalahnya?
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);
?>

Dalam skrip di atas, ubah saja:

"YOURKEY" untuk kunci API ke Server Key dari konsol API.
"REGISTERED_ID" dengan ID pendaftaran perangkat Anda
"COLLAPSE_KEY" dengan kunci yang Anda butuhkan
"MESSAGE" dengan pesan yang ingin Anda kirim

Beri tahu saya jika Anda mengalami masalah dalam hal ini, saya bisa mendapatkan notifikasi dengan sukses menggunakan skrip yang sama.

Ajit
sumber
2

Anda dapat menggunakan perpustakaan PHP ini yang tersedia di paket:

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

Setelah menginstalnya, Anda dapat melakukan ini:

$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
sumber
0

Ini perpustakaan yang saya gunakan dari CodeMonkeysRU.

Alasan saya bercabang adalah karena Google memerlukan backoff eksponensial. Saya menggunakan server redis untuk mengantri pesan dan mengirim ulang setelah waktu yang ditentukan.

Saya juga memperbaruinya untuk mendukung iOS.

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

Steve Tauber
sumber
Halo, tolong tunjukkan saya perubahan yang dibuat untuk iOS, saya tidak benar-benar melihat sesuatu yang istimewa dibandingkan dengan perpustakaan asli.
fralbo
@ 2ndGAB alasan utama saya bercabang adalah backoff eksponensial. Mengenai perubahan iOS, Anda dapat membacanya di sini: developers.google.com/cloud-messaging/…
Steve Tauber
0

Berikut adalah kode android untuk kode PHP di atas yang diposting oleh @Elad Nava

MainActivity.java (Kegiatan Peluncur)

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 (Notification generator)

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
sumber
0

Gunakan ini

 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
sumber
0

Saya tahu ini adalah Jawaban yang terlambat, tetapi mungkin bermanfaat bagi mereka yang ingin mengembangkan aplikasi serupa dengan format FCM saat ini (GCM telah ditinggalkan).
Kode PHP berikut telah digunakan untuk mengirim podcast berdasarkan topik. Semua aplikasi yang terdaftar dengan saluran / topis yang disebutkan akan menerima Pemberitahuan Dorong ini.

<?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();
}
?>
Jack
sumber