Apple APNS - Uncaught Exception: Curl не удалось: URL не задан - PullRequest
0 голосов
/ 11 октября 2019

Следующий код работает, когда я тестирую его на локальном компьютере (MAMP PRO 5.4), и я могу получить push-уведомление на своем устройстве.

  function sendTestMessage(){

            $keyfile = 'MyAuthKey.p8';               
            $keyid = 'MyKeyId';                        
            $teamid = 'MyTeamId';                         
            $bundleid = 'myBundleId';
            $url = 'https://api.development.push.apple.com'; 
            $token = 'device token';          
            $message = '{"aps":{"alert":"Hi there!","sound":"default"}}';

            $key = openssl_pkey_get_private('file://'.$keyfile);

            $header = ['alg'=>'ES256','kid'=>$keyid];
            $claims = ['iss'=>$teamid,'iat'=>time()];

            $header_encoded = $this->base64($header);
            $claims_encoded = $this->base64($claims);

            $signature = '';
            openssl_sign($header_encoded . '.' . $claims_encoded, $signature, $key, 'sha256');
            $jwt = $header_encoded . '.' . $claims_encoded . '.' . base64_encode($signature);

            // only needed for PHP prior to 5.5.24
            if (!defined('CURL_HTTP_VERSION_2_0')) {
              define('CURL_HTTP_VERSION_2_0', 3);
            }

            $http2ch = curl_init();
            curl_setopt_array($http2ch, array(
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
            CURLOPT_URL => "$url/3/device/$token",
            CURLOPT_PORT => 443,
            CURLOPT_HTTPHEADER => array(
            "apns-topic: {$bundleid}",
            "authorization: bearer $jwt"
            ),
            CURLOPT_POST => TRUE,
            CURLOPT_POSTFIELDS => $message,
            CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HEADER => 1
            ));

            $result = curl_exec($http2ch);
            if ($result === FALSE) {
              throw new Exception("Curl failed: ".curl_error($http2ch));
            }

              $status = curl_getinfo($http2ch, CURLINFO_HTTP_CODE);
              echo $status;
            }

Однако, когда я тестирую его на своем сервере (AWS EC2 Ubuntu 16.04), я получаю следующую ошибку:

b>Fatal error</b>:  Uncaught Exception: Curl failed: No URL set! in /var/www/html/classes/PushNotification.php:171
Stack trace:
#0 /var/www/html/api/v1/testPush.php(12): PushNotification-&gt;sendTestMessage()
#1 {main}
  thrown in <b>/var/www/html/classes/PushNotification.php</b> on line <b>171</b><br />

Я уже проверил и попробовал большинство подобных решений здесьно это не работает.

1 Ответ

0 голосов
/ 13 октября 2019

Я надеюсь, что это может помочь другим. Я сосредоточился на коде, но это было что-то связанное с моим сервером. Я обновился с UBUNTU 16.04 до 18.04, и это заставило меня обновить PHP и переустановить cURL. Я только что проверил, используя команду:

curl --version

, и мой предыдущий сервер имел версию curl 7.47, в то время как теперь он имеет libcurl / 7.58.0.

Я также заметил, что --version теперь возвращает OpenSSL/1.1.1 сразу после версии, которая не была там, проверяя предыдущую версию. Я догадался, что это проблема, связанная с OpenSSL, поскольку на веб-сайте разработчика Apple говорится:

Use HTTP/2 and TLS 1.2 or later to establish a connection between your provider server and one of the following servers: Development server: api.sandbox.push.apple.com:443 Production server: api.push.apple.com:443

...