带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用
Posted
技术标签:
【中文标题】带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用【英文标题】:Apple Push Notifications with p8 file working on my Mac, but doesn't work on Linux server 【发布时间】:2020-05-20 22:32:33 【问题描述】:我正在尝试将我的应用程序的 APNS 从 p12 切换到新的 p8 格式。它在我的 Mac 上运行良好,并且可以毫无问题地发送通知。但是,当我在我的 Amazon Linux 服务器上设置相同的配置时,我什么也得不到。我很难弄清楚有什么不同。这是我正在使用的功能。在我的本地主机上运行时它工作正常,但在远程服务器上却不行。另请注意,来自curl_exec($http2ch)
的$result
对于远程服务器返回为假。
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 的替代方法?任何建议表示赞赏。
【问题讨论】:
CURL 返回什么? @hobbsome,只是零。 是 "$this->base64" = "base64_encode"?我不断收到错误“InvalidProviderToken” 【参考方案1】:将 PHP 升级到 7.3 版解决了这个问题。我最初使用的是 7.0 版。
【讨论】:
以上是关于带有 p8 文件的 Apple 推送通知在我的 Mac 上工作,但在 Linux 服务器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章