带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用

Apple Push Notifications with p8 file working on my Mac, but doesn't work on Linux server

我正在尝试将我的应用程序的 APNS 从 p12 格式切换到新的 p8 格式。它在我的 Mac 上运行良好,并且可以毫无问题地发送通知。但是,当我在我的 Amazon Linux 服务器上设置相同的配置时,我什么也得不到。我很难弄清楚有什么不同。这是我正在使用的功能。当 运行 在我的本地主机上时它工作正常,但在远程服务器上不工作。另外,请注意来自 curl_exec($http2ch)$result 对于远程服务器返回为 false。

public function sendNotification($token, $message, $badge, $env){
    $keyfile = 'AuthKey_mykey.p8';                
    $keyid = 'my key id';                        
    $teamid = 'my team id';                       
    $bundleid = 'org.tciweb.y2go';                

    if ($env == 'dev') {
        $url = 'https://api.development.push.apple.com';
    } else {
        $url = 'https://api.push.apple.com';
    }

    $payload = '{"aps":{"alert":"'.$message.'","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 => $payload,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HEADER => 1
    ));

    $result = curl_exec($http2ch);
    if ($result === FALSE) {
        // error handling
    }

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

我检查了 curl 版本...本地计算机上的 7.64.1 和服务器上的 7.61.1。我还 运行 "Push Notifications Tester" 验证密钥和设备令牌是否有效。

我搜索了很多,但我真的很困惑。这可能与 HTTP2 有关吗?是否有使用 CURL 的替代方法?任何建议表示赞赏。

将 PHP 升级到版本 7.3 解决了这个问题。我原来是7.0版本。