500 内部服务器错误 - 尝试在我的 OVH 服务器上推送 APN
500 internal server error - Try to push APN on my OVH server
因此,为了简要说明我的问题,我开发了一个 iOS 应用程序。我想建立推送通知。我已经为此构建了一个 PHP 脚本,当我在 Postman 和本地主机上进行测试时,它工作正常。
当我将这个脚本放在我的服务器 (OVH) 上时,我更改了我的 Postman 应用程序上的 URL,然后重新启动它,但是这个 return 是一个 500 内部服务器错误。
我尝试更改 API 的 url(“api.development.push.apple.com”为“api.push.apple.com”)但没有用。
我也尝试直接从我的应用程序使用 Alamofire 请求,但问题相同。
我把我的 PHP 脚本和我的 Postman 请求的屏幕截图放在下面。 (隐藏了具体信息)
<?php
include('../bdd.php');
$idNotif = $_POST['notifId'];
$req = $bdd -> prepare('SELECT tokenDevice FROM users WHERE id=:idUser');
$req -> execute(array(
'idUser' => $idNotif
));
$data = $req -> fetch();
$tokenDevice = $data['tokenDevice'];
$keyfile = 'AuthKey.p8'; // Your p8 Key file
$keyid = 'kid'; // Your Key ID
$teamid = 'tid'; // Your Team ID (see Developer Portal)
$bundleid = 'bid'; // Your Bundle ID
$url = 'https://api.development.push.apple.com'; // development url, or use http://api.push.apple.com for production environment
$token = $tokenDevice; // Device Token
$message = '{"aps":{"alert":"Vous avez un nouveau message !","sound":"default"}}';
$key = openssl_pkey_get_private('file://'.$keyfile);
$header = ['alg'=>'ES256','kid'=>$keyid];
$claims = ['iss'=>$teamid,'iat'=>time()];
$header_encoded = base64($header);
$claims_encoded = 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;
function base64($data) {
return rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '=');
}
// echo json_encode($response2);
?>
本地主机上 postman post 的屏幕截图(有效):
postman screenshot 200 工作正常
我的 OVH 服务器上 postman post 的屏幕截图(不起作用):
postman截图500错误
如果你能帮助我理解哪里出了问题,我将不胜感激!
谢谢!
老问题,但是,已通过环境设置进行了修补。主要是'http2'配置
因此,为了简要说明我的问题,我开发了一个 iOS 应用程序。我想建立推送通知。我已经为此构建了一个 PHP 脚本,当我在 Postman 和本地主机上进行测试时,它工作正常。
当我将这个脚本放在我的服务器 (OVH) 上时,我更改了我的 Postman 应用程序上的 URL,然后重新启动它,但是这个 return 是一个 500 内部服务器错误。 我尝试更改 API 的 url(“api.development.push.apple.com”为“api.push.apple.com”)但没有用。
我也尝试直接从我的应用程序使用 Alamofire 请求,但问题相同。
我把我的 PHP 脚本和我的 Postman 请求的屏幕截图放在下面。 (隐藏了具体信息)
<?php
include('../bdd.php');
$idNotif = $_POST['notifId'];
$req = $bdd -> prepare('SELECT tokenDevice FROM users WHERE id=:idUser');
$req -> execute(array(
'idUser' => $idNotif
));
$data = $req -> fetch();
$tokenDevice = $data['tokenDevice'];
$keyfile = 'AuthKey.p8'; // Your p8 Key file
$keyid = 'kid'; // Your Key ID
$teamid = 'tid'; // Your Team ID (see Developer Portal)
$bundleid = 'bid'; // Your Bundle ID
$url = 'https://api.development.push.apple.com'; // development url, or use http://api.push.apple.com for production environment
$token = $tokenDevice; // Device Token
$message = '{"aps":{"alert":"Vous avez un nouveau message !","sound":"default"}}';
$key = openssl_pkey_get_private('file://'.$keyfile);
$header = ['alg'=>'ES256','kid'=>$keyid];
$claims = ['iss'=>$teamid,'iat'=>time()];
$header_encoded = base64($header);
$claims_encoded = 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;
function base64($data) {
return rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '=');
}
// echo json_encode($response2);
?>
本地主机上 postman post 的屏幕截图(有效):
postman screenshot 200 工作正常
我的 OVH 服务器上 postman post 的屏幕截图(不起作用):
postman截图500错误
如果你能帮助我理解哪里出了问题,我将不胜感激!
谢谢!
老问题,但是,已通过环境设置进行了修补。主要是'http2'配置