session->application->applicationId === $validAppId) { // Vérification de la chaine de signature SSL par expression régulière if (preg_match("/https:\/\/s3.amazonaws.com(\:443)?\/echo.api\/*/i", $_SERVER['HTTP_SIGNATURECERTCHAINURL']) == false){ ThrowRequestError(400, "Forbidden, unkown SSL Chain Origin!"); } // Vérification du certificatPEM // Récupération en cache $local_pem_hash_file = sys_get_temp_dir() . '/' . hash("sha256", $_SERVER['HTTP_SIGNATURECERTCHAINURL']) . ".pem"; if (!file_exists($local_pem_hash_file)){ file_put_contents($local_pem_hash_file, file_get_contents($_SERVER['HTTP_SIGNATURECERTCHAINURL'])); } $local_pem = file_get_contents($local_pem_hash_file); if (openssl_verify($json, base64_decode($_SERVER['HTTP_SIGNATURE']) , $local_pem) !== 1){ ThrowRequestError(400, "Forbidden, failed to verify SSL Signature!"); } // Vérifications complémentaires $cert = openssl_x509_parse($local_pem); if (empty($cert)) ThrowRequestError(400, "Certificate parsing failed!"); // SANs Check if (stristr($cert['extensions']['subjectAltName'], 'echo-api.amazon.com') != true) ThrowRequestError(400, "Forbidden! Certificate SANs Check failed!"); // Vérification de l'expiration if ($cert['validTo_time_t'] < time()){ ThrowRequestError(400, "Forbidden! Certificate no longer Valid!"); // Deleting locally cached file to fetch a new at next req if (file_exists($local_pem_hash_file)) unlink($local_pem_hash_file); } // Nettoyage unset($local_pem_hash_file, $cert, $local_pem); //la requête a été envoyée depuis moins d'une minute. if (time() - strtotime($requete->request->timestamp) > 60) ThrowRequestError(400, "Request Timeout! Request timestamp is to old."); // On récupère le type de requête $RequestType = $requete->request->type; if ($RequestType == "LaunchRequest"){ $ReturnValue = array ( 'version' => '1.0', 'sessionAttributes' => array ( 'countActionList' => array ( 'read' => true, 'category' => true, ), ), 'response' => array ( 'shouldEndSession' => false, 'outputSpeech' => array ( 'type' => 'SSML', 'ssml' => ''."Bienvenue dans l'application ma station météo".''." Pour avoir de l'aide dites, aide moi".'', ), ), ); } elseif ($RequestType == "SessionEndedRequest"){ // Ici le code pour SessionEndedRequest } elseif ($RequestType == "IntentRequest"){ if ($requete->request->intent->name == "AMAZON.HelpIntent"){ $ReturnValue = array ( 'version' => '1.0', 'sessionAttributes' => array ( 'countActionList' => array ( 'read' => true, 'category' => true, ), ), 'response' => array ( 'shouldEndSession' => false, 'outputSpeech' => array ( 'type' => 'SSML', 'ssml' => ''."Voici les commandes".' donne moi les températures'.'', ), ), ); } if ($requete->request->intent->name == "grandeur_physique"){ if ($requete->request->intent->slots->valeur->value <> ""){ // Séparation des données dans un tableau $exploded=(explode(' ', $contenu_du_fichier, 20)); // Suivant la valeur de nous chargeons la réponse dans la variable valeur switch ($requete->request->intent->slots->valeur->value) { case "température intérieure": $valeur='la '.$exploded[0].' '.$exploded[1].' est de '.$exploded[2].' '.$exploded[3]; break; case "hygrométrie intérieure": $valeur="l' ".$exploded[4].' '.$exploded[5].' est de '.$exploded[6].' '.$exploded[7]; break; case "température extérieure": $valeur='la '.$exploded[8].' '.$exploded[9].' est de '.$exploded[10].' '.$exploded[11]; break; case "hygrométrie extérieure": $valeur="l' ".$exploded[12].' '.$exploded[13].' est de '.$exploded[14].' '.$exploded[15]; break; case "mes températures": case "les températures": $valeur='la '.$exploded[0].' '.$exploded[1].' est de '.$exploded[2].' '.$exploded[3].''.' et la '.$exploded[8].' '.$exploded[9].' est de '.$exploded[10].' '.$exploded[11]; break; case "mes hygrométries": case "les hygrométries": $valeur="l' ".$exploded[4].' '.$exploded[5].' est de '.$exploded[6].' '.$exploded[7].''." et l' ".$exploded[12].' '.$exploded[13].' est de '.$exploded[14].' '.$exploded[15]; break; case "mes mesures": case "mes valeurs": $valeur='Pour les températures'.''.'la '.$exploded[0].' '.$exploded[1].' est de '.$exploded[2].' '.$exploded[3].''.' et la '.$exploded[8].' '.$exploded[9].' est de '.$exploded[10].' '.$exploded[11]; $valeur=$valeur.''."Pour l'humidité".''."l' ".$exploded[4].' '.$exploded[5].' est de '.$exploded[6].' '.$exploded[7].''." et l' ".$exploded[12].' '.$exploded[13].' est de '.$exploded[14].' '.$exploded[15]; break; default: $valeur="je n'ai pas bien compris votre demande"; } // Message de fin en fonction de l'heure $heure = date('G'); // donne l'heure if ($heure < 8) { // message entre minuit et 7h59 $message= 'Je vous souhaite une bonne nuit.'; } else { if ($heure < 18) { // message entre 8h00 et 17h59 $message= 'Je vous souhaite une bonne journée.'; } else { // message entre 18h00 et 23h59 $message= 'Je vous souhaite une bonne soirée'; } } $ReturnValue = [ "response" => [ "outputSpeech" => [ "type" => 'SSML', "ssml" => ''.$valeur.''.$message.'', ] ] ]; } } }else{ ThrowRequestError(); } // Setup a JSON response header header('Content-Type: application/json;charset=UTF-8'); header("Content-length: " . strlen($ReturnValue)); // Return the output echo json_encode($ReturnValue); }else { ThrowRequestError(400, "Forbidden, unkown Application ID!"); } function ThrowRequestError($code = 400, $msg = 'Bad Request'){ GLOBAL $SETUP; http_response_code(400); echo "Error " . $code . "\n" . $msg; exit(); } ?>