2013-01-07 111 views
1

当我在终端下面的脚本来运行它给人的错误:带有PHP脚本的Apple推送通知不起作用?

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: 
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in 
/Applications/MAMP/htdocs/SimplePush/simplepush.php on line 21 

Warning: stream_socket_client(): Failed to enable crypto in /Applications/MAMP/htdocs/SimplePush/ 
simplepush.php on line 21 

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 
(Unknown error) in /Applications/MAMP/htdocs/SimplePush/simplepush.php on line 21 
Failed to connect: 0 

下面是代码:

<?php 

// Put your device token here (without spaces): 
$deviceToken = '*******'; 

// Put your private key's passphrase here: 
$passphrase = '***'; 

// Put your alert message here: 
$message = 'Want more credits!'; 


$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.push.apple.com:2195', $err, 
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

if (!$fp) 
exit("Failed to connect: $err $errstr" . PHP_EOL); 

echo '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) 
echo 'Message not delivered' . PHP_EOL; 
else 
echo 'Message successfully delivered' . PHP_EOL; 

// Close the connection to the server 
fclose($fp); 

?> 
+0

线#21的脚本是空的,请修复该代码段。 –

+0

确保您正在使用您的生产证书,因为您尝试连接到APNS生产。 – Joe

+0

@Joe我正在使用开发证书。我不是为了生活目的而准备的。 –

回答

1

因为它听起来像你所使用的开发证书,你可能想尝试指向:gateway.sandbox.push.apple.com:2195。 URL gateway.push.apple.com:2195用于生产证书。

1

老问题,但我面临同样的问题。我解决它通过更改下面的代码:

stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 

stream_context_set_option($ctx, 'ssl', 'local_cert', '/Users/Ohemod/Desktop/ck.pem'); 

剧本一直在寻找ck.pem文件,但不提供实际的目录,我得到了错误信息,每次。如果有人面临同样的问题,请尝试第二个。记住你的文件的目录和我的代码目录不一样。把你的ck.pem文件的实际目录链接。

0

https://curl.haxx.se/ca/cacert.pem下载cacert.pem并将其保存在PHP脚本可用的相同文件夹中。

包含语句stream_context_set_option($ ctx,'ssl','cafile','cacert.pem');行$ ctx = stream_context_create();之后

FYI:

语法:布尔stream_context_set_option(资源$ stream_or_context,串$包装物,绳$选项,混合$值)

对于其他选项检查http://php.net/manual/en/context.ssl.php

0

我用你的脚本就像那样,我找到的解决方案是从CURL调用,在php脚本中调用它:

这是适用于我的代码。记住通过HTTPS

脚本1(调用通过卷曲一个)来称呼它:

// set post fields 
    $post = [ 
     'mensaje' => 'THE MESSAGE TO SEND', 
     'device_id' => $device_id, 
    ]; 

    $ch = curl_init('https://www.DOMAIN/push-curl-script.php'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    $response = curl_exec($ch); 
    curl_close($ch); 

推卷曲的script.php:

$certificado_push = "*****.pem"; 

    // Put your device token here (without spaces): 
    $deviceToken  = $_POST["device_id"]; 

    // Put your private key's passphrase here: 
    $passphrase   = '***'; 

    // Put your alert message here: 
    $message   = $_POST["mensaje"]; 


    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', $certificado_push); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

    // Open a connection to the APNS server 
    $fp = stream_socket_client(
    'ssl://gateway.'.($sandbox ? 'sandbox.' : '').'push.apple.com:2195', $err, 
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

    if (!$fp) { 
      echo "Failed to connect: $err $errstr" ; 
    }else{  
      echo 'Connected to APNS' ; 

      // 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) { 
       echo 'Message not delivered' ; 
      }else{ 
       echo 'Message successfully delivered' ; 
      } 

      // Close the connection to the server 
      fclose($fp); 
    }