Depot direct de message sur boite vocale sfr depuis le web

Contenu du snippet

phpMessageDrop est un service de dépot de message sur boite vocale SFR
depuis un site WEB. En tant que simple exemple, Il est volontairement minimaliste
pour tenir et tient en moins de 50 lignes de code php.

Il s'appuit sur la possibilité en HTML5 d'enregistrer directement le message
depuis le micro. L'implémentation de cette fonctionnalité n'est pas encore
complète pour l'ensemble des navigateurs mais en cours.

Pour faire fonctionner cet exemple, il suffit de :
- l'héberger sur un serveur php (vor une liste d'hébergeur gratuit : http://php.developpez.com/comparatifs/hebergeurs/)
- créer un répertoire tmp dans le répertoire contenant les fichiers index.html et serveur.php
- s'inscrire sur SFR API pour récupérer un identifiant
- reporter l'indentifiant dans la constante "tokenSFR" du fichier "serveur.php"

Remarques

A partir de là, il est possible de déposer un message sur la plupart des boites
vocale SFR. L'usage gratuit de l'API est possible dans la limite des volumes offerts
(voir https://api.sfr.fr/blog/rechargement-mensuel)

Le répertoire tmp est utilisé pour stocker les identifiants des messages en attendant
le consentement du destinataire. Cette solution peut être optimiser avec une base de
données ou un fichier xml de paires (key,value)

l'algorithme est simple :
- le fichier audio, créé dans la page index.html est envoyé au serveur
puis le serveur (serveur.php) :
- génére un numéro court pour le destinataire (voir SFR API)
- demande le consentement de dépot de message au destinataire
- envoie le message audio à SFR API qui se charge de l'encodage (fonction loadMessage)
puis SFR API :
- notifie l'application lorsque l'encodage et terminé avec un identifiant en rappelant serveur.php avec method=getId
De nouveau le serveur :
- dépose le message si le destinataire a donné son consentement ou sinon demande à etre notifié dés que le consentement sera reçu (setAgrSubscription)
- A réception d'un consentement (push par SFR API), le serveur dépose le message en attente (pushMessage)

Source / Exemple :


fichier serveur.php

<?php
/**

  • Code principal du serveur php de dépot de message appelé
  • - par le formulaire d'envoi du message (index.html)
  • - par la serveur d'SFR API pour notifier la fin d'encodage et le consentement du destinataire
  • son usage nécessite d'initialiser les constantes tokenSFR et DOMAINE
  • /
//Indiquer ici votre clé SFR API obtenue gratuitement en s'inscrivant sur https://api.sfr.fr/user/register const tokenSFR="<ici votre clef SFR API>"; const DOMAINE="<ici l'url de votre site web ou sont hébergés les pages index.html et serveur.php>"; /**
  • Fonction utilisée pour les appels GET et POST à SFR API (mais utilisable pour
  • n'importe quel serveur de web services REST
  • la fonction ajoute automatiquement
  • - un nonce nécessaire pour certaines API SFR
  • - la clé d'accès SFR API
  • - le format de la réponse en JSON
  • @param unknown $url url de la méthode avec les paramètres
  • @param string $method GET ou POST
  • @param string $data contient un fichier binaire si nécessaire pour le post
  • @param string $optional_headers
  • @throws Exception
  • @return la fonction retourne ce que l'api retourne
  • /
function RestCall($url, $method='GET', $data=null, $optional_headers = null) { //Certaines méthode de SFR API sont protégé par un nonce //voir http://en.wikipedia.org/wiki/Cryptographic_nonce $nonce=substr(time().time().time().time(),0,32); //Cette méthode de calcul du nonce pourrait être améliorée if(!stripos($url, '?'))$url=$url."?"; $url="https://ws.red.sfr.fr/red-ws/red-b2c/resources".$url."&responseType=json&token=".tokenSFR."&nonce=".$nonce; $url=str_replace("?&", "?", $url); //Pour la méthode POST on passe les paramètres de l'url dans le champs data if($method=="POST"){ $pos=strrpos($url,"?"); $data=substr($url,$pos+1,strlen($url)-1)."&".$data; $url=substr($url,0,$pos); } $params = array('http' => array('method'=>$method, 'header'=>'Content-type: application/x-www-form-urlencoded', 'content'=>$data, 'timeout'=>20)); if ($optional_headers !== null) {$params['http']['header'] = $optional_headers;} $fp = @fopen($url, 'rb', false, stream_context_create($params)); if (!$fp) { throw new Exception("Problem with $url, $php_errormsg"); return(null); } $response = @stream_get_contents($fp); if ($response === false) {throw new Exception("Problem reading data from $url, $php_errormsg");} return $response; } //le paramètre method permet de savoir ce que l'on doit faire (chargement du message ou envoi) //on aurait pu se passer de ce paramètre si l'on avait créé un fichier php spécifique pour l'envoi $method=$_REQUEST["method"]; $idMessage=$_REQUEST["messageId"]; //Identifiant SFR du message encodé, utilisé pour envoyer le message $destinataire=$_REQUEST["userIdentifier"]; //Numéro SFR du destinataire du message //Fonction permettant de charger le message sur la plateforme SFR API if($method=="loadMessage"){ //Permet d'affecter un numéro court au destinataire du message, ce qui simplifie les consentements //voir https://api.sfr.fr/api/sms#api-navtab RestCall("/shortcode/generateSmsShortcode?msisdn=".$destinataire); //url_callback sera appelée par SFR API dés que le message aura été encodé //on ajoute le destinataire dans l'url de callback qui sera nécessaire pour savoir à qui poster le message $url_callback=URLEncode(DOMAINE."/serveur.php?method=getId&userIdentifier=".$destinataire); //le message est récupérer puis encodé en base 64 et formaté pour passer dans la requete (URLEncode) $data="message=".URLEncode(base64_encode(file_get_contents($_FILES['messageFile']['tmp_name']))); //Chargement du message vocal //voir https://api.sfr.fr/api/mevo#api-navtab $rc=RestCall("/depotmsg/load?pushUrl=".$url_callback,"POST",$data); //Demande de consentement pour le dépôt de message //Si ce dernier a déjà été obtenu, le destinataire ne recoit rien $rc=RestCall("/agreement/get?userIdentifier=".$destinataire."&type=PhoneNumber&agreementTypeId=4"); } //Si la method contient event, c'est que le destinataire vient de donner son consentement //pour recevoir un message if($method=="event"){ $status=$_REQUEST["status"]; //contient les valeur AGREED, DENIED ou PENDING suivant l'état du status if($status=="AGREED"){ $destinataire=$_REQUEST["msisdn"]; //Récupére le numero lié au changement de consentement //recherche de l'identifiant du message a envoyer $file=fopen("./tmp/".$destinataire,"r"); if($file){ $idMessage=fread($file,32); //Récupère l'identifiant du message à envoyer fclose($file); mylog("idMessage=".$idMessage." key=".implode(",",array_keys($_REQUEST))." value=".implode(",",array_values($_REQUEST))); unlink("./tmp/".$destinataire); //On efface le fichier pour ne pas engorger le serveur //On appelle la méthode de dépôt de message $rc=RestCall("/depotmsg/push?userIdentifier=".$destinataire."&type=PhoneNumber&messageId=".$idMessage); } } } //Récupération de l'id interne SFR API à utiliser pour envoyer le message. if($method=="getId"){ $status=$_REQUEST["status"]; $error=$_REQUEST["error"]; //Le destinataire a t'il donné son consentement pour recevoir des messages ? $statut=RestCall("/agreement/read?userIdentifier=".$destinataire."&type=PhoneNumber"); $rep=json_decode($statut); if($rep->{"agreement"}->{"statut"}=="PENDING"){ //Le consentement n'a pas encore été reçu donc l'appli demande à SFR API d'être notifier dés qu'il sera reçu $url_callback=URLEncode(DOMAINE."/serveur.php?method=event"); //L'appel de l'API setAgrSubscription permet d'être notifié lorsque le consentement //de dépôt de message sera reçu $rc=RestCall("/event/setAgrSubscription?pushUrl=".$url_callback); //stocke l'identifiant du message à envoyer dans un fichier dont le nom //est le numéro du destinataire $file=fopen("./tmp/".$destinataire,"w"); fwrite($file,$idMessage); fclose($file); } else { //Le destinataire autorise le dépot de message donc on pousse imédiatement le message $rc=RestCall("/depotmsg/push?userIdentifier=".$destinataire."&type=PhoneNumber&messageId=".$idMessage); } } //Permet le retour sur la page d'acceuil de chargement des messages header('Location: index.html'); ?> Fichier index.html : <!DOCTYPE html> <!-- Fichier de fabrication / récupération du fichier audio à déposer sur la boite vocale du destinataire --> <html> <head> <meta charset="ISO-8859-1"> <meta name="viewport" content="width=device-width, maximum-scale=1.0"> <title>Deposer un message</title> <link rel="icon" type="image/png" href="favicon.png"> </head> <body> <TABLE BORDER=0> <TR> <TD><img src="favicon.png" WIDTH=70 HEIGHT=70 ></img></TD> <TD><h1>phpMessageDrop</h1></TD> </TR> </TABLE> <FORM method=POST enctype="multipart/form-data" action="./serveur.php?method=loadMessage"> <TABLE BORDER=0> <TR> <TD>Numero SFR </TD> <TD><INPUT value="06" type=text name="userIdentifier"></TD> </TR> <TR> <TD>Message a deposer</TD> <!-- Si le navigateur implemente la capture audio, l'usage de la sélection de fichier doit ouvrir l'enregistrement audio. le fonctionnement est correct sur Android 4.x --> <TD><input type="file" id="file" accept="audio/*" capture="microphone" name="messageFile"></input></TD> </TR> <TR> <TD COLSPAN=2> <INPUT type="submit" value="Envoyer"> </TD> </TR> </TABLE> </FORM> <br><br> <A HREF="http://api.sfr.fr/acces" TARGET="_blank">Gérer les autorisations d'accès à sa messagerie</A> </body> </html>

Conclusion :


Ce code illustre
- la fonction de dépot de message de SFR API avec un minimum de ligne de code en PHP et HTML5.
- la réception d'un fichier audio par un script php
- l'appel d'API Rest depuis un script php (fonction RestCall)

Hervé Hoareau (http://contribuez.wordpress.com)
Resp Dev SFR API

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.