PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2025 → Aide envoi de SMS via API rest OVH
Aide envoi de SMS via API rest OVH
Iniciado por christophe83200.83, out., 05 2015 2:50 PM - 28 respostas
Publicado em outubro, 05 2015 - 2:50 PM
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
Publicado em outubro, 07 2015 - 10:23 PM
Personne ? je suis également intéressé :)
Publicado em outubro, 08 2015 - 11:08 PM
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é ?
Publicado em outubro, 08 2015 - 11:37 PM
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())
Publicado em outubro, 09 2015 - 1:21 AM
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.
Membro registado
1 mensagem
Publicado em outubro, 09 2015 - 1:32 AM
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],"")))
Publicado em janeiro, 07 2016 - 3:28 PM
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
Publicado em outubro, 13 2016 - 1:16 PM
Bonjour,

J'arrive à la même erreur que vous. Avez trouvez une solution ?
Merci
Publicado em novembro, 24 2016 - 4:44 PM
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
Publicado em dezembro, 27 2016 - 10:00 AM
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.
Publicado em fevereiro, 03 2017 - 10:42 AM
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…
Membro registado
12 mensagems
Publicado em dezembro, 22 2017 - 11:01 AM
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)
Mensagem modificada, dezembro, 22 2017 - 11:03 AM
Publicado em janeiro, 12 2018 - 8:17 AM
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
Membro registado
12 mensagems
Publicado em fevereiro, 21 2018 - 10:49 AM
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
Mensagem modificada, fevereiro, 21 2018 - 10:51 AM
Membro registado
91 mensagems
Publicado em fevereiro, 21 2018 - 4:21 PM
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
Membro registado
12 mensagems
Publicado em fevereiro, 21 2018 - 5:10 PM
Ha oui tien, c'est une erreur de copier/coller dans le code "d'origine" pas de double, merci pour l'info :merci:
Publicado em junho, 01 2018 - 12:37 PM
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.
Publicado em junho, 01 2018 - 5:15 PM
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
Publicado em junho, 01 2018 - 5:17 PM
Membro registado
3 mensagems
Publicado em junho, 04 2018 - 7:33 PM
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.
Membro registado
43 mensagems
Publicado em outubro, 11 2019 - 4:50 PM
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
Membro registado
43 mensagems
Publicado em outubro, 11 2019 - 4:58 PM
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 ??
Membro registado
43 mensagems
Publicado em outubro, 11 2019 - 5:14 PM
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
Membro registado
204 mensagems
Publicado em novembro, 01 2019 - 3:24 AM
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



Membro registado
6 mensagems
Publicado em janeiro, 10 2020 - 7:24 PM
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
Membro registado
11 mensagems
Publicado em abril, 06 2020 - 1:19 PM
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
Membro registado
189 mensagems
Publicado em abril, 06 2020 - 2:17 PM
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…
Membro registado
11 mensagems
Publicado em abril, 07 2020 - 11:11 AM
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
Publicado em outubro, 24 2021 - 1:19 PM
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