Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 流套接字客户端错误:无法将通知推送到移动电话_Php_Wordpress_Sockets_Curl_Push Notification - Fatal编程技术网

Php 流套接字客户端错误:无法将通知推送到移动电话

Php 流套接字客户端错误:无法将通知推送到移动电话,php,wordpress,sockets,curl,push-notification,Php,Wordpress,Sockets,Curl,Push Notification,我刚刚设置了一个代码库,可以向iphone和android手机发送推送通知 它可以与index-notification.php配合使用,但不能与其他文件中的相同代码配合使用: 场景如下: 如果客户机为推送通知设置url链接,它将转到该链接并运行该链接,然后使用curl返回结果 有问题的外部url链接对具有经过认证的pem文件的手机执行真正的推送操作 当我单独使用这个文件时,它确实工作得很好 但是,当它像上面那样作为外部链接运行时,使用相同的设备令牌和pem文件将不再发生推送操作 你能帮我吗 下

我刚刚设置了一个代码库,可以向iphone和android手机发送推送通知 它可以与index-notification.php配合使用,但不能与其他文件中的相同代码配合使用: 场景如下:

如果客户机为推送通知设置url链接,它将转到该链接并运行该链接,然后使用curl返回结果 有问题的外部url链接对具有经过认证的pem文件的手机执行真正的推送操作 当我单独使用这个文件时,它确实工作得很好 但是,当它像上面那样作为外部链接运行时,使用相同的设备令牌和pem文件将不再发生推送操作

你能帮我吗

下面是推送通知的代码

function sendIOS_Push($message, $deviceToken, $pem, $pass, $env)
    {      
        $passphrase = trim($pass);

        $body['aps'] = array('alert' => $message,
                            'sound' => 'default',
                             );

        // Encode the payload as JSON
        $payload = json_encode($body);
        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

        if($env == 'production') {
            $ctx = stream_context_create();
            stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);

            if ($passphrase)
                stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);      
            $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);    
            $result = fwrite($fp, $msg, strlen($msg));  
            fclose($fp);
        }
        elseif($env == 'sandbox') {
           //Desvelopment push 
            $ctx = stream_context_create();
            stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);

            if ($passphrase)
                stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

            $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);      
            $result = fwrite($fp, $msg, strlen($msg));
            fclose($fp);
        }

        return 1;
    }
下面是向上述文件发送curl请求的代码

$data = array(
    'devToken' => $tokenID,
    'device' => strtolower($device),
    'pass' => $pemPass,
    'body' =>$msg,
    'postID' =>$pRediredirectIDOrLink,
    'type' =>$pushType,
    'enviroment' => $enviroment,
    'cert'=>"http://".$cert
        );



        $ch = curl_init();

        if(get_option("amazingcart_ChooseHost") == 1)
        {
            curl_setopt($ch, CURLOPT_URL, "".get_bloginfo( 'url' )."/?scrollblogkruk=apns");
        }
        else if(get_option("amazingcart_ChooseHost") == 2)
        {
            curl_setopt($ch, CURLOPT_URL, "http://".get_option("amazingcart_externalServer")."");
        }

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

我正在使用wordpress的amazingcart插件,amazingcart需要额外的url链接来推送通知,第一个代码段做了同样的事情,当我在一个独立的项目中使用它时,它工作正常,但当我将它作为一个curl请求引用时,它就不工作了(第二个代码段用于将curl发送到第一个代码段)最终解决了这个问题,它是关于推送通知的配置,我应该使用开发模式,而不是生产模式,它对我有效