Notifications unable to connect to ssl

Bonjour à tous !

J'ai besoin de pouvoir envoyer des notifications à partir d'un serveur PHP.
J'ai cherché des tutoriels, je les ai suivi, et pourtant, j'ai une erreur que je ne parviens pas à résoudre...

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Connection timed out) in

J'ai suivi ce tuto pour envoyer les notifications :
http://www.assafelovic.com/blog/php-mobile-pus-notifications

J'ai corrigé avec ce post :
https://forums.raywenderlich.com/t/push-notifications-tutorial-getting-started/10056/79

Et enfin, j'ai suivi ce tuto pour créer des certificats :
https://stackoverflow.com/questions/21250510/generate-pem-file-used-to-setup-apple-push-notification

Depuis hier, je cherche une solution. Or, je n'en ai pas trouvé... Le problème est que je ne sais pas comment obtenir plus d'informations vis-à-vis de l'erreur que j'ai faite...

Je vous remercie pour votre aide !

Réponses

  • Bonsoir !

    Me revoilà ! Désolé, mais je ne trouve pas l'origine du problème...

    Je vous met le code PHP :

    class Notifications{
    function send_mobile_notification_request($user_mobile_info, $payload_info) {
    //Default result
    $result = -1;
    //Change depending on where to send notifications
    $pem_preference = "development";
    $user_device_type = $user_mobile_info['user_device_type'];
    $user_device_key = $user_mobile_info['user_mobile_token'];
    if ($user_device_type == "iOS") {
        $apns_url = NULL;
        $apns_cert = NULL;
        //Apple server listening port
        $apns_port = 2195;
        if ($pem_preference == "production") {
            $apns_url = 'gateway.push.apple.com';
            $apns_cert = './prodcert.pem';
            //$apns_cert = __DIR__.'/prodcert.pem';
        }
        //develop .pem
        else {
            $apns_url = 'gateway.sandbox.push.apple.com';
            $apns_cert = './devcert.pem';
            //$apns_cert = __DIR__.'/devcert.pem';
        }
        $stream_context = stream_context_create([
          'ssl' => [
              'verify_peer'=> false,
              'verify_peer_name' => false
          ]
        ]);
        stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert);
        $apns = stream_socket_client('ssl://' . $apns_url . ':' . $apns_port, $error, $error_string, 2, STREAM_CLIENT_CONNECT,$stream_context);
        $apns_message = chr(0).chr(0).chr(32).pack('H*', str_replace(' ','',$user_device_key)).chr(0).chr(strlen($payload_info)).$payload_info;
        if ($apns) {
            $result = fwrite($apns, $apns_message);
        }
        @socket_close($apns);
        @fclose($apns);
    }
    else if ($user_device_type == "Android") {
        // API access key from Google API's Console
        define('API_ACCESS_KEY', ADD_YOUR_API_KEY_HERE);
        // prep the bundle
        $msg = array
        (
            'message' => json_decode($payload_info)->aps->alert,
            'title' => 'This is a title. title',
            'subtitle' => 'This is a subtitle. subtitle',
            'tickerText' => 'Ticker text here...Ticker text here...',
            'vibrate' => 1,
            'sound' => 1,
            'largeIcon' => 'large_icon',
            'smallIcon' => 'small_icon'
        );
        $fields = array
        (
            'registration_ids' => array($user_device_key),
            'data' => $msg
        );
        $headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );
        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL,'https://android.googleapis.com/gcm/send');
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, false );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch);
        curl_close($ch);
    }
    return $result > 0;
    }
    
    function create_payload_json($message) {
    //Badge icon to show at users ios app icon after receiving notification
    $badge = "0";
    $sound = 'default';
    $payload = array();
    $payload['aps'] = array('alert' => $message, 'badge' => intval($badge),'sound' => $sound);
    return json_encode($payload);
    }
    
    function send() {
        $payload = $this->create_payload_json("I know how to send push notifications!");
    
        $user_mobile_info = ['user_device_type'=>"iOS", 'user_mobile_token'=>'1a*******************************************************************'];
    
        $this->send_mobile_notification_request($user_mobile_info, $payload);
    }
    }
    
    $notification=new Notifications;
    $notification->send();
    

    J'ai refait les certificats plusieurs fois, utilisé un autre script PHP, mais je parviens toujours au même résultat.
    J'ai aussi regardé des forums avec des sujets similaires, essayé les solutions, mais rien n'y fait...
    Y a t-il un moyen de savoir si le problème vient du certificat ?

    Je vous remercie pour votre aide !

  • Luc-ALuc-A Membre
    octobre 2018 modifié #3

    Bonjour !

    Il suffisait juste de demandé à mon hébergeur d'ouvrir le port 2195. C'est fait et ça fonctionne.

    Merci de m'avoir lu !

    Comment mettre que le sujet est résolu ?

Connectez-vous ou Inscrivez-vous pour répondre.