web-dev-qa-db-fra.com

La notification Apple Push ne fonctionne pas

J'ai écrit un plug-in qui déclenche une notification Apple Push sur les appareils IOS.

Lorsque je le déclenche manuellement via le répertoire racine, cela fonctionne parfaitement. La capture, quand je le déplace dans le dossier du plugin et l'exécute comme un plugin en utilisant:

add_action( 'publish_post', 'post_published' ,10,2);

il renvoie une erreur ssl des serveurs Apple.

Rien n'a été changé dans le code (à l'exception de include ('wp-config.php')) qui n'est pas nécessaire en tant que plugin.

C'est l'erreur:

Avertissement: stream_socket_client () [function.stream-socket-client]: l'opération SSL a échoué avec le code 1. Messages d'erreur OpenSSL: erreur: 14094410: routines SSL: SSL3_READ_BYTES: échec de la poignée de main d'alerte dans/nas/wp/www/staging/geektim /wp-content/plugins/wp-mes-Push-to-Apple/wp-mes-Push-to-Apple.php à la ligne 131

Avertissement: stream_socket_client () [function.stream-socket-client]: Échec d'activation de la cryptographie dans/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-Push-to-Apple/wp-mes -Push-to-Apple.php à la ligne 131

Avertissement: stream_socket_client () [function.stream-socket-client]: impossible de se connecter à ssl: //gateway.sandbox.Push.Apple.com: 2195 (erreur inconnue) dans/nas/wp/www/staging/geektimecoil/wp-content/plugins/wp-mes-Push-to-Apple/wp-mes-Push-to-Apple.php en ligne 131 Erreur: 0

C'est le code tel qu'il est dans le plugin:

function post_published($ID, $post ) {

    // $url = "http://geektimecoil.staging.wpengine.com/googlePush.php"; global $wpdb; 
    // $post = get_post(211051);

    $categories = get_the_category($post->ID );
    if($categories){
        $cond = array();
        $cats = array();
        foreach($categories as $category) {     
            $cats[] = $category->slug;
            switch ($category->slug) {
                case "startup":
                    $cond[] = "startup";
                    break;
                case "development":
                    $cond[] = "dev";
                    break;
                case "gadgets":
                    $cond[] = "mobile";
                    break;              
                case "internet":
                    $cond[] = "internet";
                    break;
                case "hi-tech":
                    $cond[] = "hightech";
                    break;
                case "%d7%a1%d7%a7%d7%99%d7%a8%d7%95%d7%aa": // hebrew skirot
                    $cond[] = "reviews";
                    break;
                case "science":
                    $cond[] = "science";
                    break;
            }
        }
        print_r($cond);

        $condition = "( (".$cond[0]."=1)";
        for ($i=1; $i<=(count($cond)-1) ; $i++) { 
            $condition .= "or(".$cond[$i]."=1)";
        }
        $condition .= " )";
    }

    $sql="SELECT token FROM wp_mobile where device=1 AND ".$condition;
    $users = $wpdb->get_results($sql);

    print_r($sql);
    print_r($users);

        $passphrase = '***';

        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
        stream_context_set_option($ctx, 'ssl', 'local_cert','/Push/geek_dev.pem');
        // stream_context_set_option($ctx, 'ssl', 'local_cert','/Push/geek_prod.pem');
        stream_context_set_option($ctx, 'ssl', 'cafile', '/Push/ios_entrust.pem');

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

        if (!$fp){
            echo "Error: ".$err;
            exit;
        }


        $post_url = str_replace('www','m',get_permalink( $post->ID));
        $body["aps"] = array(
                             "alert" => "message", //title
                             "sound" => "default",
                             "badge" => "0",
                             "url" => $post_url,
                             );

        $payload = json_encode($body);

        $msg = chr(1)                           // command (1 byte)
        . pack('N', 'notification')             // identifier (4 bytes)
        . pack('N', time() + 86400)             // expire after 1 day (4 bytes)
        . pack('n', 32)                         // token length (2 bytes)
        . pack('H*', 'db8***b414004ccb9a***2a54d9de06')   
        . pack('n', strlen($payload))           // payload length (2 bytes)
        . $payload;                             // the JSON payload

        // Send it to the server
        $result = fwrite($fp, $msg, strlen($msg));
        //echo "\n$result";

        //set blocking
        stream_set_blocking($fp,0);

        //Wait to response
        sleep(1);

        fclose($fp);

        return $print;
    }


add_action( 'publish_post', 'post_published' ,10,2); ?>

Comme je l'ai mentionné précédemment, sans le add_action et pas en tant que plugin, ce même code fonctionne.

1
Meschiany

OMG, enfin, lorsque le code provient du plug-in, le répertoire de travail actuel est défini sur wp-admin alors que lorsque je l'exécute manuellement, il est défini pour/wp-content/plugins ...

Ainsi, lorsque la fonction Push est appelée, ajoutez simplement la ligne de code suivante:

chdir(ABSPATH . 'wp-content/plugins/*your plugins folder name*/');
1
Meschiany