0

我正在使用 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);
    } 
4

4 回答 4

1

您的问题可能已经解决了一个多星期,但是我想分享一下,因为我今天遇到了同样的问题。

对于 CodeIgniter 项目,您可以保持 ck.pem 文件与 application/ 目录并行,然后下面的代码将按原样工作。

stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
于 2013-10-23T11:56:25.530 回答
0

可能你应该保存在certs项目根目录中的文件夹中说:

/certs/ck.pem

接着:

stream_context_set_option($ctx, 'ssl', 'local_cert', './certs/ck.pem');
于 2013-10-16T14:51:28.323 回答
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');

不过,我不会将它保存在控制器文件夹中。对于可能从事该项目的其他人来说,这会让人感到困惑,并且可能会让您将来很难找到。

我会在某处创建一个证书目录并将其存储在那里。

于 2013-10-16T14:47:03.273 回答
0

你在哪里有 pem 文件并不重要。但好的做法是将它放在根目录中。

检查沙盒环境是否正确,例如开发端口是 2195,生产端口是 2196。

还要检查您为开发和生产生成的正确 pem 文件,并确保您传递了正确的密码短语值。

希望它可以帮助你:)

于 2013-10-16T20:21:43.473 回答