PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Aide envoi de SMS via API rest OVH
Aide envoi de SMS via API rest OVH
Débuté par Martin Christophe, 05 oct. 2015 14:50 - 28 réponses
Posté le 05 octobre 2015 - 14:50
Bonjour à tous et à toutes,

Voilà je suis en train de tester l'api d'OVH avec Windev pour envoyer des SMS. Pour ce faire il faut que je me connecte à l'api
dans un premier temps puis je pourrais envoyer des messages. Pour me connecter à l'API il est nécessaire de faire une requête HTTP avec différents header et dans l'un deux une signature.

Voilà mon bous de code:
//Récupération du timestamp Unix
Heuredate est une chaîne = DateSys() + Gauche(HeureSys(), 6)
HeuredateUTC est une chaîne = Gauche(DateHeureLocaleVersUTC(Heuredate), 14)

TimeStamp est une chaîne = "19700101000000"

DiffDateHeure est une chaîne = DateHeureDifférence(TimeStamp, HeuredateUTC)

Durée est une Durée = ChaîneVersDurée(DiffDateHeure,duréeCentième)

ResultatTimeStamp est un entier = Durée..Jour * 86400 + Durée..Heure * 3600 + Durée..Minute * 60 + Durée..Seconde

//HASH de la requête à envoyé à OVH
signature="$1$"+ HashChaîne(HA_SHA_160,applicationSecret+"+"+consumerKey+"+GET+https://eu.api.ovh.com/1.0/sms/"+"++"+ ResultatTimeStamp)

//Création de la requête
enTeteHTTP est une chaîne="Content-Type: application/json"+RC+"X-Ovh-Application:"+applicationKey+RC+"X-Ovh-Consumer:"+consumerKey+RC+"X-Ovh-Signature:"+signature+RC+"X-Ovh-Timestamp:"+ResultatTimeStamp+RC
resRequete est une chaîne
resRequete=HTTPRequête("https://eu.api.ovh.com/1.0/sms/","",enTeteHTTP)


La partie qui nous interresse est le hash de la requête et son envoi, si quelqu'un a déjà fait ce genre de choses je suis preneur de tout aide, j'y suis depuis ce matin...

En vous remerciant d'avance
Posté le 07 octobre 2015 - 22:23
Personne ? je suis également intéressé :)
Posté le 08 octobre 2015 - 23:08
Bonjour,
je suis dans le même cas avec un code similaire. Cependant j'ai déja remarqué la chose suivante.

Si on fait simplement :

signature="$1$"+ HashChaîne(HA_SHA_160,applicationSecret+"+"+consumerKey+"+GET+https://eu.api.ovh.com/1.0/sms/"+"++"+ ResultatTimeStamp)


et que l'on compare la chaine à "HASHER" avec un convertisseur en ligne on se rend compte que HASHCHAINE renvoi un buffer hors il faut envoyer à OVH un texte brut. Avec le code suivant j'obtient la même réponse que le site de conversion on-line
(J'ai repris ici votre code)
sTmp est une chaîne = BufferVersHexa(HashChaîne(HA_SHA_160,sApplicationsecret+"+"+consumerKey+"+GET+https://eu.api.ovh.com/1.0/sms/"+"++"+ ResultatTimeStamp))
sTmp=(Minuscule(Remplace(sTmp,[Caract(32),RC],"")))


signature est une chaîne ="$1$"+sTmp

Malheureusement j'ai toujours la même réponse du serveur OVH (BAD SIGNATURE)

Du nouveau de votre côté ?
Posté le 08 octobre 2015 - 23:37
Autant pour moi

En convertissant le buffer en hexa et en supprimant les RC et les espace (caract(32)) ça fonctionne.
(Une erreur lors de la copie des codes OVH)
résultat de httpdonnerésultat :

["sms-qt1497-1"]

Pour rappel le code complet (sans les clefs)

nSTime est un entier = TIMESTAMP()
sTosign est une chaîne = ovhapiNV.AS+"+"+ovhapiNV.CK+"+"+"GET"+"+"+"https://eu.api.ovh.com/1.0/sms/"+"++"+nSTime
sTmp est une chaîne= BufferVersHexa(HashChaîne(HA_SHA_160,sTosign))
sTmp =(Minuscule(Remplace(sTmp,[Caract(32),RC],"")))
sIgnature est une chaîne ="$1$"+Minuscule(sTmp)

HTTPRequête("https://eu.api.ovh.com/1.0/sms/","","X-Ovh-Application:"+ovhapiNV.AK+RC+"X-Ovh-Consumer:"+ovhapiNV.CK+RC+"X-Ovh-Signature:"+sIgnature+RC+"X-Ovh-Timestamp:"+nSTime,"","application/json")
Trace(HTTPDonneRésultat())
Posté le 09 octobre 2015 - 01:21
Re.

Encore un dernier message pour vous confirmer que cela fonctionne. Je peux envoyé des sms via une fenêtre Windev.

Je suis occupé à le ré-encoder sous formes de classe.
Membre enregistré
1 message
Posté le 09 octobre 2015 - 01:32
Bonjour,

Cela fonctionne.

la fonction HASHCHAINE renvoi un buffer qui doit etre converti pour etre compris par OVH

Si vous avez besoin d'aide, j'ai pu envoyer des SMS.

(Je suis occupé à recoder tout ça sous forme de classe.)

Voici la solution :

nSTime est un entier = :TIMESTAMP()
sTosign est une chaîne = :AS+"+"+:CK+"+"+"GET"+"+"+"https://eu.api.ovh.com/1.0/sms/"+"++"+nSTime
sTmp est une chaîne= BufferVersHexa(HashChaîne(HA_SHA_160,sTosign))
sTmp =(Minuscule(Remplace(sTmp,[Caract(32),RC],"")))
sIgnature est une chaîne ="$1$"+(sTmp)
HTTPRequête("https://eu.api.ovh.com/1.0/sms/","","X-Ovh-Application:"+:AK+RC+"X-Ovh-Consumer:"+:CK+RC+"X-Ovh-Signature:"+sIgnature+RC+"X-Ovh-Timestamp:"+nSTime,"","application/json")


En reprenant le code de Martin Christophe voici ce qu'il y à lieu de changer :

[code:wl]
//HASH de la requête à envoyé à OVH

//signature="$1$"+ HashChaîne(HA_SHA_160,applicationSecret+"+"+consumerKey+"+GET+https://eu.api.ovh.com/1.0/sms/"+"++"+ ResultatTimeStamp)

signature =BufferVersHexa(HashChaîne(HashChaîne(HA_SHA_160,applicationSecret+"+"+consumerKey+"+GET+https://eu.api.ovh.com/1.0/sms/"+"++"+ ResultatTimeStamp))

signature="$1$"+(Minuscule(Remplace(signature,[Caract(32),RC],"")))
Posté le 07 janvier 2016 - 15:28
Bonjour,

Actuellement, j'utilise le service SoAPI mais celui ci va bientôt cesser de fonctionner, je migre pour utiliser l'API V6.

J'ai repris votre code pour l'envoi de SMS via l'API d'OVH.

En résultat de la requête HTTP, j'ai l'erreur suivante :
{"errorCode":"NOT_GRANTED_CALL","httpCode":"403 Forbidden","message":"This call has not been granted"}

Pour les codes AK, AS et CK, je les ai récupérés via cette page :
https://eu.api.ovh.com/createToken/

Avez-vous fait de même ?
Voyez-vous d'où peut venir l'erreur ?

Merci d'avance
Posté le 13 octobre 2016 - 13:16
Bonjour,

J'arrive à la même erreur que vous. Avez trouvez une solution ?
Merci
Posté le 24 novembre 2016 - 16:44
Bonjour,

Je me permet de relancer le sujet, j'ai réussi en utilisant le code très gentiment proposé par Qouet a faire la première étape pour l'envoi de SMS, c'est à dire récupérer "récupération du compte SMS" :

sEntete est une chaîne = "X-Ovh-Application:"+sAK+RC+...
"X-Ovh-Consumer:"+sCK+RC+...
"X-Ovh-Signature:"+sIgnature+RC+...
"X-Ovh-Timestamp:"+nSTime

HTTPRequête("https://eu.api.ovh.com/1.0/sms/","",sEntete,"","application/json")
sCompteSMS est une chaîne = HTTPDonneRésultat()
Trace(sCompteSMS)


Cela fonctionne parfaitement et sans soucis.
Maintenant là ou ça se complique c'est pour l'étape suivante, l'envoi de SMS.

J'essai de me baser sur l'exemple en C# fourni par OVH accessible au travers du lien suivant

https://www.ovh.com/fr/g1654.envoyer_des_sms_avec_lapi_ovh_en_c…

Mon problème numéro 1 est que je ne maitrise pas le sujet, ce sont mes premiers pas en httprequete, j'ai pour l'instant toujours utilisé des webservices SOAP en les intégrant dans windev (beaucoup plus facile ^^)

Au premier abord, ça ressemble fort à la récupération du compte SMS, la différence est qu'il faut passer une enveloppe BODY en plus et se mettre en mode "POST"

Pour la partie body essayé de faire ça :
// je déclare une structure
stBody est une structure
charset est une chaîne
receivers est un tableau de chaînes
'Message' est une chaîne
priority est une chaîne
senderForResponse est une chaîne
FIN

//J'instancie un stBody et je le rempli
stBodyToSend est un stBody

stBodyToSend:charset = "UTF-8"
Ajoute(stBodyToSend:receivers,"+monNumDeTelephone")
stBodyToSend:'Message' = "Test SMS OVH"
stBodyToSend:priority = "high"
stBodyToSend:senderForResponse = True

// Je sérialise la chaine au format JSON
Sérialise(stBodyToSend, sBody, psdJSON)


Puis, n'écoutant que mon courage, je me lance désespérément dans un
HTTPRequête("https://eu.api.ovh.com/1.0/sms/"+sServiceName+"/jobs/","",sEntete,sBody,"application/json")
sRetour est une chaîne = HTTPDonneRésultat()
Trace(sRetour)


Et là, je trace me renvoi inlassablement un :
{"errorCode":"INVALID_SIGNATURE","httpCode":"400 Bad Request","message":"Invalid signature"}

Sachant que la signature est la même que dans le code pour récuperer le compte SMS est que celui-ci fonctionne, j'avoue que je sèche un peu...

L'un (ou l'une) d'entre vous aurait-il une idée ?

Merci d'avance
Posté le 27 décembre 2016 - 10:00
Bonjour Maxime,

Avant tout, merci beaucoup pour ce bout de code très propre, qui nous éclaire sur la façon de procéder, mais j'arrive inévitablement au même résultat que toi avec pour toute réponse:
{"errorCode":"INVALID_SIGNATURE","httpCode":"400 Bad Request","message":"Invalid signature"}

As tu trouvé la réponse à ce problème ?

Je vous remercie par avance.
Posté le 03 février 2017 - 10:42
Salut à tous
Il faut modifier la signature
Du style
String toSign = AS + "+" + CK + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + TSTAMP;

A voir sur
https://www.ovh.com/fr/g1670.guide…
Membre enregistré
12 messages
Popularité : +0 (2 votes)
Posté le 22 décembre 2017 - 11:01
Bonjour a tous et toutes,
Nous souhaitons faire l'envoi de SMS via l'api REST d'OVH.
Malgré la lecture des différents post, toujours cette erreur 400 :
{"errorCode":"INVALID_SIGNATURE","httpCode":"400 Bad Request","message":"Invalid signature"}

Je colle le code si qq'un à une idée du pourquoi ....
Je sèche (et je suis pas le seul dans l’équipe)
Merci et bonnes fêtes...

// Déclaration de la structure
st_SMS est une Structure
receivers est un tableau dynamique de chaîne
'message' est une chaîne
priority est une chaîne
sender est une chaîne
senderForResponse est un booléen
FIN

// instanciation de la structure
Mon_Sms est un st_SMS
Mon_Sms.'message' = "test"
Mon_Sms.priority = "high"
Mon_Sms.sender = "MonSenderQuiExiste"
Ajoute(Mon_Sms.receivers,"+33......")
Mon_Sms.senderForResponse = Vrai

// sérialisation
BODY est une chaîne
Sérialise(Mon_Sms,BODY,psdJSON)

BODY = ChaîneVersUTF8(BODY)

soit ServiceName = "sms-mc........"
soit METHOD = "POST"
soit QUERY = "https://eu.api.ovh.com/1.0/sms/"+ServiceName+"/jobs/"

soit TSTAMP = TimeStamp() // essai avec : HTTPRequête("https://eu.api.ovh.com/1.0/auth/time") -> mm résultat

//Création de la signature
soit cSigne = AS + "+" + CK + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + TSTAMP
cTmp est une chaîne = BufferVersHexa( HashChaîne( HA_SHA_160,ManSigne ) )
cTmp = ( Minuscule( Remplace( cTmp,[Caract(32),RC],"" ) ) )
soit Signature = "$1$"+Minuscule(cTmp)

// init & Envoi de la requete
soit RqEnvoi est un restRequête
RqEnvoi..URL = QUERY
RqEnvoi..Méthode = METHOD
RqEnvoi..ContentType = "application/json"
RqEnvoi..Entête["X-Ovh-Application"] = AK
RqEnvoi..Entête["X-Ovh-Consumer"] = CK
RqEnvoi..Entête["X-Ovh-Signature"] = Signature
RqEnvoi..Entête["X-Ovh-Timestamp"] = "" + TSTAMP
rqReponse est une restRéponse = RESTEnvoie(RqEnvoi)

Trace(rqReponse.CodeEtat,rqReponse.Contenu)
Message modifié, 22 décembre 2017 - 11:03
Posté le 12 janvier 2018 - 08:17
Bonjour à tous,

Je rencontre exactement le même problème. si La récupération du compte SMS (ce qui semble indiquer que la méthode de génération de la signature fonctionne ) l'envoi d'un SMS ne fonctionne pas et j'obtiens la même erreur en retour

{"errorCode":"INVALID_SIGNATURE","httpCode":"400 Bad Request","message":"Invalid signature"}

je n'ai vraiment aucune piste.

Avez vous déjà réussi à envoyer un SMS avec l' API ?

Merci de votre retour.

Hervé HARLAY
Membre enregistré
12 messages
Popularité : +0 (2 votes)
Posté le 21 février 2018 - 10:49
Voici le code fonctionnel pour API OVH SMS en Windev 23. Si message d'erreur : refaire les ApplicationKey....

Par contre la copie du code en webdev pour faire une API Rest ne fonctionne pas...bizarre, une idée

// Structure SMS
st_Sms est une structure
charset est une chaîne
coding est une chaîne
'Message' est une chaîne
noStopClause est un booléen
priority est une chaîne
receivers est un tableau dynamiquedynamique de chaîne
sender est une chaîne
senderForResponse est un booléen
validityPeriod est un entier
FIN
// Reponse
st_Reponse est une structure
totalCreditsRemoved est une entier
invalidReceivers est un tableau dynamiquedynamique de chaîne
ids est un tableau dynamique d'entiers
validReceivers est un tableau dynamiquedynamique de chaîne
FIN
MaReponse est un st_Reponse

MonSms est un st_Sms
MonSms.charset = "UTF-8"
MonSms.coding = "8bit"
MonSms.'Message' = LeTexte
MonSms.noStopClause = Vrai
MonSms.priority = "high"
Ajoute(MonSms.receivers,NoMobile)
MonSms.sender = "Sender qui existe dans le compte OVH"
MonSms.senderForResponse = Faux
MonSms.validityPeriod = 2880

soit BODY = ""
Sérialise(MonSms,BODY,psdJSON)

soit reqEnvoi est une restRequête
soit reqReponse est une restRéponse
soit QUERY = "https://eu.api.ovh.com/1.0/sms/+"CompteSMSOVH+"/jobs"

reqEnvoi.URL = QUERY
reqEnvoi.Méthode = httpPost
reqEnvoi.ContentType = "application/json"
reqEnvoi.Entête["X-Ovh-Application"] = Application_Key
reqEnvoi.Entête["X-Ovh-Consumer"] = Consumer_Key

HTTPRequête("https://eu.api.ovh.com/1.0/auth/time")
nSTime est une chaîne = HTTPDonneRésultat()

soit METHOD = "POST"
soit ManSigne = Application_Secret + "+" + Consumer_Key + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + nSTime
cTmp est une chaîne=BufferVersHexa(HashChaîne(HA_SHA_160,ManSigne))
cTmp=(Minuscule(Remplace(cTmp,[Caract(32),RC],"")))
soit Signature = "$1$"+Minuscule(cTmp)
reqEnvoi.Contenu = BODY
reqEnvoi.Entête["X-Ovh-Signature"] = Signature
reqEnvoi.Entête["X-Ovh-Timestamp"] = nSTime

reqReponse = RESTEnvoie(reqEnvoi)
SI reqReponse.CodeEtat = 200
Désérialise(MaReponse,reqReponse.Contenu,psdJSON)
SINON
Erreur(reqReponse.CodeEtat+" - "+reqReponse.Contenu)
FIN
Message modifié, 21 février 2018 - 10:51
Membre enregistré
91 messages
Popularité : +3 (3 votes)
Posté le 21 février 2018 - 16:21
Bonjour,

pour dans ta déclaration de la structure le mot Dynamique est doublé ???

st_Reponse est une structure
totalCreditsRemoved est une entier
invalidReceivers est un tableau dynamiquedynamique de chaîne
ids est un tableau dynamique d'entiers
validReceivers est un tableau dynamiquedynamique de chaîne
FIN

Stéphane
Membre enregistré
12 messages
Popularité : +0 (2 votes)
Posté le 21 février 2018 - 17:10
Ha oui tien, c'est une erreur de copier/coller dans le code "d'origine" pas de double, merci pour l'info :merci:
Posté le 01 juin 2018 - 12:37
Merci pour ce script!
Quelqu'un a-t-il des infos sur la création de la clé chez OVH?
l'adresse: https://api.ovh.com/createToken
Dans le champ "Rights" j'ai mis POST mais pour le champs "Path" à côté je ne sais pas quoi mettre?

Merci de votre aide.
Posté le 01 juin 2018 - 17:15
plusieurs anomalies dans votre code qui le rendent non fonctionnel.
'Message' doit être 'message' notament
Voici la correction:

// Structure SMS
st_Sms est une structure
charset est une chaîne
coding est une chaîne
'Message' est une chaîne
noStopClause est un booléen
priority est une chaîne
receivers est un tableau dynamiquedynamique de chaîne
sender est une chaîne
senderForResponse est un booléen
validityPeriod est un entier
FIN
// Reponse
st_Reponse est une structure
totalCreditsRemoved est une entier
invalidReceivers est un tableau dynamiquedynamique de chaîne
ids est un tableau dynamique d'entiers
validReceivers est un tableau dynamiquedynamique de chaîne
FIN
MaReponse est un st_Reponse

MonSms est un st_Sms
MonSms.charset = "UTF-8"
MonSms.coding = "8bit"
MonSms.'Message' = "LeTexteDuSMS"
MonSms.noStopClause = Vrai
MonSms.priority = "high"
Ajoute(MonSms.receivers,NoMobile)
MonSms.sender = "Sender qui existe dans le compte OVH"
MonSms.senderForResponse = Faux
MonSms.validityPeriod = 2880

soit BODY = ""
Sérialise(MonSms,BODY,psdJSON)

soit reqEnvoi est une restRequête
soit reqReponse est une restRéponse
soit QUERY = "https://eu.api.ovh.com/1.0/sms/+"CompteSMSOVH"+"/jobs"

reqEnvoi.URL = QUERY
reqEnvoi.Méthode = httpPost
reqEnvoi.ContentType = "application/json"
reqEnvoi.Entête["X-Ovh-Application"] = Application_Key
reqEnvoi.Entête["X-Ovh-Consumer"] = Consumer_Key

HTTPRequête("https://eu.api.ovh.com/1.0/auth/time")
nSTime est une chaîne = HTTPDonneRésultat()

soit METHOD = "POST"
soit ManSigne = Application_Secret + "+" + Consumer_Key + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + nSTime
cTmp est une chaîne=BufferVersHexa(HashChaîne(HA_SHA_160,ManSigne))
cTmp=(Minuscule(Remplace(cTmp,[Caract(32),RC],"")))
soit Signature = "$1$"+Minuscule(cTmp)
reqEnvoi.Contenu = BODY
reqEnvoi.Entête["X-Ovh-Signature"] = Signature
reqEnvoi.Entête["X-Ovh-Timestamp"] = nSTime

reqReponse = RESTEnvoie(reqEnvoi)
SI reqReponse.CodeEtat = 200
Désérialise(MaReponse,reqReponse.Contenu,psdJSON)
SINON
Erreur(reqReponse.CodeEtat+" - "+reqReponse.Contenu)
FIN
Posté le 01 juin 2018 - 17:17
Membre enregistré
3 messages
Popularité : +1 (1 vote)
Posté le 04 juin 2018 - 19:33
Dans le code ci-dessus, le copier/coller engendre une erreur sur la variable 'Message' qui doit être 'message'
Par contre le fait de sérialiser avec psdJSON entraine le remplacement des caractères accentués comme "é" par "\u00e9e" ce qui ajoute des caractères au sms. comment éviter cela? Merci de votre aide.
Membre enregistré
38 messages
Popularité : +1 (1 vote)
Posté le 11 octobre 2019 - 16:50
Bonjour

Voici la version 2.343 beta actualisée :), j'ai ajouté les variables manquantes pour une plus grande facilité d'utilisation

Merci pour l'exemple


CompteSMSOVH, Application_Key, Consumer_Key, Application_Secret,NoMobile est une chaîne

CompteSMSOVH="moncomptesmsOVH"
Application_Key="MaClef"
Consumer_Key="MaClef"
Application_Secret="MaClef"
NoMobile= "N° de mobile du destinataire format international +33"

Sender est une chaîne = "Expediteur présent dans le compte ovh"
ScriptName est une chaîne = "NomDu Script API KEY"

// URL pour construire les clefs API

// https://api.ovh.com/createToken/index.cgi…

// Structure SMS
st_Sms est une Structure
charset est une chaîne
coding est une chaîne
'message' est une chaîne
noStopClause est un booléen
priority est une chaîne
receivers est un tableau dynamique de chaîne
Sender est une chaîne
senderForResponse est un booléen
validityPeriod est un entier
FIN
// Reponse
st_Reponse est une Structure
totalCreditsRemoved est une entier
invalidReceivers est un tableau dynamique de chaîne
ids est un tableau dynamique d'entiers
validReceivers est un tableau dynamique de chaîne
FIN
MaReponse est un st_Reponse

MonSms est un st_Sms
MonSms.charset = "UTF-8"
MonSms.coding = "8bit"
MonSms.'message' = "LeTexteDuSMS"
MonSms.noStopClause = Vrai
MonSms.priority = "high"
Ajoute(MonSms.receivers,NoMobile)
MonSms.Sender = Sender
MonSms.senderForResponse = Faux
MonSms.validityPeriod = 2880

soit BODY = ""
Sérialise(MonSms,BODY,psdJSON)

soit reqEnvoi est un httpRequête
soit reqReponse est un httpRéponse
soit QUERY = "https://eu.api.ovh.com/1.0/sms/"+CompteSMSOVH+"/jobs"

reqEnvoi..URL = QUERY
reqEnvoi..Méthode = httpPost
reqEnvoi..ContentType = "application/json"
reqEnvoi.Entête["X-Ovh-Application"] = Application_Key
reqEnvoi.Entête["X-Ovh-Consumer"] = Consumer_Key
reqEnvoi..AgentUtilisateur = ScriptName
HTTPRequête("https://eu.api.ovh.com/1.0/auth/time")
nSTime est une chaîne = HTTPDonneRésultat()

soit METHOD = "POST"
soit ManSigne = Application_Secret + "+" + Consumer_Key + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + nSTime
cTmp est une chaîne=BufferVersHexa(HashChaîne(HA_SHA_160,ManSigne))
cTmp=(Minuscule(Remplace(cTmp,[Caract(32),RC],"")))
soit Signature = "$1$"+Minuscule(cTmp)
reqEnvoi..Contenu = BODY
reqEnvoi.Entête["X-Ovh-Signature"] = Signature
reqEnvoi.Entête["X-Ovh-Timestamp"] = nSTime

reqReponse = RESTEnvoie(reqEnvoi)
SI reqReponse..CodeEtat = 200
Désérialise(MaReponse,reqReponse..Contenu,psdJSON)
SINON
Erreur(reqReponse..CodeEtat+" - "+reqReponse..Contenu)
FIN
Membre enregistré
38 messages
Popularité : +1 (1 vote)
Posté le 11 octobre 2019 - 16:58
Bonjour à tous,

j'ai un souci avec le code ce dessus, avec le message d'erreur suivant :

<httpRéponse> Contenu={"message":"Received not described parameters: (Sender) while calling creation handler"}

En sender je met la chaine correspondant à l'expéditeur de mon compte ovh (ici un numéro de tel en +33664XXXXXX)

Quelqu'un à une idée ??
Membre enregistré
38 messages
Popularité : +1 (1 vote)
Posté le 11 octobre 2019 - 17:14
Oki voici la solution pour virer le parametre Sender..... Cette solution permet d'éviter de créer un expéditeur et d'utiliser des numéros courts

La solution en PHP est ici https://docs.ovh.com/fr/sms/envoyer_des_sms_avec_lapi_ovh_en_php/

Enjoy !

CompteSMSOVH, Application_Key, Consumer_Key, Application_Secret,NoMobile est une chaîne

CompteSMSOVH="moncomptesmsOVH"
Application_Key="MaClef"
Consumer_Key="MaClef"
Application_Secret="MaClef"
NoMobile= "N° de mobile du destinataire format international +33"

// Sender est une chaîne = "Expediteur présent dans le compte ovh"
ScriptName est une chaîne = "NomDu Script API KEY"

// URL pour construire les clefs API

// https://api.ovh.com/createToken/index.cgi…

// Structure SMS
st_Sms est une Structure
charset est une chaîne
coding est une chaîne
'message' est une chaîne
noStopClause est un booléen
priority est une chaîne
receivers est un tableau dynamique de chaîne
// Sender est une chaîne A DESACTIVER
senderForResponse est un booléen
validityPeriod est un entier
FIN
// Reponse
st_Reponse est une Structure
totalCreditsRemoved est une entier
invalidReceivers est un tableau dynamique de chaîne
ids est un tableau dynamique d'entiers
validReceivers est un tableau dynamique de chaîne
FIN
MaReponse est un st_Reponse

MonSms est un st_Sms
MonSms.charset = "UTF-8"
MonSms.coding = "8bit"
MonSms.'message' = "LeTexteDuSMS"
MonSms.noStopClause = Vrai
MonSms.priority = "high"
Ajoute(MonSms.receivers,NoMobile)
// MonSms.Sender = Sender
MonSms.senderForResponse = True // UTILISATION DES NUMEROS COURS
MonSms.validityPeriod = 2880

soit BODY = ""
Sérialise(MonSms,BODY,psdJSON)

soit reqEnvoi est un httpRequête
soit reqReponse est un httpRéponse
soit QUERY = "https://eu.api.ovh.com/1.0/sms/"+CompteSMSOVH+"/jobs"

reqEnvoi..URL = QUERY
reqEnvoi..Méthode = httpPost
reqEnvoi..ContentType = "application/json"
reqEnvoi.Entête["X-Ovh-Application"] = Application_Key
reqEnvoi.Entête["X-Ovh-Consumer"] = Consumer_Key
// reqEnvoi..AgentUtilisateur = ScriptName PAS UTILE
HTTPRequête("https://eu.api.ovh.com/1.0/auth/time")
nSTime est une chaîne = HTTPDonneRésultat()

soit METHOD = "POST"
soit ManSigne = Application_Secret + "+" + Consumer_Key + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + nSTime
cTmp est une chaîne=BufferVersHexa(HashChaîne(HA_SHA_160,ManSigne))
cTmp=(Minuscule(Remplace(cTmp,[Caract(32),RC],"")))
soit Signature = "$1$"+Minuscule(cTmp)
reqEnvoi..Contenu = BODY
reqEnvoi.Entête["X-Ovh-Signature"] = Signature
reqEnvoi.Entête["X-Ovh-Timestamp"] = nSTime

reqReponse = RESTEnvoie(reqEnvoi)
SI reqReponse..CodeEtat = 200
Désérialise(MaReponse,reqReponse..Contenu,psdJSON)
SINON
Erreur(reqReponse..CodeEtat+" - "+reqReponse..Contenu)
FIN
Membre enregistré
193 messages
Popularité : +3 (3 votes)
Posté le 01 novembre 2019 - 03:24
Bonjour

j'ai essayé votre solution, mais il me dit : 403 message this call has not been granted

error code NOT_GRANTED_CALL


une idée ?

j'ai fait la demande comme ci dessous



Membre enregistré
6 messages
Posté le 10 janvier 2020 - 19:24
Bonjour,
J'ai la même erreur: "NOT_GRANTED_CALL"......"This call has not been granted."
Quelqu'un a une idée ?
Merci.
Jean-Luc
Membre enregistré
11 messages
Popularité : +2 (2 votes)
Posté le 06 avril 2020 - 13:19
Bonjour.
J'ai suivi la proposition de @Hervé Franco pour la version 2.343 beta. Avec Windev, tout marche bien. Par contre avec Webdev (Config = Webservice REST) ça ne marche pas. J'ai l'erreur "Invalid Signature".
Quelqu'un peut-il m'aider ?
Merci d'avance
Membre enregistré
177 messages
Popularité : +16 (16 votes)
Posté le 06 avril 2020 - 14:17
Bonjour Cefaliyon,

Vois le code que j'ai proposé tout en bas de ce thread:
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/190731-api-ovh/read.awp…
Membre enregistré
11 messages
Popularité : +2 (2 votes)
Posté le 07 avril 2020 - 11:11
Merci Jean-Marc.
J'ai trouvé le problème. En faite dans la description de la configuration, j'utilisais des chaines Unicodes en exécution. Quand je l'ai ramené en ANSI, tout marche sans soucis. Je ne sais pas s'il y'a modification à faire dans le code en fonction de cette configuration. Bien à vous
Posté le 24 octobre 2021 - 13:19
La version de Jean-Marc pour l'unicode

Procedure SMS_OVH_Envoie(LOCAL sNumero est une chaîne, LOCAL sMessage est une chaîne)

// DOC
// Générer sApplicationKey, sApplicationSecret et sConsumerKey : https://eu.api.ovh.com/createToken/
// API Console : https://api.ovh.com/console/#/sms/%7BserviceName%7D/jobs#POST
// Manager : https://www.ovhtelecom.fr/manager/#/sms/

sApplicationKey est une chaîne = ""
sApplicationSecret est une chaîne = ""
sConsumerKey est une chaîne = ""
sServiceName est une chaîne = "" // Nom du compte dans le manageur ovh (Commence par sms-*** )


stSms_jobs est une structure
charset est une chaîne
coding est une chaîne
'class' est une chaîne
sender est une chaîne
receivers est un tableau de chaînes
'Message' est une chaîne
priority est une chaîne
senderForResponse est un booléen
noStopClause est une booléen
FIN

stSms_jobs est un stSms_jobs

stSms_jobs.charset = "UTF-8"
stSms_jobs.coding = "7bit" // 7bit (default) | 8bit
stSms_jobs.class = "phoneDisplay" // phoneDisplay (default) | flash | sim | toolkit
stSms_jobs.sender = "" // Il faut le configurer dans l'interface d'ovh
Ajoute(stSms_jobs.receivers ,sNumero)
stSms_jobs.message = sMessage
stSms_jobs.priority = "high"
stSms_jobs.senderForResponse = False
stSms_jobs.noStopClause = True


sUrl est une chaîne ANSI
sToSign est une chaîne ANSI
sSignature est une chaîne ANSI
sBody est une chaîne ANSI = ""

Req est une httpRequête
reponse est un httpRéponse

sUrl = "https://eu.api.ovh.com/1.0/sms/"+sServiceName+"/jobs/"

sBody = WL.VariantVersJSON(stSms_jobs)

pDateHeure est une DateHeure = Maintenant()
sHeuredate est une chaîne ANSI = Gauche(pDateHeure,14)
sHeuredateUTC est une chaîne ANSI = Gauche(DateHeureLocaleVersUTC(sHeuredate),14)
sTimeStamp est une chaîne ANSI = "19700101000000"
sDiffDateHeure est une chaîne ANSI = DateHeureDifférence(sTimeStamp, sHeuredateUTC)
dDurée est une Durée = ChaîneVersDurée(sDiffDateHeure,duréeCentième)
nTimeStamp est un entier = dDurée..Jour * 86400 + dDurée..Heure * 3600 + dDurée..Minute * 60 + dDurée..Seconde

Req.Méthode = httpPost

sToSign = sApplicationSecret + "+" + sConsumerKey + "+POST+" + sUrl + "+" + sBody + "+" + nTimeStamp;
sSignature = "$1$"+(Minuscule(Remplace(WL.BufferVersHexa(HashChaîne(HA_SHA_160,sToSign)),[Caract(32),RC],"")))

Req.URL = sUrl
Req.Entête["Content-Type"] = "application/json"
Req.Entête["X-Ovh-Application"] = sApplicationKey
Req.Entête["X-Ovh-Consumer"] = sConsumerKey
Req.Entête["X-Ovh-Signature"] = sSignature
Req.Entête["X-Ovh-Timestamp"] = "" + nTimeStamp
Req.Contenu = sBody
Req.IgnoreErreur = httpIgnoreCertificatExpiré+httpIgnoreCertificatInvalide+httpIgnoreNomCertificatInvalide

reponse = HTTPEnvoie(Req)

SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
SI reponse.CodeEtat >= 200 _ET_ reponse.CodeEtat <230 ALORS
ToastValidé("Connexion valide ")
SINON
vRep est un Variant = WL.JSONVersVariant(reponse..Contenu)
Erreur(vRep.message)
FIN
FIN

PROCEDURE INTERNE HashSHA(sChaine est une chaîne ANSI )
sSha est un chaîne ANSI = HashChaîne(HA_SHA_160,sChaine)
sShaBuffer est une chaîne ANSI = WL.BufferVersHexa(sSha)
sChaineX est une chaîne ANSI = Minuscule(Remplace(sShaBuffer,[Caract(32),RC],""))
RENVOYER sChaineX
FIN