Я сделал php-файл для отправки уведомлений пользователям Apple iphone. Он работает на другом сервере, но не работает на моем сервере. Я сделал файл .pem точно, а также открыл номер порта 2195,2196. Но все же его не работает. Пожалуйста, помогите мне, чтобы избавиться от этой проблемы. Вот мой PHP-код для отправки push-уведомления:
<?php // Put your device token here (without spaces): $deviceToken = 'f672c26cbfb279e45c1b66d0ddb738d8043c785d5bb8dd20a72d52ae88d4a604'; // Put your private key's passphrase here: $passphrase = 'pushchat'; // Put your alert message here: $message = 'Welcome in testing'; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); ?>
Я нашел эту статью, имея те же проблемы, и моя проблема была на самом деле двумя проблемами и считала, что это может быть полезно здесь. Я на Ubuntu / Php 5.5
prompt\#: openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ./push-crt.pem -key ./push-key.pem -CApath ./entrust_root_certification_authority.pem
Когда я нашел вышеуказанный тест, я понял, что мне не хватает сертификата корневого центра на моем сервере, пункт 1. Как только я запустил вышеописанное, и он сработал, я понял, что библиотека, которую я использовал, передавала только один файл, в том числе в пункте 2.
На моем сервере у меня не было установлен правильный корневой сертификат, поэтому я не смог проверить свой файл PEM. Я доберусь до следующего. После того, как я нашел эту страницу [Где получить файл CTR CA-файла Entrust Root?] [1] Я проверил, и у меня такая же проблема. Я предполагаю, что вы d / l в свою домашнюю папку …
prompt\#: sudo cp ~/entrust_root_certification_authority.pem /usr/local/share/ca-certificates/entrust_root_certification_authority.crt prompt\#: sudo update-ca-certificates
Вы должны увидеть ответ, в котором указано, что сертификат был установлен или обновлен. Теперь я куда-то попадал. Я начал получать другую ошибку подключения, напрямую связанную с моим файлом PEM. Что-то, с чем я мог бы работать.
Если вы используете библиотеку, такую как моя, которая передает один файл, и вы прошли вышеуказанный тест, используя как ваш сертификат, так и ключ, вам необходимо объединить свой ключ и сертификат. Для меня, используя мои примеры имен выше push-crt.pem
prompt\#: cat push-crt.pem > push.pem prompt\#: echo >> push.pem prompt\#: cat push-key.pem >> push.pem
затем я использовал объединенную пару ключ / сертификат, и все начало работать.
Уф. Надеюсь, это поможет кому-то.
Попробуйте этот код и убедитесь, что ваш сертификат, упомянутый на пути к серверу, является особенно ck.pem
$deviceToken = 'f672c26cbfb279e45c1b66d0ddb738d8043c785d5bb8dd20a72d52ae88d4a604'; // Put your private key's passphrase here: $passphrase = 'pushchat'; // Put your alert message here: $message = 'Hello'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) { echo 'Message not delivered' . PHP_EOL; } else { echo 'Message successfully delivered' . PHP_EOL; } // Close the connection to the server fclose($fp); }