PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Utilisation WebServices Chorus
Utilisation WebServices Chorus
Started by MathDev, Oct., 19 2020 4:11 PM - 16 replies
Posted on October, 19 2020 - 4:11 PM
Bonjour à tous,
Je me casse les dents sur Chorus.
J'ai bien réussi à créer mon compte / application sur PISTE
J'ai bien réussi à créer mon compte sur Chorus pro.

J'arrive à générer un Token sur le webservice

Par contre je coince vraiment pour appeler un webservice comme dans l'exemple fourni sur le site de Chorus :
curl -k -H "content-type: application/json; charset=UTF-8" -H "Authorization:Bearer <access_token>" -H "cpro-account:<logintechnique:password encodée en base 64>" --data '{votre_body_json}' –X POST https://sandbox-api.aife.economie.gouv.fr/{votre_API}

J'ai "traduis" l'appel en curl par ce code :

http_REQ est une httpRequest
http_REP est une httpResponse

bufJson_SORTIE est un Buffer

sMsg_Err est une chaîne


JSON_RETOUR est un JSON
psToken_Url est une chaîne = "https://sandbox-api.aife.economie.gouv.fr/"+xxxxxxxxxxxx (mon APP)


http_REQ..Method = httpPost
http_REQ..URL = psToken_Url
http_REQ..AuthToken = ? --> Je n'arrive pas à alimenter ça
http_REQ..ContentType = "application/json"
http_REQ..Content = ChaîneVersUTF8("cpro-account:"+Glob_Base64_Tech)
http_REP = HTTPEnvoie(http_REQ)
SI ErreurDétectée ALORS
sMsg_Err = "Erreur de l'utilisation de l'API"+RC+RC+ErreurInfo(errMessage)
SINON
bufJson_SORTIE = http_REP..Contenu
JSON_RETOUR = ChaîneVersJSON(bufJson_SORTIE)
Jeton = JSON_RETOUR.access_token
FIN


J'arrive bien à générer un access token, mais je n'arrive pas à l'exploiter :
{"access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","token_type":"Bearer","expires_in":3600,"scope":"openid resource.READ"}

Idem le Data en json je ne vois pas trop quoi mettre... Si une bonne âme pouvait m'éguiller sur ce casse tête de Chorus...

D'avance... Merci :)
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on October, 20 2020 - 9:29 AM
bonjour,

Perso je procède ainsi, avec une requête REST , en ajoutant juste 'Authorization' dans l'entête, çà devrait être identique avec une HTTPRequete...

_rest_req_api..Méthode=httpPost
_rest_req_api..URL=_url
_rest_req_api..Entête["Authorization"]="Bearer "+_current_token
_rest_req_api..Entête["cpro-account"]=_auth_base64
_rest_req_api..ContentType="application/json"
_rest_req_api..Contenu=_data
_rest_reponse=RESTEnvoie(_rest_req_api)


bon dèv
Posted on October, 20 2020 - 10:17 AM
D'accord, merci beaucoup je vais partir comme ça.

Juste 2 petites question complémentaires (si ça te déranges pas :) ):
- Pourrais tu me montrer la tête de ton _url ?
- Idem pourrais tu me montrer à quoi ressemble le _data ?

D'avance, merci.
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on October, 20 2020 - 11:23 AM
rebonjour,

alors par exemple pour l'historique d'une facture :

URL :
https://api.aife.economie.gouv.fr/cpro/factures/v1/consulter/historique

Et le contenu c'est du JSON : ( XXXXXXXXXX est le numéro Chorus de la facture à consulter )
{ "idFacture": XXXXXXXXXX }

bon dèv
Posted on October, 20 2020 - 12:33 PM
Arf je crois que je vais devenir fou !
Je bloque vraiment sur chaque étape

Le retour du RestEnvoie me renvoie ça :

HTTP/1.1 401 Unauthorized
Date: Tue, 20 Oct 2020 10:30:20 GMT
Server:
Content-Length: 0
X-CorrelationID: Id-3cbc8e5fa68386bb2394f28e 0
WWW-Authenticate: Bearer realm="DefaultRealm",error="invalid_token",error_description="Unable to find the access token in persistent storage."
Keep-Alive: timeout=5, max=297
Connection: Keep-Alive
X-Xss-Protection: 1; mode=block
Content-Security-Policy: default-src 'self' data: java: java.com local-trust.com w3.org; connect-src *; font-src 'self' data: *; frame-src *; img-src 'self' data:; script-src 'self' 'unsafe-eval' 'unsafe-inline' *; style-src 'self' 'unsafe-inline' *
Referrer-Policy: no-referrer
X-Permitted-Cross-Domain-Policies: none
Expect-CT: max-age=86400, enforce, report-uri=https://example.com/ct-report


Je ne comprends pas car le jeton est bien généré (avec la validité et tout), mais malgré ça j'ai ce message désobligeant :)

En tout cas, merci beaucoup pour ton aide Christophe.

Cordialement,
Posted on October, 20 2020 - 1:36 PM
Rraaa je vais m'arracher les cheveux !
Quand j'utilise ta méthode, j'ai une erreur 401...

J'envoie ça (grâce à ta précieuse aide) :
_rest_req_api est un restRequête
_rest_reponse est un restRéponse
//_Url est une chaîne = "https://sandbox-api.aife.economie.gouv.fr/"+"APP_SANDBOX_mathieu.berthe@adci.fr"
_url est une chaîne = "https://api.aife.economie.gouv.fr/cpro/factures/v1/consulter/historique"
_data est un JSON = "{idfacture = QUAL_00000001682305}"

_rest_req_api..Méthode = httpPost
_rest_req_api..URL = _url
_rest_req_api..Entête["Authorization"] = "Bearer "+Jeton
_rest_req_api..Entête["cpro-account"] = Glob_Base64_Tech
_rest_req_api..ContentType = "application/json"
_rest_req_api..Contenu = _data
_rest_reponse = RESTEnvoie(_rest_req_api)



Voici le message (désobligeant :) de l'api :

HTTP/1.1 401 Unauthorized
Date: Tue, 20 Oct 2020 10:34:05 GMT
Server:
Content-Length: 0
X-CorrelationID: Id-1dbd8e5f81d7468b5b71fcbc 0
WWW-Authenticate: Bearer realm="DefaultRealm",error="invalid_token",error_description="Unable to find the access token in persistent storage."
Keep-Alive: timeout=5, max=289
Connection: Keep-Alive
X-Xss-Protection: 1; mode=block
Content-Security-Policy: default-src 'self' data: java: java.com local-trust.com w3.org; connect-src *; font-src 'self' data: *; frame-src *; img-src 'self' data:; script-src 'self' 'unsafe-eval' 'unsafe-inline' *; style-src 'self' 'unsafe-inline' *
Referrer-Policy: no-referrer
X-Permitted-Cross-Domain-Policies: none
Expect-CT: max-age=86400, enforce, report-uri=https://example.com/ct-report


Pourtant le jeton est bon car bien généré, la base 64 que je passe aussi... C'est un casse tête Chorus !

En tous les cas Christophe merci beaucoup pour ton aide :
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on October, 20 2020 - 2:16 PM
autant pour moi,

mais je vous ai donné l'URL de production

Pour la sandbox, la voici : ( il faut juste rajouter sandbox- devant l'URL )

https://sandbox-api.aife.economie.gouv.fr/cpro/factures/v1/consulter/historique
Posted on October, 20 2020 - 3:23 PM
Merci beaucoup pour ton aide.
J'arrive à récupérer les informations (à priori :) )
Tu es bien plus efficace que toute l'équipe de bras cassés qui sont censés t'aider sur la plateforme Chorus !
Posted on October, 20 2020 - 5:16 PM
Du coup j'ai une question subsidiaire, maintenant que j'arrive bien à envoyer une facture au format pdf, comment faire pour qu'elle soit "scannée" par chorus pour que le ttc, la date... soient alimentés automatiquement ? Quel webservice utiliser une fois que la facture est uploadée ?
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on October, 20 2020 - 6:01 PM
une fois votre PDF déposé, il faut utiliser soumettreFacture
URL :
https://api.aife.economie.gouv.fr/cpro/factures/v1/soumettre
https://sandbox-api.aife.economie.gouv.fr/cpro/factures/v1/soumettre

pour que vous complétiez les éléments requis pour votre facture.

Voir ce post qui contiendra pas mal d'infos, il peu y avoir des pièges :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/241155-chorus-besoin-aide-241176/read.awp…

bon dèv.
Posted on October, 20 2020 - 6:02 PM
Merci infiniment
Je vais ériger une statue en ton honneur :)
Posted on October, 21 2020 - 1:54 PM
Bonjour (Christophe? :) )

Hier je pouvais voir ma facture dans Chorus, et là quand je refais un test, plus rien ne se passe...

Auriez vous une idée?

De plus, l'envoi de la facture me retourne les informations (montant, date...)

_rest_req_api est un restRequête
_rest_reponse est un restRéponse

_url est une chaîne = "https://sandbox-api.aife.economie.gouv.fr/cpro/factures/v1/deposer/pdf"


sFichier est une chaîne

// Ouvre le sélecteur de fichiers
sFichier = fSélecteur("", "", "Sélectionnez un fichier...", "PDF" + TAB + "*.pdf", "*.pdf")



ParamEntree est un JSON
ParamEntree.nomFichier = fExtraitChemin(sFichier, fFichier + fExtension)
ParamEntree.fichierFacture = Encode(fChargeBuffer(sFichier),encodeBASE64SansRC)
ParamEntree.formatDepot = "PDF_NON_SIGNE"


_rest_req_api..Méthode = httpPost
_rest_req_api..URL = _url
_rest_req_api..Entête["Authorization"] = "Bearer "+Jeton
_rest_req_api..Entête["cpro-account"] = Glob_Base64_Tech
_rest_req_api..ContentType = "application/json"
_rest_req_api..Contenu = VariantVersJSON(ParamEntree)
_rest_reponse = RESTEnvoie(_rest_req_api)

Info(_rest_reponse..Contenu)


Et le retour de _rest_rponse :

{<10> "codeRetour" : 0,<10> "libelle" : "GCU_MSG_01_000",<10> "numeroFacture" : "FC2005001",<10> "dateFacture" : "2020-04-30",<10> "codeFournisseur" : "44854198700013",<10> "codeDeviseFacture" : "EUR",<10> "typeFacture" : "FACTURE",<10> "typeTva" : "TVA_SUR_ENCAISSEMENT",<10> "montantAPayer" : 1.89,<10> "montantHtTotal" : 158.16,<10> "montantTVA" : 31.63,<10> "pieceJointeId" : 8311928<10>}

Je pense qu'il manque des informations dans l'envoi, mais je ne vois pas quoi, surtout qu'il n'y a pas d'erreurs dans le retour...

Merci pour vos réponses.
Posted on October, 21 2020 - 5:47 PM
Christophe a écrit :
une fois votre PDF déposé, il faut utiliser soumettreFacture
URL :
https://api.aife.economie.gouv.fr/cpro/factures/v1/soumettre
https://sandbox-api.aife.economie.gouv.fr/cpro/factures/v1/soumettre

pour que vous complétiez les éléments requis pour votre facture.

Voir ce post qui contiendra pas mal d'infos, il peu y avoir des pièges :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/241155-chorus-besoin-aide-241176/read.awp…

bon dèv.




Merci Christophe, j'ai un petit soucis dans mon soumettreFacture.

Le webservice semble fonctionner, cependant j'ai ça comme retour.

Vous auriez une idée?

Je pense que c'est l'idfournisseur qui n'est pas bon, mais je ne sais pas trop quoi mettre...

D'avance, merci,




Registered member
834 messages
Popularité : +13 (13 votes)
Posted on November, 09 2020 - 6:21 AM
Bonjour,
J'ai vue vos échanges sur chorus et c'est moi qui me casse les dents maintenant !

J'ai bien réussi à créer mon compte / application sur PISTE
J'ai bien réussi à créer mon compte sur Chorus pro.

Il faut se raccorder sur une structure, et la je coince !

Créer un raccordement Oauth2 sur l’environnement de qualification Chorus Pro, pour plus d’informations, vous pourrez vous référer à la page suivante : https://communaute.chorus-pro.gouv.fr/documentation/aides-aux-developpeurs-api-en-mode-oauth2

Doc : comprends pas

--
Synchronize Systems International LTD
Développement d'outils de gestion

Environnements AS400 – Windows
Langages GAP III – CL – Visual Basic - Visual Adélia - Adélia - Windev

Bangkok / Pattaya
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on November, 09 2020 - 9:13 AM
bonjour Jean-Michel,

normalement ce n'est pas très compliqué, mais il faut dans un premier temps ajouter les menus pour effectuer le raccordement.
De mémoire je crois que par défaut il n'y a pas les espaces 'EDI API'.

si vous n'avez pas ce menu sur votre compte de qualif :





il faudra se rendre dans le menu 'Activité du gestionnaire'
Modifier votre structure.
( le petit crayon )
vous aurez liste des espaces de votre structure, et cochez raccordement EDI API en modification.

Une fois validé, il vous faudra peu être vous reconnecter , vous devriez avoir le menu raccordement EDI API.
Cliquez dessus et en haut à droite, vous aurez gérer raccordement API.
Puis dessous, déclarer un raccordement PISTE.

Bon dèv ;)
Registered member
2 messages
Posted on April, 12 2021 - 9:36 AM
Bonjour, personnellement le serveur me renvoie une erreur 500, auriez vous une idée d'où cela puisse venir ?
Registered member
939 messages
Popularité : +66 (68 votes)
Posted on April, 12 2021 - 12:47 PM
Antonin Morez a écrit :
> Bonjour, personnellement le serveur me renvoie une erreur 500, auriez vous une idée d'où cela puisse venir ?

bonjour Antonin,

normalement les erreurs 500 indique des soucis côté serveur.
Essayez de refaire un test dans l'après midi, ou bien demain, la plateforme Chorus a peu être des soucis.

Ou bien, la donnée que vous envoyez ne lui plait pas du tout