http://blog.csdn.net/motian06/article/details/8199247 このブログを参照してください。自分のデバイス番号とパスフレーズを置き換えた後、このエラーをローカルでテストし、ローカルの Apache で openssl を開きました。
警告: stream_socket_client() [function.stream-socket-client]: ローカル証明書チェーン ファイル `E:AppServwwwceshi/apns-dev.pem' を設定できません。cafile/capath 設定に証明書とその発行者の詳細が含まれていることを確認してください。 E :AppServwwwceshi2.php の 25 行目
警告: stream_socket_client() [function.stream-socket-client]: E:AppServwwwceshi2.php の 25 行目で SSL ハンドルの作成に失敗しました
警告: stream_socket_client() [function .stream -socket-client]: E:AppServwwwceshi2.php の 25 行目で暗号化を有効にできませんでした
警告: stream_socket_client() [function.stream-socket-client]: ssl://gateway.sandbox に接続できません。 Push.apple.com:2195 (Unknown error) in E:AppServwwwceshi2.php on line 25
接続に失敗しました
stream_socket_client('tls://gateway.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT |STREAM_CLIENT_PERSISTENT, $ctx);
apns-dev.pem のパスが間違っている可能性があります。プッシュ ファイルと同じレベルにあることが推奨されます。さらに、先月、Apple はリンク方法を tls に変更し、SSL リンクをサポートしませんでした。
stream_socket_client('tls://gateway.push .apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
.pem 証明書ファイルと php プッシュ ファイルは同じ内にありますディレクトリを tls に変更する必要がありますか?
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);これは必要ありません、リンク方法を変更しただけです
//手机注册应用返回唯一的deviceToken$deviceToken = 'xxxxxxxxx';//ck.pem通关密码$pass = 'xxx'; //消息内容$message = 'A test message!';//badge我也不知是什么$badge = 4;//sound我也不知是什么(或许是推送消息到手机时的提示音)$sound = 'default';//建设的通知有效载荷(即通知包含的一些信息)$body = array();$body['aps'] = array('alert' => $message);//把数组数据转换为json数据$payload = json_encode($body);echo strlen($payload),"\r\n";//下边的写法就是死写法了,一般不需要修改,//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址$ctx = stream_context_create();$pem = dirname(__FILE__) .'/'.'apns-dev.pem';stream_context_set_option($ctx, 'tls', 'local_cert', $pem); stream_context_set_option($ctx, 'tls', 'passphrase', $pass);$fp = stream_socket_client('tls://gateway.push.apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp) { print "Failed to connect $err $errstr\n"; return;}else { print "Connection OK\n<br/>";}// send message$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;print "Sending message :" . $payload . "\n"; fwrite($fp, $msg);fclose($fp);tls に変更した後もエラーが発生します
これは必要ありません、リンク方法を変更しただけです
お世話になります。変更した後も、同じディレクトリ内の php ファイルと .pem ファイルに対してエラーが発生します
私のコード//手机注册应用返回唯一的deviceToken$deviceToken = 'xxxxx';//ck.pem通关密码$pass = 'xxx'; //消息内容$message = 'A test message!';//badge我也不知是什么$badge = 4;//sound我也不知是什么(或许是推送消息到手机时的提示音)$sound = 'default';//建设的通知有效载荷(即通知包含的一些信息)$body = array();$body['aps'] = array('alert' => $message);//把数组数据转换为json数据$payload = json_encode($body);echo strlen($payload),"\r\n";//下边的写法就是死写法了,一般不需要修改,//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址$ctx = stream_context_create();$pem = dirname(__FILE__) .'/'.'apns-dev.pem';stream_context_set_option($ctx, 'ssl', 'local_cert', $pem); stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);$fp = stream_socket_client('tls://gateway.push.apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp) { print "Failed to connect $err $errstr\n"; return;}else { print "Connection OK\n<br/>";}// send message$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;print "Sending message :" . $payload . "\n"; fwrite($fp, $msg);fclose($fp);
$pem = dirname(__FILE__) .'/'.'apns-dev.pem';
D:/wamp/ などの絶対パスに変更しますwww/push/ck .pem 試してください
$pem = dirname(__FILE__) .'/'.'apns-dev.pem';
D:/wamp/www/push/ck などの絶対パスに変更します。 .pem 試してみる
改成绝对路径以后 还是会报错
Warning: stream_socket_client() [function.stream-socket-client]: SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in D:\clientweb\demo\y.php on line 25
Warning: stream_socket_client() [function.stream-socket-client]: Failed to enable crypto in D:\clientweb\demo\y.php on line 25
Warning: stream_socket_client() [function.stream-socket-client]: unable to connect to tls://gateway.push.apple.com:2195 (Unknown error) in D:\clientweb\demo\y.php on line 25
Failed to connect 0
http://zhidao.baidu.com/link?url=OVktep-jhluby3rXTZURF-QcCl4bMY5DWXgdQXhUaTMV08zbvNyRqswL4J0JO46e3iYYMQdUGPw160YQ4ALdUK
自己懒得查 我就帮你查
http://zhidao.baidu.com/link?url=OVktep-jhluby3rXTZURF-QcCl4bMY5DWXgdQXhUaTMV08zbvNyRqswL4J0JO46e3iYYMQdUGPw160YQ4ALdUK
自己懒得查 我就帮你查
用你的代码,改后测试了一下,能发送,改动:ck.pem与文件同级,链接沙盒,自己的token和pass,其它未改
//手机注册应用返回唯一的deviceToken$deviceToken = 'xxx';//隐藏了自己的token//ck.pem通关密码$pass = '123456'; //消息内容$message = 'A test message!';//badge我也不知是什么$badge = 4;//sound我也不知是什么(或许是推送消息到手机时的提示音)$sound = 'default';//建设的通知有效载荷(即通知包含的一些信息)$body = array();$body['aps'] = array('alert' => $message);//把数组数据转换为json数据$payload = json_encode($body);echo strlen($payload),"\r\n";//下边的写法就是死写法了,一般不需要修改,//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址$ctx = stream_context_create();$pem = dirname(__FILE__) .'/'.'ck.pem';stream_context_set_option($ctx, 'ssl', 'local_cert', $pem); stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp) { print "Failed to connect $err $errstr\n"; return;}else { print "Connection OK\n<br/>";}// send message$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;print "Sending message :" . $payload . "\n"; fwrite($fp, $msg);fclose($fp);/*35 Connection OK Sending message :{"aps":{"alert":"A test message!"}} */
jam00 谢谢你的热心帮忙 我再去试试