2015-06-27 86 views
13

我在我的PHP Laravel应用程序中使用推送通知。我创建了一个pem文件并进行了测试。在我的开发机器上使用它时,它会正确推送到移动设备。当我现在将整个项目推送到我的生产服务器并启动pushnotif调用时,出现以下错误:Failed to enable crypto推送通知加密错误

我是否需要在生产服务器上创建特殊的pem文件?我说的不是“生产证书”我仍然想使用沙盒测试

<?php 

namespace App\Helpers; 
use Carbon\Carbon; 
use Illuminate\Support\Facades\Config; 

class PushNotificationHelper { 
    public function pushToResponder($deviceToken) { 
     // Set device token of mobile device and the passphrase for certification 
     $pushToken = $deviceToken; 
     $passphrase = Config::get('MFConfig.PushNotificationTest.passPhrase'); 
     $APNS = Config::get('MFConfig.PushNotificationTest.APNS'); 

     // Open new context for streaming and set certificate as well as passphrase 
     $ctx = stream_context_create(); 
     stream_context_set_option($ctx, 'ssl', 'local_cert', '../App/Certificates/ck.pem'); 
     stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 
     stream_context_set_option($ctx, 'ssl', 'cafile', '../App/Certificates/entrust_2048_ca.cer'); 

     // Open connection to APNS 
     $fp = stream_socket_client($APNS, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

     // If no connection could be made then fail with error, otherwise connect 
     if (!$fp) { 
      exit("Failed to connect: $err, $errstr" . PHP_EOL); 
     } 

     echo 'Connected to APNS' . PHP_EOL; 

     // Create the payload body 
     $body['aps'] = array(
      'alert' => "MEDIFAKTOR Einsatz", 
      'sound' => 'default' 
     ); 

     // Encode the payload as JSON 
     $payload = json_encode($body); 

     // Build the binary notification 
     $msg = chr(0) . pack('n', 32) . pack('H*', $pushToken) . pack('n', strlen($payload)) . $payload; 

     // Send to server 
     $result = fwrite($fp, $msg, strlen($msg)); 

     // If no result is available, the message was not delivered. 
     if(!$result) { 
      echo 'Message not delivered.' . PHP_EOL; 
     } else { 
      echo 'Message successfully delivered.' . PHP_EOL; 
     } 

     // Close connection 
     fclose($fp); 

    } 
} 

我测试用的连接:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ck.pem -debug -showcerts -CAfile entrust_2048_ca.cer 

,并返回状态0(OK)这是罚款我认为? 但是当我调用我得到的功能:failed loading cafile stream

+0

https://github.com/immobiliare/ApnsPHP/你有没有检查过这个仓库。 – Ugur

回答

4

不确定这一点,但它可能是你在开发环境中的PHP设置。

尝试找到cacert.pem文件。

如果您使用的是Linux系统,则可以使用终端尝试locate cacert.pem

当你找到的位置找到php.ini文件,找到这一行:

;openssl.cafile =

,并更改为 openssl.cafile=路径从定位cacert.pem command或.PEM实际所处的位置。

报告它是如何去的。