ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

cXML PunchOutSetupRequest

Transaction d'ouverture de session punchout. L'ERP acheteur l'envoie au site fournisseur pour obtenir une URL temporaire qui amènera l'utilisateur dans le catalogue hébergé, déjà authentifié et associé à un cookie de session.

Objet de la transaction

Le punchout permet à un acheteur de magasiner dans le catalogue web hébergé chez le fournisseur — interface riche, prix négociés, stocks temps réel — tout en restant dans le workflow de validation de son ERP. Le PunchOutSetupRequest est l'amorce technique : il identifie l'acheteur, transmet un BuyerCookie qui sera renvoyé tel quel à la fin de session, et indique l'URL BrowserFormPost où le fournisseur devra poster le panier rapatrié.

La réponse contient une StartPage : une URL unique, à courte durée de vie, vers laquelle l'ERP redirige le navigateur de l'utilisateur. Cette URL constitue un jeton d'authentification — quiconque la possède peut entrer dans la session du fournisseur.

Structure XML

PunchOutSetupRequest

Le DTD déclare : PunchOutSetupRequest (BuyerCookie, Extrinsic*, BrowserFormPost?, Contact*, SupplierSetup?, ShipTo?, SelectedItem?, ItemOut*). L'attribut operation est #REQUIRED et prend quatre valeurs : create (nouveau panier), inspect (relire un panier en lecture seule), edit (modifier un panier existant), source (créer un RFQ vers un outil de sourcing).

xml punchout-setup-request.cxml.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.069/cXML.dtd">
<cXML payloadID="260513.143000.punchout@buyer.example"
      timestamp="2026-05-13T14:30:00+02:00"
      version="1.2.069">
  <Header>
    <From>
      <Credential domain="DUNS"><Identity>123456789</Identity></Credential>
    </From>
    <To>
      <Credential domain="DUNS"><Identity>987654321</Identity></Credential>
    </To>
    <Sender>
      <Credential domain="DUNS">
        <Identity>123456789</Identity>
        <SharedSecret>shared-secret-here</SharedSecret>
      </Credential>
      <UserAgent>ediverse-buyer/1.0</UserAgent>
    </Sender>
  </Header>
  <Request>
    <PunchOutSetupRequest operation="create">
      <BuyerCookie>session-abc-12345</BuyerCookie>
      <BrowserFormPost>
        <URL>https://buyer.example/cxml/punchout/callback</URL>
      </BrowserFormPost>
      <ShipTo>
        <Address>
          <Name xml:lang="fr">Acheteur SA — Site Paris</Name>
          <PostalAddress>
            <Street>10 rue de la Paix</Street>
            <City>Paris</City>
            <PostalCode>75002</PostalCode>
            <Country isoCountryCode="FR">France</Country>
          </PostalAddress>
        </Address>
      </ShipTo>
    </PunchOutSetupRequest>
  </Request>
</cXML>

PunchOutSetupResponse

Le DTD est minimaliste : PunchOutSetupResponse (StartPage). La seule charge utile est l'URL vers laquelle rediriger l'utilisateur, encapsulée dans StartPage > URL.

xml punchout-setup-response.cxml.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.069/cXML.dtd">
<cXML payloadID="260513.143002.punchout-resp@supplier.example"
      timestamp="2026-05-13T14:30:02+02:00"
      version="1.2.069">
  <Response>
    <Status code="200" text="OK"/>
    <PunchOutSetupResponse>
      <StartPage>
        <URL>https://supplier.example/catalog/session/abc-12345</URL>
      </StartPage>
    </PunchOutSetupResponse>
  </Response>
</cXML>

Requis vs optionnel

Le seul élément obligatoire dans le contenu de la requête est BuyerCookie (le DTD le déclare ANY, mais il est cardinal 1). L'attribut operation est lui aussi #REQUIRED.

Tout le reste est optionnel : Extrinsic*, BrowserFormPost?, Contact*, SupplierSetup?, ShipTo?, SelectedItem?, ItemOut*. En pratique, BrowserFormPost n'est jamais omis — sans lui, le fournisseur ne sait pas où poster le panier. Et ShipTo est très courant pour que le catalogue propose les bons stocks et délais.

Côté réponse, StartPage > URL est l'unique contenu, donc strictement obligatoire.

Patterns courants

Le BuyerCookie est opaque pour le fournisseur — celui-ci doit le stocker tel quel et le renvoyer intact dans le futur PunchOutOrderMessage. C'est la clé qui permet à l'ERP acheteur de réassocier le panier rapatrié à sa demande de panier d'origine. Le DTD précise que "BuyerCookie est unique par session PunchOut".

SelectedItem sert au punchout par produit : au lieu d'arriver sur la home du catalogue, l'utilisateur est amené directement sur la page d'un article précis (identifié par son ItemID). Utile depuis un panier ERP qui veut "configurer" un article punchout.

Pour le mode operation="edit" ou "inspect", l'ERP renvoie les ItemOut* du panier d'origine, ce qui permet au catalogue de reconstituer l'état précédent.

Flux Punchout

Le punchout complet est une chorégraphie HTTP en deux temps. Phase 1 (synchrone) : le PunchOutSetupRequest/Response via HTTPS de serveur à serveur. Phase 2 (asynchrone) : la session web utilisateur, qui se termine par un PunchOutOrderMessage posté par le navigateur de l'utilisateur vers la BrowserFormPost URL.

plaintext punchout-flow.txt
Acheteur (ERP)              Hub réseau           Fournisseur (catalogue)
      │                          │                          │
      │  1. PunchOutSetupRequest │                          │
      │  (operation=create)      │                          │
      ├─────────────────────────►│                          │
      │                          │  2. relais HTTPS POST    │
      │                          ├─────────────────────────►│
      │                          │                          │
      │                          │  3. PunchOutSetupResponse│
      │                          │     <StartPage><URL/>    │
      │                          │◄─────────────────────────┤
      │  4. relais HTTP 200      │                          │
      │◄─────────────────────────┤                          │
      │                          │                          │
      │  5. redirige le navigateur utilisateur vers StartPage│
      │═══════════════════════════════════════════════════►│
      │                                                     │
      │       (l'utilisateur navigue dans le catalogue)     │
      │                                                     │
      │  6. PunchOutOrderMessage (POST navigateur → BrowserFormPost URL)
      │◄════════════════════════════════════════════════════┤

Documentation