我正在使用REST_controller库在CodeIgniter中开发Web服务。它只是一个管理请求的控制器,我对每个使用的方法都有一个请求。其中一种方法我试图用它来发送苹果通知,所以我需要使用ck.pem文件(它是一个证书)。我知道问题是我没有.pem文件的好路径。
这是我正在使用的代码。我在控制器文件夹中有ck.pem文件但它不起作用。
function pushtest_get(){
$data = array();
// Put your device token here (without spaces):
$deviceToken = 'be67171fb22f3ea8fa68c13a9f2ba7229caf3a487aa656b20f769fa2b1fa5b7a';
// Put your private key's passphrase here:
$passphrase = 'miguel';
$message = 'Notification de prueba desde servicio web rest';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.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);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
$data['response'] = 'Connected to APNS' . PHP_EOL;
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
$data['response'] = 'Message not delivered' . PHP_EOL;
else
$data['response'] = 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
$response->skills = $data;
$this->response($response, 200);
}
答案 0 :(得分:1)
你的问题可能已经解决了一周以上,但我想分享,因为我今天遇到了同样的问题。
对于CodeIgniter项目,您可以将ck.pem文件与应用程序/目录保持平行,然后下面的代码将按原样运行。
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
答案 1 :(得分:0)
您可以将它放在任何您想要的位置(只要网络服务器具有读取权限),只需使用文件的完整路径:
stream_context_set_option($ctx, 'ssl', 'local_cert', '/var/certs/ck.pem');
或
stream_context_set_option($ctx, 'ssl', 'local_cert', '/var/www/codeigniter/application/controllers/ck.pem');
但是,我不会将它保存在controllers文件夹中。对于那些可能从事该项目并可能使您在将来难以找到的人来说,这会让人感到困惑。
我会在某处创建一个证书目录并将其存储在那里。
答案 2 :(得分:0)
您可能应该保留在项目根目录中的certs
文件夹中说:
/certs/ck.pem
然后:
stream_context_set_option($ctx, 'ssl', 'local_cert', './certs/ck.pem');
答案 3 :(得分:0)
你的pem文件在哪里都没关系。但好的做法是将它放在根目录中。
检查沙箱的正确环境,如开发端口是2195,生产是2196。
同时检查您为开发和生产生成的正确pem文件,并确保传递正确的passpharase值。
希望它可以帮助你:)