你好,我发送IOS推通知使用apns和curl在php和得到这个错误消息。
我还定义了“CURL_HTTP_VERSION_2_0”,但仍然出现此错误:
意外的HTTP/1.x请求:开机自检/3/设备/
下面是我的代码:
$key_file = XXXXXX';
$secret = null;
$private_key = JWKFactory::createFromKeyFile($key_file, $secret, [
'kid' => '3W6B5LQQHX',
'alg' => 'ES256',
'use' => 'sig',
]);
$payload = [
'iss' => 'RUK725A7V4',
'iat' => time(),
];
$header = [
'alg' => 'ES256',
'kid' => $private_key->get('kid'),
];
$jws = JWSFactory::createJWSToCompactJSON(
$payload, $private_key, $header
);
if (!defined('CURL_HTTP_VERSION_2_0')) {
define('CURL_HTTP_VERSION_2_0', 3);
}
$http2_server = 'https://api.development.push.apple.com';
$app_bundle_id = 'com.MD.example';
$token = $device->device_id;
$url = "{$http2_server}/3/device/{$token}";
// headers
$headers = array(
"apns-topic: {$app_bundle_id}",
'Authorization: bearer ' . $jws
);
这是curl实际curl请求。
// other curl options
curl_setopt_array($http2ch, array(
CURLOPT_URL => $url,
CURLOPT_PORT => 443,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HEADER => 1,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
));
$result = curl_exec($http2ch);
4条答案
按热度按时间cl25kdpy1#
在PHP中使用cURL时,我得到了相同的
Unexpected HTTP/1.x request: POST /3/device/XXXX
响应,但在命令行中使用curl时却没有。简单地用
sudo apachectl restart
重新启动apache web服务器就解决了这个问题。bvk5enib2#
问题:
对我来说,这是因为curl和/或我的服务器中缺少OpenSSL和nghttp 2。我也相信较旧版本的PHP(低于7. 0)也可能导致这个问题。
您可以在服务器上使用以下终端命令检查curl是否使用OpenSSL和nghttp 2:
如果输出中没有提到OpenSSL和nghttp 2,则这就是您看到HTTP/1.x错误的原因。
我使用的是AWS EC2示例“Amazon Linux 2 AMI”。我找不到安装OpenSSL或nghttp 2的方法,所以我必须创建一个新的服务器,请参见下文。
解决方案:
我不得不创建一个新的AWS EC2示例'亚马逊Linux AMI 2018.03.0(HVM)'。
注意:不要创建“Amazon Linux 2 AMI(HVM)”的示例,因为您将以原始问题结束。
然后,我按照下面的步骤在新服务器上安装PHP7:How to install PHP 7 on EC2 t2.micro Instance running Amazon Linux Distro
然后我检查了curl版本,OpenSSL和nghttp 2都存在:
然后我把所有的代码和资源放到新的服务器上,它工作了!
注意:我用来创建通知的实际PHP代码可以在这里找到:Send iOS Push notification in php with .p8 file
bbmckpt73#
我使用的是旧版本的PHP,phpinfo()显示curl库没有启用HTTP2。将PHP升级到最新版本可以解决这个问题。
46qrfjad4#
请在您的php的curl包中启用您的http2。
如果您已经启用了对curl的http2支持,请参见phpinfo()。
之后,只需将
CURLOPT_HTTP_VERSION
curl选项设置为3