GCM với PHP (Google Cloud Messaging)


213

Cập nhật: GCM không dùng nữa, hãy sử dụng FCM

Làm cách nào tôi có thể tích hợp Google Cloud Messaging mới trong phụ trợ PHP?



4
I've written a small OOP-library with an implementation of GCM-server. Hope it will help someone :) Check it on GitHub - github.com/CodeMonkeysRu/GCMMessage
iVariable

1
@HelmiB: I tried your code on website, it executes without any error, but the $result is empty. Also the message won't deliver. Please help me. I'm in a really need of it.
user2064667

Cái ngã ba GCMMessage của tôi hỗ trợ sao lưu theo cấp số nhân, điều bắt buộc để sử dụng API của Google. Nó sử dụng máy chủ redis để xếp hàng tin nhắn và hỗ trợ điểm cuối mới cũng như iOS: github.com/stevetauber/php-gcm-queue
Steve Tauber

Rất đơn giản, tất cả những gì bạn cần chỉ là một máy chủ ứng dụng, máy chủ GCM và một ứng dụng lưu trữ dịch vụ đó. Tham khảo ví dụ này. Tại đây localhost hoạt động như máy chủ ứng dụng feelzdroid.com/2016/02/ Khăn
Naruto

Câu trả lời:


236

Mã này sẽ gửi một thông điệp GCM đến nhiều ID đăng ký thông qua 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;
}

3
Nó gần như hoạt động ở đây, nhưng tôi không nhận được bất kỳ tin nhắn nào trên điện thoại. Tôi muốn gỡ lỗi nó, nhưng tôi không biết tại sao kết quả $ của tôi luôn trống rỗng ...
Bertrand

9
Tôi có thể lấy id đăng ký ở đâu?
Seshu Vinay

6
Cảm ơn câu trả lời này! Tôi đã đưa nó vào một khung công tác đối tượng PHP nếu điều này hữu ích với bất kỳ ai: github.com/kaiesh/GCM_PHP
Kaiesh

6
@Sit Vô hiệu hóa kiểm tra chứng chỉ SSL LUÔN LUÔN là một ý tưởng tồi. Nếu máy chủ của bạn không thể xác minh chứng chỉ SSL, hãy sử dụng kỹ thuật này để báo cho cURL biết chứng chỉ nào sẽ được yêu cầu: unitstep.net/blog/2009/05/05/ hoặc sử dụng cURL để sử dụng cacert.pem mới nhất từ ​​trang web của cURL đại loại như thế này: gist.github.com/gboudreau/5206966
Guillaume Boudreau

4
Điều này đã giúp: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);
?>

3
Xin chào Shailesh Giri, nó hoạt động tốt bằng cách sử dụng khóa Trình duyệt , nhưng trong trường hợp khóa Máy chủ, nó hiển thị Lỗi trái phép 401 . Bạn co thể giup tôi được không.
Sushil Kandola

kết quả mong đợi từ máy chủ là gì? Tôi không nhận được bất kỳ phản hồi! thiết bị cũng không hiển thị bất kỳ tin nhắn.
shiladitya

3
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);là một không lớn không có. Nếu, vì một số lý do, máy chủ của bạn chạy mã PHP này không thể xác minh chứng chỉ SSL được sử dụng bởi các máy chủ của Google, bạn có thể cho cURL biết phải xác minh điều gì. Ví dụ: unitstep.net/blog/2009/05/05/...
Guillaume Boudreau

18

Thật dễ dàng để làm. Các cURL mã đó là trên trang Elad Nava đã đặt ở đây hoạt động. Elad đã bình luận về lỗi này mà anh ta nhận được.

Chuỗi mô tả một lỗi xảy ra trong khi xử lý thông báo cho người nhận đó. Các giá trị có thể giống như được ghi trong bảng trên, cộng với "Không khả dụng" (có nghĩa là máy chủ GCM đang bận và không thể xử lý tin nhắn cho người nhận cụ thể đó, vì vậy nó có thể được thử lại).

Tôi đã có một dịch vụ được thiết lập dường như đang hoạt động (ish) và cho đến nay tất cả những gì tôi đã trả lại đều không có lợi nhuận từ Google. Nhiều khả năng điều này sẽ thay đổi sớm.

Để trả lời câu hỏi, hãy sử dụng PHP, đảm bảo Zend Framework nằm trong đường dẫn bao gồm của bạn và sử dụng mã này:

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

Và chúng tôi đã có nó. Một ví dụ hoạt động (nó sẽ hoạt động sớm) về việc sử dụng GCM mới của GCM trong Zend Framework PHP.


9
CẬP NHẬT MASSIVE! Rõ ràng việc sử dụng Khóa API được thiết lập với Hạn chế IP không hoạt động. Tôi vừa trao đổi Khóa API của mình ở phía Máy chủ để sử dụng Khóa trong Bảng điều khiển API có tên 'Khóa cho ứng dụng trình duyệt (có người giới thiệu)' Và đoán xem! Nó đã đi qua. Đây là những gì tôi đã trả về: {"multicast_id": 8466657113827057558, "thành công": 1, "thất bại": 0, "canonical_ids": 0, "results": [{"message_id": "0: 1341067903035991% 921c }
Roger Thomas

1
Nó bật và tắt ngay bây giờ. Tôi đã có khoảng 3500 tin nhắn mỗi ngày đi qua nó và cho đến nay không có vấn đề gì để báo cáo.
Roger Thomas

+1 Elad .. bạn phải sử dụng khóa API ứng dụng BROWSER cho các ứng dụng SERVER! Cảm ơn Google, FAIL thực sự hữu ích ở đó :( (lãng phí nhiều giờ)
Jonny Nott


10

Bây giờ tôi thực sự có công việc này trong một nhánh trong cây Zend_Mobile của mình: https://github.com/mwillbanks/Zend_Mobile/tree/feature/gcm

Điều này sẽ được phát hành với ZF 1.12, tuy nhiên, nó sẽ cung cấp cho bạn một số ví dụ tuyệt vời về cách thực hiện việc này.

Đây là một bản demo nhanh về cách nó sẽ hoạt động ....

<?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']);
    }
}

1
Đồng ý! Điều này là tốt nhưng làm thế nào tôi có thể nhận được mã thông báo của người dùng. Tôi đoán bạn đang sử dụng mã thông báo làm đăng ký. Trong ứng dụng Android của tôi, URL máy chủ sẽ là gì?
tasomaniac

Có mã thông báo là id đăng ký; điều này đặc biệt bởi vì thư viện cố gắng duy trì một chút trừu tượng vì nó cũng thực hiện APNS và MPNS. URL máy chủ là bất cứ điều gì bạn kết thúc; điều này chỉ đơn giản là cung cấp keo để gửi, bạn sẽ cần phải viết một khu vực nơi bạn sẽ đăng id đăng ký và lưu nó ở đâu đó. Từ đó bạn có thể sử dụng mã trên để thực sự gửi thông báo đẩy tới ứng dụng.
mwillbanks


6

Ngoài ra, bạn có thể thử đoạn mã này, nguồn :

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

Mã của bạn hiển thị lỗi "Đã xảy ra sự cố: Không thể kết nối với 74.125.142.95: Quyền bị từ chối". Vấn đề là gì?
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);
?>

Trong kịch bản trên chỉ cần thay đổi:

"YourKEY" để khóa API thành Khóa máy chủ của bảng điều khiển API.
"REGISTERED_ID" với ID đăng ký thiết bị của bạn
"COLLAPSE_KEY" với khóa mà bạn yêu cầu
"TIN NHẮN" với thông báo mà bạn muốn gửi

Hãy cho tôi biết nếu bạn gặp bất kỳ vấn đề nào trong việc này, tôi có thể nhận thông báo thành công bằng cách sử dụng cùng một tập lệnh.


2

Bạn có thể sử dụng thư viện PHP này có sẵn trên packagist:

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

Sau khi cài đặt, bạn có thể làm điều này:

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

}

0

Đây là một thư viện tôi rẽ nhánh từ CodeMonkeysRU.

Lý do tôi rẽ nhánh là vì Google yêu cầu dự phòng theo cấp số nhân. Tôi sử dụng máy chủ redis để xếp hàng tin nhắn và gửi lại sau một thời gian đã đặt.

Tôi cũng đã cập nhật nó để hỗ trợ iOS.

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


Xin chào, bạn có thể vui lòng chỉ cho tôi các thay đổi được thực hiện cho iOS không, tôi thực sự không thấy gì đặc biệt so với thư viện gốc.
fralbo

@ 2ndGAB lý do chính khiến tôi rẽ nhánh là sự thụt lùi theo cấp số nhân. Đối với các thay đổi của iOS, bạn có thể đọc về chúng tại đây: developers.google.com/cloud-messaging/,
Steve Tauber

0

Đây là mã android cho mã PHP ở trên được đăng bởi @Elad Nava

MainActivity.java (Hoạt động của Trình khởi chạy)

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 (Trình tạo thông báo)

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>


0

dùng cái này

 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;

}

0

Tôi biết đây là Câu trả lời muộn, nhưng nó có thể hữu ích cho những ai muốn phát triển các ứng dụng tương tự với định dạng FCM hiện tại (GCM đã không được chấp nhận).
Mã PHP sau đây đã được sử dụng để gửi podcast theo chủ đề. Tất cả các ứng dụng đã đăng ký với kênh / topis được đề cập sẽ nhận được Thông báo đẩy này.

<?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();
}
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.