我读过与我类似的不同问题,但没有答案对我有用:
$deviceToken = 'token';
$passphrase = 'passphrase';
$message = 'Questa è una notifica!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
$options = array('http' => array('proxy' => 'tcp://proxy.net:8080', 'request_fulluri' => true));
stream_context_create($options);
stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
错误是
Failed to connect: 110 Connection timed out
我试图通过以下方式更改$ option值:
$options = array('ssl' => array('proxy' => 'tcp://proxy.net:8080', 'request_fulluri' => true));
但没有任何作用,代理是绝对最小的,并且不可能直接连接。
有关向IT部门提出要求的任何建议吗?
更新
端口2195已打开
答案 0 :(得分:2)
如果您的代理支持CONNECT方法,您需要先连接到代理,然后让代理将您连接到apns服务器,最后切换SSL。
$apns_settings = array(
"host" => 'gateway.sandbox.push.apple.com',
"port" => 2195,
"certificate" => 'ipad.pem',
"passphrase" => '',
);
$proxy = 'proxyhttp:8080';
$context_options = array(
'ssl' => array(
'local_cert' => $apns_settings["certificate"],
'passphrase' => $apns_settings["passphrase"],
'peer_name' => $apns_settings["host"],
'SNI_server_name' => $apns_settings["host"],
),
);
$stream_context = stream_context_create($context_options);
// connection to your proxy server
$apns = stream_socket_client('tcp://'.$proxy, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $stream_context);
// destination host and port must be accepted by proxy
$connect_via_proxy = "CONNECT ".$apns_settings["host"].":".$apns_settings["port"]." HTTP/1.1\r\n".
"Host: ".$apns_settings["host"].":".$apns_settings["port"]."\n".
"User-Agent: SimplePush\n".
"Proxy-Connection: Keep-Alive\n\n";
fwrite($apns,$connect_via_proxy,strlen($connect_via_proxy));
// read whole response and check successful "HTTP/1.0 200 Connection established"
if($response = fread($apns,1024)) {
$parts = explode(' ',$response);
if($parts[1] !== '200') {
die('Connection error: '.trim($response));
} else {
echo "R:".$response.":R\n";
}
} else {
die('Timeout or other error');
}
echo "Proxy opened communication...\n";
// switch to SSL encrypted communication using local certificate from $context_options
if (stream_socket_enable_crypto($apns,true,STREAM_CRYPTO_METHOD_TLS_CLIENT))
echo "Switched to SSL OK...\n";
else
die('some error in SSL negociation');
您可以在此之后正常使用该流。
请在此处查看此代码:Fork of SimplePush.php