PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Chorus
Chorus
Iniciado por Stéphane D., 23,ago. 2018 15:34 - 20 respuestas
Miembro registrado
230 mensajes
Publicado el 23,agosto 2018 - 15:34
Bonjour à tous,
Je recherche de l'aide pour utilise les API de Chronus.
J'explique ma demande :
Je voudrais envoyer une facture, et voici leur documentation :
https://communaute.chorus-pro.gouv.fr/deposer-flux-facture/

Comment faire pour utiliser : https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux
sachant qu'il faut passer les valeur qui suit : utilisateur, mdp, certificat et facture.

Merci d'avance de votre aide.

--
Stéphane.
Miembro registrado
2.682 mensajes
Publicado el 23,agosto 2018 - 16:26
Bonjour,

Il faut utiliser httpRequête

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
230 mensajes
Publicado el 24,agosto 2018 - 11:27
Bonjour Philippe,
Merci pour cette réponse, et j'ai bien utilisé cela mais où j'appelle mon certificat.
sUrl est une chaîne

SI EnModeTest() = Vrai ALORS
sUrl = URLEncode("https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux")
SINON
sUrl = URLEncode("https://chorus-pro.gouv.fr:5443/service/factures/deposer/flux")
FIN


ErreurHTTP est une chaîne
sNomUser est une chaîne = "login"
sPwdUser est une chaîne = "mdp"
sXMLRetour est une chaîne

SI httpRequête(sUrl,"","","","",sNomUser,sPwdUser) ALORS
sXMLRetour = HTTPDonneRésultat(httpRésultat)
SINON
ErreurHTTP = HTTPDonneRésultat(httpEntête)
Erreur(ErreurHTTP)
FIN

Merci d'avance.

--
Stéphane.
Publicado el 12,septiembre 2018 - 09:11
Bonjour Stéphane,

J'ai mis une réponse que j'espère complète dans la discussion https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/200909-chorus-portail-pro-2017-applications-220404/read.awp…

Pour répondre précisément à la question
//
// Charger le certificat
//
ListeCertifest une chaîne=HTTPListeCertificat()
Certifest une chaîne=ExtraitChaîne(ExtraitChaîne(ListeCertif,1,RC),3,TAB)
HTTPCertificat(Certif)


Je suppose ici qu'il n'y a qu'un seul certificat installé, sinon, il rechercher le bon avec dans la première "colonne" de ListeCertifest

Bon courage.
Miembro registrado
230 mensajes
Publicado el 20,septiembre 2018 - 12:07
Salut Zagvier,
Merci pour cette réponse, j'attends mon certificat pour commencer à faire des tests car sans on ne peux rien faire...

--
Stéphane.
Miembro registrado
87 mensajes
Publicado el 21,noviembre 2018 - 12:31
Zagvier a écrit :
Bonjour Stéphane,

J'ai mis une réponse que j'espère complète dans la discussionhttps://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/200909-chorus-portail-pro-2017-applications-220404/read.awp…

Pour répondre précisément à la question
//
// Charger le certificat
//
ListeCertifestune chaîne=HTTPListeCertificat()
Certifestune chaîne=ExtraitChaîne(ExtraitChaîne(ListeCertif,1,RC),3,TAB)
HTTPCertificat(Certif)


Je suppose ici qu'il n'y a qu'un seul certificat installé, sinon, il rechercher le bon avec dans la première "colonne" de ListeCertifest

Bon courage.




Bonjour Zagvier,
Merci pour ces informations précieuses
.
Auriez-vous par hasard des exemples à nous fournir pour un flux d'émission et un flux de réception?

Exemples:
- Utilisant le service API "Factures simples --> Factures à émettre --> Déposer flux facture"
- Utilisant le service API "Factures simples --> Récupérer information facture --> Consulter historique facture"

Existe-t-il un moyen de tester que l'API est bien accessible avant d'envoyer une commande quelconque?
- Doit-on juste initier la connexion au démarrage de notre application?
- Doit-on le faire avant d'envoyer chaque commande?

Merci.

--

NR
Miembro registrado
953 mensajes
Publicado el 21,noviembre 2018 - 13:47
Bonjour,

Nicolas ROBIN a écrit :
Existe-t-il un moyen de tester que l'API est bien accessible avant d'envoyer une commande quelconque?
- Doit-on juste initier la connexion au démarrage de notre application?
- Doit-on le faire avant d'envoyer chaque commande?


Non, c'est un système de requête, donc à chaque requête, si la plateforme Chorus n'est pas disponible vous aurez un retour d'erreur sur votre HTTPRequete()



Nicolas ROBIN a écrit :
Auriez-vous par hasard des exemples à nous fournir pour un flux d'émission et un flux de réception?

Exemples:
- Utilisant le service API "Factures simples --> Factures à émettre --> Déposer flux facture"
- Utilisant le service API "Factures simples --> Récupérer information facture --> Consulter historique facture"


Dépôt d'un Flux, pour déposer plusieurs factures d'un coup, il faut compresser vos fichiers et envoyer le fichier compressé à la place.
Une fois votre flux déposé, il vous faudra aller consulter son 'Statut' , soit Rejeté, Intégré partiellement , Intégré ou en attente de traitement.
( en allant consulter le CR Détaillé d'un flux , il faudra analyser le contenu des erreurs dans le cas d'un rejet ou d'une intégration partielle )

Voici un mini bout de code pour le dépôt d'un Flux de Facture :
// Identifiant de votre compte Technique Chorus-Pro
_url_login est une chaîne="TECH_000000000000000@cpp2017.fr"
_url_password est une chaîne="motdepasse"

_auth_base64 est une chaîne=Remplace(Crypte(_url_login+":"+_url_password,"",compresseAucun+crypteAucun,encodeBASE64),RC,"")
_http_header_auth est une chaîne=ChaîneVersUTF8("Authorization: Basic "+_auth_base64)
_http_exec est un booléen
_lst_Certif est une chaîne=HTTPListeCertificat()
_certificat_utilise est une chaîne=ExtraitChaîne(ExtraitChaîne(_lst_Certif,1,RC),3,TAB)
_type_data est une chaîne="application/json"

// URL Chorus-Qualifaction pour le dépot de flux
_url_Chorus est une chaîne="https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux"" "

HTTPCertificat(_certificat_utilise)

_variant_emission est un Variant
_variant_reception est un Variant
_json_data est une chaîne


_variant_emission.syntaxeFlux="IN_DP_E1_UBL_INVOICE" // Type de fichier déposé
_variant_emission.nomFichier="MONFICHIER.XML" // Nom du fichier déposé , dans le cas d'un lot de facture il s'agira d'un fichier .tar.gz
_variant_emission.fichierFlux=ChaîneVersUTF8(Remplace(Crypte(fChargeBuffer(SysRep(srBureau)+["\"]+"MONFICHIER.XML"),"",compresseAucun+crypteAucun,encodeBASE64),RC,""))
_variant_emission.avecSignature=Faux

_json_data=VariantVersJSON(_variant_emission)

_http_exec=HTTPRequête(_url_Chorus,"",_http_header_auth,_json_data,_type_data)
SI _http_exec=Faux ALORS
Erreur(ErreurInfo(errComplet))
SINON
// Exécution Ok
_variant_reception=JSONVersVariant(HTTPDonneRésultat())
SI _variant_reception.codeRetour=0 ALORS
// Dépôt de flux OK
Info("Ok numéro de dépôt de Flux Chorus : "+_variant_reception.numeroFluxDepot)
SINON
Erreur("Erreur de code : "+_variant_reception.codeRetour)
FIN
FIN


Pour consulter l'historique d'une facture, il vous faudra son Identifiant Chorus.
C'est le même principe que le bout de code ci-dessus, en modifiant simplement votre JSON comme indiqué sur la documentation Chorus :
=> https://communaute.chorus-pro.gouv.fr/consulter-historique-facture/

Bon dèv
Miembro registrado
953 mensajes
Publicado el 21,noviembre 2018 - 13:51
Miembro registrado
87 mensajes
Publicado el 21,noviembre 2018 - 15:24
Merci Christophe pour ces informations très claires.

Nous avons commandé notre certificat ce jour.
Je testerai cela dès que possible.
En attendant, je vais poursuivre l'avancée de mon développement à partir des spécifications externes API.

Savez-vous s'il existe un moyen en Windev de s'assurer que le port nécessaire au service API (5443) est ouvert et si le proxy laisse passer l'url Chorus?
J'ai vu des informations au sujet de SocketConnecte.
J'ai voulu faire le test suivant mais sans résultat probant:
Le test a été effectué avec l'URL "https://chorus-pro.gouv.fr", aussi en y ajoutant "/service", ou "/service-qualif" et même le chemin complet d'un service.

FONCTION PRIVÉ PRIVE__PortOuvert()
resultat est un booléen

sUrl_Hote est une chaîne
nPort est un entier

//--TEST--
sUrl_Hote ="https://chorus-pro.gouv.fr"
nPort =5443

//Pour tester le port CHORUS et voir si il est ouvert.
SI SocketConnecte("Serveur",nPort,sUrl_Hote) ALORS // Là c'est bon..
Trace("Port "+nPort+" ouvert")
SocketFerme("Serveur")
resultat=Vrai

SINON // Connexion de socket ne marche pas
resultat=Faux
Erreur("Erreur de connexion","",ErreurInfo(errMessage))
FIN

//On retourne VRAI si l'on a trouvé un certificat Valide
RENVOYER resultat


L'erreur suivante en découle:
La socket n'a pas pu être initialisée correctement.
La connexion au serveur  sur le port <5443> a échoué.
Détail de l'erreur système : Hôte inconnu.


A savoir que pour l'instant, ces essais ont été réalisés sans certificat.
J'ai tenté malgré tout puisque je n'utilisais pas encore les requêtes au service.

Merci

--

NR
Miembro registrado
87 mensajes
Publicado el 21,noviembre 2018 - 15:27
Christophe a écrit :


Oui, ce PDF associé à la doc en ligne pour chaque service sont très complémentaires et indispensables pour le développement de l'interface Chorus service API. Je les consulte au quotidien.

Merci.

--

NR
Miembro registrado
87 mensajes
Publicado el 21,noviembre 2018 - 16:15
Bonjour,

Pour information, cela pourra vous intéresser.
La procédure suivante me permet de m'assurer que l'hôte Chorus Pro est accessible pour le port donné:

FONCTION PortOuvert()
resultat est un booléen

sUrl_Hote est une chaîne
sUrl_Hote_Courte est une chaîne
sIP_Hote est une chaîne
nPort est un entier

//--TEST--
sUrl_Hote ="https://chorus-pro.gouv.fr"
sUrl_Hote_Courte =Remplace(sUrl_Hote,"https://","")
sIP_Hote =NetAdresseIP(sUrl_Hote_Courte)
nPort =:m_nPort

resultat=Faux

//Pour tester le port CHORUS et voir si il est ouvert pour accéder à l'hôte chorus.
SI SocketConnecte("Serveur",nPort,sIP_Hote) ALORS
resultat=Vrai
FIN

SI resultat ALORS
Trace("Port "+nPort+" ouvert")
SocketFerme("Serveur")
SINON
// Connexion de socket ne marche pas
Erreur("Erreur de connexion","",ErreurInfo(errMessage))
FIN

//On retourne VRAI si l'on a trouvé un certificat Valide
RENVOYER resultat


--

NR
Miembro registrado
1.640 mensajes
Publicado el 22,noviembre 2018 - 10:00
Bonjour,

Apparemment la version 24 intégrera l’interconnexion avec Chorus pro
Miembro registrado
87 mensajes
Publicado el 28,noviembre 2018 - 15:06
Bonjour Christophe,

Dans votre exemple, vous transmettez donc un fichier "MONFICHIER.XML".

Pour mes essais, j'ai voulu commencer par utiliser un des fichiers exemples fournis par la communauté (https://communaute.chorus-pro.gouv.fr/documentation/exemples-de-flux/): fichier "FSO1100-P24.xml" ("IN_DP_E1_UBL_INVOICE").

Utilisez-vous la sérialisation/désérialisation pour vos fichiers XML?
De quelle manière vous y êtes vous pris?
Vous avez importé un modèle XML qui vous sert à déclarer un xmlDocument en indiquant votre modèle pour Description?

Je suppose que la plateforme CHORUS attend de recevoir ses XML avec les éléments en "[préfixe]:" ("cac:", "cbc:", etc.) pour s'assurer du bon format du XML reçu.


Avez-vous éventuellement un exemple d'affectation de vos données de factures pour génération du XML?

Merci

--

NR
Miembro registrado
953 mensajes
Publicado el 28,noviembre 2018 - 15:54
bonjour Nicolas,

Nicolas ROBIN a écrit :
Bonjour Christophe,

Dans votre exemple, vous transmettez donc un fichier "MONFICHIER.XML".

Pour mes essais, j'ai voulu commencer par utiliser un des fichiers exemples fournis par la communauté (https://communaute.chorus-pro.gouv.fr/documentation/exemples-de-flux/): fichier "FSO1100-P24.xml" ("IN_DP_E1_UBL_INVOICE").

Utilisez-vous la sérialisation/désérialisation pour vos fichiers XML?


=> NON

Nicolas ROBIN a écrit :
> De quelle manière vous y êtes vous pris?

=> J'ai simplement développé un petit export XML UBL de nos factures, à minima avec les exemples Chorus.

Nicolas ROBIN a écrit :
Vous avez importé un modèle XML qui vous sert à déclarer un xmlDocument en indiquant votre modèle pour Description?


=> Non, l'import du XSD UBL ne fonctionne pas actuellement sous Windev, il se plante après un certain temps...

Nicolas ROBIN a écrit :
Je suppose que la plateforme CHORUS attend de recevoir ses XML avec les éléments en "[préfixe]:" ("cac:", "cbc:", etc.) pour s'assurer du bon format du XML reçu.


Avez-vous éventuellement un exemple d'affectation de vos données de factures pour génération du XML?


il y a un post avec quelques petits exemples de génération XML UBL ici :
=> https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/222153-chorus/read.awp…


bon dèv ;)
Mensaje modificado, 28,noviembre 2018 - 15:55
Miembro registrado
87 mensajes
Publicado el 14,diciembre 2018 - 10:42
Bonjour,
Lors du premier appel de HTTPRequête(...) depuis le lancement de notre EXE, une confirmation du certificat est demandée.

Sécurité Windows

Confirmer le certificat

Le site chorus-pro.gouv.fr a besoin de vos informations d'identification:
...
OK / Annuler

Connaissez-vous une manière d'automatiser la réponse OK?

Même si ce n'est qu'une fois, j'ai un peu peur que l'utilisateur ne fasse pas attention, ne confirme pas le certificat (clic sur la croix, ou Annuler) où que la fenêtre soit affichée derrière et qu'il pense à tort à un dysfonctionnement de notre application.

Pour information, dans "Internet Explorer" > "Options Internet" > "Avancé", les options "Vérifier la révocation des certificats de l'éditeur" et "Vérifier la révocation du certificat serveur*" sont bien décochées.

Merci
Cordialement,

--

NR
Miembro registrado
87 mensajes
Publicado el 20,diciembre 2018 - 14:48
Bonjour,

Lorsque que l'on fait un "Dépôt Flux Facture" xml ou tar.gz, on a un retour de l'état du flux (rejeté, intégré, etc.) avec "Consulter CR détaillé".

Par contre, qu'il soit rejeté ou intégré, peut-on retrouver dans le portail CHORUS ou via un service API, les informations de chaque facture contenue dans le flux?

Les services qui auraient pu m'intéresser demande un idFacture technique CPP (entier) mais pour un flux, j'arrive à en récupérer le numéroDépotFlux mais pas l'idFacture de chaque facture du flux. Sur le portail, on ne retrouve pas non plus les factures de notre flux dans factures émises?
On a aucun moyen de retrouver les factures provenant d'un flux dans Chorus?

Merci.
Cordialement,

--

NR
Publicado el 14,noviembre 2019 - 15:01
Bonjour Nicolas,

Avez-vous trouvé un moyen de récupérer la facture à partir d'un flux envoyé?

Merci!
Cordialement,
Miembro registrado
87 mensajes
Publicado el 14,noviembre 2019 - 16:32
Bonjour,

Pour ma part, je combine en utilisant les 2 API suivantes:

Consulter_CR_detaille (en passant le n° de flux en entrée)


Via le n° de flux, on peut retrouver un flux envoyé (qui serait présent dans la rubrique "Suivi des flux" du portail CHORUS)

Si je me souviens bien des problèmes rencontrés lors du développement, il ne permettait pas de retourner les factures du flux qui ont été intégrées mais par élimination, on pouvait les déterminer vu qu'il nous retourne celles qui ne l'ont pas été. Le tout est de mémoriser lors de l'envoi du flux, la liste des numéros de factures qu'il contenait lors de l'envoi.





Rechercher_facture_par_fournisseur (en passant le n° de facture en entrée)


Via le n° de facture, on peut retrouver une facture intégrée (qui serait présente dans la rubrique "Facture émise" du portail CHORUS)
Par contre, si elle a été transmise via un flux, le retour ne renvoie pas ce numéro de flux.
La seule façon que j'avais trouvée à l'époque était de combiner avec ce que j'ai évoqué au-dessus via "Consulter_CR_detaille" en déduisant la liste des facture non rejetées...

--

NR
Miembro registrado
230 mensajes
Publicado el 14,noviembre 2019 - 17:04
Merci Nico d'avoir complété le poste.

--
Stéphane.
Miembro registrado
87 mensajes
Publicado el 14,noviembre 2019 - 18:09
Pour trouver les annexes API à jour, passez par:
https://communaute.chorus-pro.gouv.fr/documentation/specifications-externes/

puis la rubrique:
Annexe API


De façon générale, on trouve toutes les informations dont on a besoin dans ce document.
Vous trouverez aussi, l'URL du webservice associé à chaque fonction API et des exemples des données d'entrées et sorties JSON pour chaque fonction API, ici:
https://communaute.chorus-pro.gouv.fr/documentation/api/

Attention, les JSON ne sont donnés qu'à titre d'exemple. J'ai pu constater qu'ils ne sont pas tenus à jour.
Il arrive qu'ils comportent des erreurs et ils n'utilisent pas toutes les variables d'entrée/sortie.
Pour avoir la liste complète et à jour des données d'entrée/sortie de vos JSON et leur caractère obligatoire ou non, il faut aller chercher ses informations dans la spec. externe "Annexe API" évoquée plus haut.

--

NR
Publicado el 15,noviembre 2019 - 11:04
Merci beaucoup, Nicolas d'avoir clarifié le processus et pour des informations sur la documentation!

Ma situation est un peu plus compliquée, car je joue le rôle d'intermédiaire.

Mon flux contiendra une seule facture d'un fournisseur client.
Donc, pour trouver le statut de la facture (et non le flux),
j'imagine que je devrai demander l'accès à la zone "Factures émises" du fournisseur sur le portail ChorusPro, pour pouvoir ensuite effectuer la recherche à l'aide de l'appel "Rechercher_facture_par_fournisseur", en passant en paramètre de recherche code fournisseur et numéro de facture.

Pour le moment, je n'ai simulé le processus que sur le portail de qualification.
Dès que j'aurai les certificats, je procéderai aux tests avec l'API.

Bonne journée,

Jeanne