PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Connexion API SMS OVH
Connexion API SMS OVH
Iniciado por patrick.bouquet, 04,ago. 2020 11:06 - 4 respuestas
Publicado el 04,agosto 2020 - 11:06
Bonjour,

Un utilisateur vient de m'indiquer que l'envoi de SMS avec les API OVH
ne fonstionnait plus.

Voici la procédure de connexion que j'utilise:

PROCÉDURE ConnexionAPI( sIdentifiantOVH est une chaîne, sMotDePasseOVH
est une chaîne, nDuration est un entier, sMethodes est une chaîne =
"GET, POST, PUT, DELETE", sPath est une chaîne = "/*" )

// Première requête d'ouverture de session
sURLRedirect est une chaîne =
"http://localhost/ident_ok_"+DonneGUID(guidBrut)
reqAuth est un httpRequête
reqAuth.Entête["X-Ovh-Application"]=:msCléPublique
reqAuth.Entête["Content-type"] = "application/json"
reqAuth.URL = "https://eu.api.ovh.com/1.0/auth/credential"
reqAuth.Méthode = httpPost
reqAuth.Contenu = ChaîneConstruit([
{
"accessRules": [
{ "method": "GET","path": "/*" },
{ "method": "POST","path": "/*" },
{ "method": "PUT","path": "/*" },
{ "method": "DELETE","path": "/*" } ],
"redirection":"%3"
}
],sMethodes,sPath,sURLRedirect)

// Requête pour obtenir la page de connexion
repAuth est un httpRéponse = HTTPEnvoie(reqAuth)

SI repAuth.CodeEtat<>200 ALORS
ErreurDéclenche(1,"Echec de la connexion à l'API. Erreur renvoyée :
"+repAuth.Contenu)
FIN

// Décode la réponse JSON
vRep est un Variant = JSONVersVariant(repAuth.Contenu)

// Mémorise la clé de session
:msCleUtilisateur = vRep.consumerKey

// Lecture de la page de connexion
sURLValidation est une chaîne = vRep.validationUrl
HTTPRequête(sURLValidation)
sPageConnexion est une chaîne = HTTPDonneRésultat(httpRésultat)

// Analyse pour trouver les id des champs du formulaire
sIDAccoundID est une chaîne
sIDPassword est une chaîne
sCredentialToken est une chaîne
sNonce est une chaîne

SI XMLDocument ( "connexionOVH" , sPageConnexion , xdHTML ) ALORS
SI XMLExécuteXPath ( "connexionOVH" ,
"//input[contains(@placeholder,'Account ID or email address')]" ) ALORS
sIDAccoundID = XMLDonnée ( "connexionOVH" , "name" )
FIN
SI XMLExécuteXPath ( "connexionOVH" ,
"//input[contains(@placeholder,'Password')]" ) ALORS
sIDPassword = XMLDonnée ( "connexionOVH" , "name" )
FIN
SI XMLExécuteXPath ( "connexionOVH" ,
"//input[@name='credentialToken']" ) ALORS
sCredentialToken = XMLDonnée ( "connexionOVH" , "value" )
FIN
SI XMLExécuteXPath("connexionOVH","//input[@name='nonce']") ALORS
sNonce = XMLDonnée("connexionOVH","value")
FIN
XMLTermine ( "connexionOVH" )
FIN

// Construction du formulaire réponse
reqIdent est un httpRequête
reqIdent.Méthode = httpPost
reqIdent.URL = sURLValidation
reqIdent.IgnoreErreur = httpIgnoreRedirection
reqIdent.Entête["Content-type"] = "application/x-www-form-urlencoded"
//reqIdent.Contenu =
ChaîneConstruit("credentialToken=%1&%2=%3&%4=%5&duration=%6",sCredentialToken,sIDAccoundID,sIdentifiantOVH,sIDPassword,URLEncode(:msPasswordOVH),nDuration,sNonce)
reqIdent.Contenu =
ChaîneConstruit("credentialToken=%1&%2=%3&%4=%5&duration=%6&nonce=%7&JsE=no",sCredentialToken,sIDAccoundID,sIdentifiantOVH,sIDPassword,URLEncode(sMotDePasseOVH),nDuration,sNonce)

// Requête pour obtenir la page de connexion
repIdent est un httpRéponse = HTTPEnvoie(reqIdent)
sLocation est une chaîne = repIdent.Entête["Location"]
SI repIdent.CodeEtat<>302 _OU_ sLocation<>sURLRedirect ALORS
ErreurDéclenche(2,"Echec de la connexion à l'API. Erreur renvoyée :
"+repIdent.Contenu)
FIN

CAS ERREUR:
ErreurPropage("Echec de la connexion à l'API. Erreur renvoyée :
"+ErreurInfo(errComplet))
RETOUR

CAS EXCEPTION:
ErreurDéclenche(3,"Echec de la connexion à l'API. Erreur renvoyée :
"+ExceptionInfo())
RETOUR


La fonction repAuth.CodeEtat retourne bien la valeur 200.
Mais la réponse est maintenant une demande de saisie de mot de passe au
format HTML ce qui conduit naturellement à une erreur lors de son
affectation à XMLDocument.

Je ne sais pas quoi faire pour résoudre ce problème.
J'espère que l'un d'entre-vous suara me fournit la solution miracle.
Je l'en remercie par avance.

Cordialement.

Patrick Bouquet
Miembro registrado
189 mensajes
Publicado el 05,agosto 2020 - 17:57
Bonjour Patrick,

Effectivement, je constate le même problème que toi.

Jean-Marc
Miembro registrado
189 mensajes
Publicado el 05,agosto 2020 - 18:43
Patrick,

Je n'ai pas encore compris pourquoi, mais lors de mes tests, ça passe, mais pas en prod.
La différence, c'est qu'en tests, je suis en procédural alors que j'utilise des classes en prod.
Je précise que bien sûr, tout fonctionnait nickel jusqu'à ce jour.
Voici le code de mon test qui fonctionne:
Procedure test()

sApplicationKey est une chaîne = gsApplicationKey
sApplicationSecret est une chaîne = gsApplicationSecret
sConsumerKey est une chaîne = gsConsumerKey
sServiceName est une chaîne = gsServiceName

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 = "Nom expéditeur" // https://docs.ovh.com/pages/releaseview.action?pageId=8650774
Ajoute(stSms_jobs.receivers ,"+33xxxxxxxxx")
stSms_jobs.message = "Test SMS OVH"
stSms_jobs.priority = "high"
stSms_jobs.senderForResponse = False
stSms_jobs.noStopClause = True

sUrl est une chaîne
sToSign est une chaîne
sSignature est une chaîne
sBody est une chaîne

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

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

sBody = VariantVersJSON(stSms_jobs)

pDateHeure est une DateHeure = Maintenant()
sHeuredate est une chaîne = Gauche(pDateHeure,14)
sHeuredateUTC est une chaîne = Gauche(DateHeureLocaleVersUTC(sHeuredate),14)
sTimeStamp est une chaîne = "19700101000000"
sDiffDateHeure est une chaîne = 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(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

Rep = HTTPEnvoie(Req)

SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
Info(Rep..Contenu)
FIN
Miembro registrado
189 mensajes
Publicado el 07,agosto 2020 - 09:26
Ce jour, tout fonctionne de nouveau, comme par magie...
Publicado el 08,agosto 2020 - 10:32
Jean-Marc a exprimé avec précision :
> Ce jour, tout fonctionne de nouveau, comme par magie...

Bonjour,

Chez moi pas de miracle !

J'attends une réponse d'OVH mais il ne faut pas être pressé.

Cordialement.

Patrick Bouquet