[TUTO] Envoi de SMS via plateforme ClickSend

Bonjour à tous et toutes,
Pour avoir pas mal cherché (et galéré) je propose de laisser ici un tutoriel sur la configuration du service d’envoi de SMS ClickSend. Je n’ai rien trouvé sur ce sujet dans la communauté, ni ailleurs.

J’utilisais jusqu’à présent le service d’envoi de SMS de MailJet. J’utilisais déjà (et j’utilise toujours) le service mail/snmp de MailJet (gratuit) qui fonctionne très bien. L’envoi de SMS est payant (environ 0,06€ par SMS) et on pouvait recharger de petites sommes et ainsi de tester tranquillement le service sans se lancer dans de grands frais. J’avais réussi à le faire fonctionner depuis Jeedom et ainsi à envoyer des SMS depuis des scénarios. Pour limiter les frais j’ai mis en place un contrôle du nombre de SMS quotidiens que j’envoie et dans une variable j’ai le nombre maximum d’envois que j’autorise. Ca fonctionne bien pour me prévenir du passage du facteur par exemple.
Mais MailJet annonce l’arrêt de ce service au 31 décembre 2023 et renvoi vers une autre société du groupe Sinch (qui a racheté MailJet) : ClickSend.
J’ai donc anticipé pour ne pas me retrouver sans solution en 2024 (même si ce n’est pas vraiment vital).

Notez quand même qu’il existe une solution proposée par Jeedom. Celle-ci peut être alimentée par de petites sommes (à partir de 1€). Le coût d’envoi est de 10 centimes par SMS.

J’ai créé un compte sur le site clicksend.com. Cela m’a donné une période de test d’une quinzaine de jours et 2€ de crédit. De quoi envoyer une trentaine de SMS.
Par la suite le minimum d’achat est de 20€, de quoi tenir longtemps avec un coût par SMS d’environ 7 centimes. Contrainte : il faut envoyer au moins un SMS tous les 6 mois sinon le crédit restant est perdu.

L’ouverture du compte me donne un « username » qui par défaut est l’adresse mail d’inscription et une clé d’authentification pour se connecter à l’API (API Key).
On peut créer d’autre subaccount (sous-compte, ou utilisateur) qui auront une autre clé.

Un 1er truc ou j’ai passé du temps c’est de coder le couple username:APIKey en base64. J’ai utilisé un service en ligne (surement pas la meilleure idée) mais si vous savez le coder en PHP ou autre chose, à vous de jouer.
Donc on prend username:APIKey (séparé par les deux-points) et on le code en base64 (attention à ne pas prendre un espace au bout ou un retour à la ligne). On récupère ce code (dans mon cas il fait 76 caractères) pour la suite.

Le fonctionnement :

  1. On appelle l’API par son URL (https://rest.clicksend.com/v3/sms/send)
  2. On s’authentifie
  3. On passe 3 paramètres :
    a. from : le nom d’expéditeur qui va s’afficher sur le SMS reçu
    b. to : le numéro de téléphone du destinataire au format +336xxxxx
    c. body : le corps du message (entre guillemets)
    C’est assez simple / basic mais voilà, j’ai bien galéré avec la syntaxe, les guillemets, les backslash-guillemets, les quotes (apostrophes) et l’utilisation de « system » que j’ai remplacé par « shell_exec » pour voir enfin la commande fonctionner.

Voici le code qui fonctionne pour moi (inséré dans un bloc code dans un scénario).
Je récupère d’abord les variables From, Body et To que j’ai renseigné en amont dans le scénario (avec « variable »)
Et je lance la commande suivante (remplacer username:APIKey_codé_en_base64 par le vôtre.)

$messageClickSend = '"'.$scenario->getData('SMS_Body').'"';
$destClickSend = '"'.$scenario->getData('SMS_To').'"';
$fromClickSend = $scenario->getData('SMS_From');

$json = shell_exec("curl --include \
     --header 'Authorization: Basic username:APIKey_codé_en_base64  '  \
     --request POST \
     --header 'Content-Type: application/json' \
     --data-binary ' {
        \"messages\":[
            {
                \"from\":$fromClickSend,
                \"body\":$messageClickSend,
                \"to\":$destClickSend
            }
        ]
      }' \
'https://rest.clicksend.com/v3/sms/send'
");

$scenario->setLog($json);

Dernières subtilités :
La variable SMS_To est initialisée plus tôt dans le scénario sous la forme « +336xxxx ».
En faisant $destClickSend= scanario->getData(‹ SMS_To ›);
On récupère +336xxxx (on a perdu les guillemets).
Je rajoute avant et après des guillemets (sinon ca ne fonctionne pas).
Idem autour de la variable SMS_Body, sinon on a un retour « The messages array is empty. » (pas de contenu)
Pour la variable SMS_From : pas d’espace, un simple mot (genre « Jeedom »).

Voila, j’espère ne pas vous avoir ennuyé avec ça, mais si un jour quelqu’un cherche de l’info sur le sujet, il en trouvera un peu ici. Mon plus gros problème a été de gérer les guillemets dans les variables :slight_smile:

Salut,

bon je sais qu’ici ça coute 0.07€ mais, au cas ou vous seriez passé à coté, pour 0.1€ (donc oui 0.03€ de plus par sms), il n’y a rien à faire excepté installer le plugin-phonemarket :wink:

mais chacun peut choisir où il met son temps et son argent :slight_smile:
merci pour le tuto

J’aurai surement du commencer par là… :upside_down_face:
J’y reviendrai sûrement.

Re bonjour,

En fait j’avais un besoin similaire et finalement elle n’est pas si mal cette solution car pour l’envoi vers des numéros belge la solution plugin-phonemarket est assez couteuse (0.2€ le sms).

Du coup j’ai fait un petit plugin qui est dispo en beta: Jeedom Market

pour le moment il permet l’envoi de sms, d’appel (tts) et il récupère le solde restant sur le compte