我是在一个新的PHP写在笨推送通知代码,但我得到了这些错误回报。
这里是我的模型..
function sendmessage($appid, $deviceid, $status, $message)
{
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';
$message = 'My first push notification!';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
//stream_context_set_option($ctx, 'ssl', 'passphrase', 'essar@123');
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp){
exit("Failed to connect: $err $errstr" . PHP_EOL);
}
else {
print "Connection OK/n";
}
echo 'Connected to APNS' . PHP_EOL;
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
fclose($fp);
$data = array(
'message' => $this->message . 'add',
'appid' => $this->appid,
'deviceid' => $this->deviceid,
'status' => $status
);
$this->sendmessage($data);
错误信息:
消息:stream_socket_client():SSL操作失败,代码1的OpenSSL错误消息:错误:14094410:SSL例程:SSL3_READ_BYTES:SSLV3警报握手失败消息:stream_socket_client():无法启用加密消息:stream_socket_client():无法连接到SSL://gateway.sandbox.push.apple.com:2195(未知错误)
一旦你创建了临时证书和推送通知用于开发和分发。 遵循生成推送通知的步骤
为了使用您生成的证书,你需要创建一个存储既是一个PEM文件 ,您的苹果推送通知服务SSL证书和私钥。 您可以创建一个从终端的PEM文件。
导航到包含证书的目录和关键先前生成并执行以下步骤。 这里的文件名反映生成作为本课的一部分,该证书的名称。 你必须更新根据你给你的证书名称的语法。
首先创建应用程序证书PEM文件。 您可以通过双击该aps_developer_identity.cer证书文件做到这一点,然后打开钥匙串助理和导出证书为AP12文件,然后将其转换为PEM文件,以同样的方式作为PushNotificationApp.p12转换为PEM文件。 另外,您可以使用该aps_developer_identity.cer证书文件直接转换为PEM文件中的单个命令行。 在这里,我们选择了单一的命令行选项,如下所示:
openssl x509 -inform der -outform pem -in aps_developer_identity.cer -out PushNotificationAppCertificate.pem
现在,如下创建应用程序键PEM文件。 您需要输入密码,进口和PEM密码短语:
openssl pkcs12 -in PushNotificationApp.p12 -out PushNotificationAppKey.pem -nocerts
进入导入口令:MAC验证OK输入PEM密码短语:验证 - 输入PEM密码短语:
现在将两者连接起来的文件:
cat PushNotificationAppCertificate.pem PushNotificationAppKey.pem > PushNotificationAppCertificateKey.pem
打开一台Mac终端执行从包含生成的证书的目录下面一行:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushNotificationAppCertificate.pem -key PushNotificationAppKey.pem
然后,系统将要求您输入您所提交的密钥的密码:
Enter pass phrase for PushNotificationAppKey.pem:
如果一切正常,那么服务器应该送你很多的,可能看起来像以下信息:
CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate verify return:0
...
Key-Arg : None
Start Time: 1326899631 Timeout : 300 (sec) Verify return code: 0 (ok)
At the end of this, you can enter some text and then select the return key. We entered the text "**Hello World**".
**Hello World
closed**
这样就完成了与服务器的通信,并验证我们的证书工作。
我一直有你在这里提到的同样的问题。 这需要花费时间和挠头找到...
该修正后的握手错误,我发现的解决方案是下载委托使用下面的代码证书,包括这在流方面:
$entrustCert = '<full path to cert>/entrust_2048_ca.cer';
stream_context_set_option($ctx, 'ssl', 'cafile', entrustCert);
那里似乎与沙箱APN服务间歇性连接的问题。 我偶尔会返回的错误,如:
Warning: stream_socket_client(): SSL: Connection reset by peer
Warning: stream_socket_client(): Failed to enable crypto
我希望这是保护某人一段时间!