PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → WebService fonction suivi zoom de Geodis
WebService fonction suivi zoom de Geodis
Débuté par serge-maury, 12 déc. 2019 08:38 - 9 réponses
Posté le 12 décembre 2019 - 08:38
Bonjour,
Je souhaite utiliser le webservice Geodis.
Le webservice permet de récupérer un lien pour accéder à la page sur l'espace client de Geodis.
Geodis fournit un document explicatif pas très clair et aussi des exemples en php et java.
J'ai donc tenté de copier l'exemple java fournit et j'ai donc écrit ce code :

sBon est une chaine //numéro de bon a rechercher
sRequete est une chaine //Requête json
sMessage est une chaine //Message à envoyer dans un entête X-GEODIS-Service
Buffer est un buffer //Buffer utiliser la génération du hash sha256
sChaineHashe est une chaine //Chaine contenant le hash
sHeader est une chaine //Header à envoyer dans un entête X-GEODIS-Service
sTimeStamp est une chaine //Timestamp courant en ms

sTimeStamp=sDateHeureVersTimeStamp() //La fonction retourne le TimeStampCourant Exemple : "1576135925000"
sBon="58952366"
sRequete="{""refUniExp"":"""",""noSuivi"":"""+sBon+"""}"
sMessage=gsCleAPIGEODIS+";"+gsIDGEODIS+";"+sTimeStamp+";fr;api/zoomclient/recherche-envoi;"+sRequete
Buffer=HashChaîne(HA_SHA_256,sMessage)

//La valeur contenu dans le Buffer comporte des valeurs hexadécimales en majuscule séparées par des espaces et un RC
//Pour correspondre à la syntaxe de mon exemple j'ai éliminé ces caractères indésirables
sChaineHashe=Minuscule(Remplace(Remplace(BufferVersHexa(Buffer)," ",""),RC,""))
sHeader=gsIDGEODIS+";"+sTimeStamp+";fr;"+sChaineHashe

MaRequeteRest.URL="https://espace-client.geodis.com/services/api/zoomclient/recherche-envoi"
MaRequeteRest.Méthode=httpPost
MaRequeteRest.Entête["Content-Type"]="application/json"
MaRequeteRest.Entête["Accept"]="*/*"
MaRequeteRest.Entête["X-GEODIS-Service"]=sHeader
LaReponseRest=RESTEnvoie(MaRequeteRest)
SI ErreurDétectée() ALORS
HErreurInfo(hErrComplet)
SINON
Info(LaReponseRest.Contenu)
FIN

Je n'obtient pas de valeur dans LaReponseRest.Contenu, mais LaReponseRest.CodeEtat retourne "Bad Request."
J'en déduit que mon Header est mal construit.

Est ce que quelqu'un à déjà utilisé ce webservice et peut m'aiguiller ?
Merci d'avance.
Membre enregistré
1 330 messages
Posté le 12 décembre 2019 - 10:09
Salut Serge,

C'est bien du service https://geodis.com/sites/default/files/2019-06/GEODIS_Service%20Zoom_VD-fr.pdf que l'on parle ?
Vu que c'est du JSON, j'utiliserais plutôt JSONExecute()

Regarde ici : https://doc.pcsoft.fr/fr-FR/?1000017284

Mais si tu pouvais envoyer le lien du Guide Technique qui est présenté en page 13 du pdf nommé ci-dessus, ce serait plus simple pour t'aider car là perso je ne connais pas Geodis et tu as très peu d'élément dans ton message pour qu'on t'aide. :(

Sinon j'ai vu qu'il y avait apparemment moyen de le faire directement avec une URL

Regarde le pdf https://geodis.com/sites/default/files/2018-09/Fonction%20ZOOM_Guide%20Client_GEODIS_ModeSecure_FR_vd.pdf

Bon Dev
Daryl

--
http://www.concept4u2.com
Posté le 12 décembre 2019 - 12:04
Salut Daryl,

merci pour tes efforts.
Oui c'est bien le service que tu mentionnes. Mais le guide technique est un autre de document de 29 pages
que tu peux trouver ici :
https://we.tl/t-LtBsOuSB1k

Je n'ai pas essayé d'utiliser la fonction jsonexecute car ce web service fonctionne uniquement en méthode post, on ne peut donc pas passer les arguments dans l'adresse url qui est la méthode get.

Ce que tu as vu concernant un lien avec url, c'est l'ancien service qui sera abandonné le 15 décembre.
C'est pourquoi nous nous réveillons maintenant avec Jean. ;-)

Pour le moment je vais mettre en place un httprequete sur une page php pour récupérer les informations dont j'ai besoin.
Puisqu'en php, cela fonctionne correctement.
Mais j'aimerais bien me passer d'un serveur php pour utiliser ce webservice.

Voici l'exemple php ainsi qu'un exemple java :
https://we.tl/t-w7vKSWD6cs
Membre enregistré
1 330 messages
Posté le 12 décembre 2019 - 14:20
Salut Serge,

Ok, j'ai tout téléchargé, laisse moi le temps de regarder tout ça et je reviens vers toi

Cordialement
Daryl
Posté le 12 décembre 2019 - 15:17
Merci et bon courage !!!
Posté le 12 décembre 2019 - 15:40
Bon voilà grâce à Jean j'ai trouvé le dernier problème qui me bloquait :

Un code qui fonctionne est :

sBon=ExtraitChaîne(sLien,2,CST_CodeZoomGeodis)
SI EstNumérique(sBon) ALORS
sBon=NumériqueVersChaîne(Val(sBon),"08d")
SINON
Erreur("Erreur de format pour le numéro de récépissé !")
RETOUR
FIN
sURL="https://espace-client.france-express.com/services/api/zoomclient/recherche-envois"
sRequete="""dateDepart"":"""",""dateDepartDebut"":"""",""dateDepartFin"":"""",""noRecepisse"":"""+sBon+""",""reference1"":"""",""cabColis"":"""",""noSuivi"":"""",""codeSa"":"""",""codeClient"":"""",""codeProduit"":"""",""typePrestation"":"""",""dateLivraison"":"""",""refDest"":"""",""nomDest"":"""",""codePostalDest"":"""",""natureMarchandise"":""""}"
sMessage=gsCleAPIGEODIS+";"+gsIDGEODIS+";"+sTimeStamp+";fr;api/zoomclient/recherche-envois;"+sRequete
sContentType="application/json; charset=utf-8"
Buffer=HashChaîne(HA_SHA_256,sMessage)
sChaineHashe=Minuscule(Remplace(Remplace(BufferVersHexa(Buffer)," ",""),RC,""))
sHeader=gsIDGEODIS+";"+sTimeStamp+";fr;"+sChaineHashe
MaRequeteRest.URL=sURL
MaRequeteRest.Méthode=httpPost
MaRequeteRest.Entête["X-GEODIS-Service"]=sHeader
MaRequeteRest.ContentType=sContentType
MaRequeteRest.Contenu=sRequete
LaReponseRest=RESTEnvoie(MaRequeteRest)
SI ErreurDétectée() ALORS
Info(HErreurInfo(hErrComplet))
SINON
Info(LaReponseRest.Contenu)
FIN


Il faut bien veiller à doubler les quotes pour toutes les rubriques et toutes les variables dans la requête.
Il faut aussi envoyer la requête (sans utiliser le hash) dans la variable Contenu de la requête, même si celle-ci est déjà envoyée en entête.


Sinon vous pouvez aller voir le code de jean qui est bien plus propre et bien commenté :


https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/235366-utiliser-service-zoom-geodis-france-express-235395/read.awp…
Posté le 12 décembre 2019 - 16:05
Membre enregistré
1 330 messages
Posté le 12 décembre 2019 - 16:08
Salut Serge,

N'ayant aucune possibilité de tester ce code, pourrais-tu le tester en indiquant les bonnes informations ?
Mais si jamais tu as des données pour tester, je suis preneur :)

Pour info, je me suis basé sur l'exemple en PHP.

// Declaration
sLang est une chaîne = "fr"
sLogin est une chaîne = "AFCA" // A remplacer avec l'identifiant de connexion au compte client Geodis
sSecretKey est une chaîne = "47e052d33541412fb951bb3e74394d61" // A remplacer par la clé API reçue
sService est une chaîne = "api/zoomclient/recherche-envois"
sUri est une chaîne = "https://espace-client.geodis.com/services/"
vrBody est un Variant
jsBodyInLine est un JSON
sBon est une chaîne = "12345678"
sTimestamp est une chaîne = HeureSys()
sMessage est une chaîne
sHash est une chaîne
sServiceRequestHeader est une chaîne
sSizeRequest est une chaîne
GeodisRequest est une restRequête
GeodisResponse est une restRéponse

// Creation des valeurs JSON
vrBody.dateDepart = "" // Optionel: Recherche sur une date de départ Format: aaaa-mm-jj (La date la plus ancienne ne peut pas dépassée J – 1 an)
vrBody.dateDepartDebut = "" // Optionel: Début recherche sur une plage de date Format: aaaa-mm-jj
vrBody.dateDepartFin = "" // Optionel: Fin recherche sur une plage de date Format: aaaa-mm-jj
vrBody.noRecepisse = sBon // Optionel: Numéro de récipissé Format: 8 numériques
vrBody.reference1 = "" // Optionel: Référence 1 Format: 70 alphanumériques
vrBody.noSuivi = "" // Optionel: Numéro de suivi unique Format: 10 alphanumériques
vrBody.cabColis = "" // Optionel: Code à barre colis Format: 35 alphanumériques
vrBody.codeSa = "" // Optionel: Code agence départ Format: 6 numériques (A compléter avec des 0 devant, pour atteindre 6 numériques)
vrBody.codeClient = "" // Optionel: Code client Format: 6 numériques (A compléter avec des 0 devant, pour atteindre 6 numériques)
vrBody.codeProduit = "" // Optionel: Code produit Format: 3 alphanumériques
vrBody.typePrestation = "" // Optionel: Type de prestation Format: 3 alphanumériques (Uniquement MES ou EXP)
vrBody.dateLivraison = "" // Optionel: Date de livraison (prévisionnelle ou impérative) Format: aaaa-mm-jj
vrBody.refDest = "" // Optionel: Référence destinataire (code destinataire) Format: 6 alphanumériques
vrBody.nomDest = "" // Optionel: Nom du destinataire Format: 70 alphanumériques
vrBody.codePostalDest = "" // Optionel: Code postal destinataire Format: 9 alphanumériques
vrBody.natureMarchandise = "" // Optionel: Nature de marchandise Format: 52 alphanumériques

jsBodyInLine = VariantVersJSON(vrBody, psdMiseEnForme)

// Création du hash
sMessage = ChaîneConstruit("%1;%2;%3;%4;%5;%6", sSecretKey, sLogin, sTimestamp, sLang, sService, jsBodyInLine)
sHash = Remplace(BufferVersHexa(HashChaîne(HA_SHA_256, sMessage)), " ", "")

// Création du Header
sServiceRequestHeader = ChaîneConstruit("%1;%2;%3;%4", sLogin, sTimestamp, sLang, sHash)
sSizeRequest = SansEspace(NumériqueVersChaîne(Taille(sServiceRequestHeader), "15d"))

// Execute la requete
GeodisRequest.URL = ChaîneConstruit("%1%2", sUri, sService)
GeodisRequest.Méthode = httpPost
GeodisRequest.Entête["X-GEODIS-Service"] = sServiceRequestHeader
GeodisRequest.Entête["Content-Type"] = "application/json; charset=utf-8"
GeodisRequest.Entête["Content-Length"] = sSizeRequest

GeodisResponse = RESTEnvoie(GeodisRequest)
SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
FIN


Cordialement
Daryl
Posté le 12 décembre 2019 - 17:31
Merci pour ton aide Daryl,

Mais j'ai publié un code fonctionnel plus haut.
Et jean a mis un lien vers son post avec un autre code fonctionnel.

Ton code aurait du marcher chez toi car tu avais mes identifiants et donc accès à mes données.
J'ai par contre changer de code depuis ;-)

Cordialement
Serge MAURY
Posté le 08 janvier 2020 - 11:29
Hello,

Sorry , that I cannot answer you in French, I hope my english is clear.
I'm also looking for a solution to call the zoom function in java.
Can you give me a working example in Java?

Kind Regards
Cordialement

Patrick Tans