带有 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版本。
我正在尝试将我的应用程序的 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版本。