Kennisbank
OCI of cXML: de twee PunchOut-protocollen naast elkaar
Het inkoopsysteem van je klant bepaalt welk protocol het wordt. OCI brengt de winkelmand als formuliervelden terug en houdt daar op. cXML brengt hem terug als XML-bericht en heeft ook berichten voor de order, de bevestiging, het verzendbericht en de factuur.
Bijgewerkt op
Het korte antwoord
Je kiest het niet zelf: het inkoopsysteem van je klant bepaalt het protocol. SAP SRM gebruikt OCI. Coupa en SAP Ariba gebruiken cXML. AFAS en Elari, voorheen Spend Cloud, gebruiken OCI voor de winkelmand en sturen de order daarna als cXML.
Het verschil zit in hoe ver elk protocol reikt. OCI is een specificatie van SAP voor de sessie en de winkelmand. De laatste versie, 5.0, dateert van 2012, en na de winkelmand houdt hij op. cXML beschrijft de sessie en ook alles wat daarna komt: inkooporder, orderbevestiging, verzendbericht en factuur. De cXML-referentie wordt bijgehouden door SAP; versie 1.2.071 is van 14 augustus 2026. Voor een leverancier betekent dat: met OCI bouw je een sessie, met cXML een sessie en een orderadres met vier soorten berichten.
OCI en cXML naast elkaar
| Onderdeel | OCI | cXML PunchOut |
|---|---|---|
| Start van de sessie | De browser stuurt parameters naar de webshop, standaard met POST, GET kan ook | Het inkoopsysteem post een PunchOutSetupRequest naar de webshop |
| Inlog | Gebruikersnaam en wachtwoord als parameters | Identiteit in From, gedeeld geheim in Sender |
| Retouradres | HOOK_URL, naam door de beheerder te wijzigen |
BrowserFormPost/URL, plus een BuyerCookie per sessie |
| Winkelmand terug | Formuliervelden NEW_ITEM-<veld>[n] |
Eén formulierveld cXML-base64 met een PunchOutOrderMessage |
| Velden | 34 velden met vaste maximale lengtes | Elementen per regel, met verplichte Classification |
| Getallen | 11 cijfers voor de punt, 3 erna | Money als getal, valuta als attribuut |
| Eenheid | ISO-code, 3 tekens | UN/CEFACT-code |
| Tekenset | Die van het inkoopsysteem, doorgegeven in http_content_charset |
UTF-8, zoals de referentie voorschrijft |
| Fouten | Geen statuscodes; de inkoper ziet een fout in zijn eigen systeem | Statuscodes zoals 400, 401, 406 en 500 in het antwoord |
| Order en verder | Niet in de specificatie | OrderRequest, ConfirmationRequest, ShipNoticeRequest, InvoiceDetailRequest |
| Zoeken vanuit het inkoopsysteem | FUNCTION=BACKGROUND_SEARCH, in 5.0 catalogusreplicatie in JSON |
Level 2: indexbestanden met punchoutLevel store, aisle, shelf of product |
De stappen van de sessie zijn bij beide gelijk: de inkoper klikt in zijn inkoopsysteem op jouw webshop, is ingelogd, vult een winkelmand en neemt hem mee terug. Bij beide is die winkelmand nog geen order. De cXML-referentie noemt hem met zoveel woorden een offerte. Het hele verloop staat op OCI en PunchOut.
Eén regel in beide formaten
Bakker Installatie B.V. bestelt 500 kabelbinders van 200 mm, artikel 30377, voor 3,75 per 100 stuks. In OCI:
<input type="hidden" name="NEW_ITEM-DESCRIPTION[3]" value="Kabelbinder 200 mm zwart">
<input type="hidden" name="NEW_ITEM-QUANTITY[3]" value="500">
<input type="hidden" name="NEW_ITEM-UNIT[3]" value="PCE">
<input type="hidden" name="NEW_ITEM-PRICE[3]" value="3.75">
<input type="hidden" name="NEW_ITEM-PRICEUNIT[3]" value="100">
<input type="hidden" name="NEW_ITEM-CURRENCY[3]" value="EUR">
<input type="hidden" name="NEW_ITEM-VENDORMAT[3]" value="30377">
In cXML, als deel van de PunchOutOrderMessage:
<ItemIn quantity="500">
<ItemID><SupplierPartID>30377</SupplierPartID></ItemID>
<ItemDetail>
<UnitPrice><Money currency="EUR">3.75</Money></UnitPrice>
<Description xml:lang="nl">Kabelbinder 200 mm zwart</Description>
<UnitOfMeasure>EA</UnitOfMeasure>
<PriceBasisQuantity quantity="100" conversionFactor="1">
<UnitOfMeasure>EA</UnitOfMeasure></PriceBasisQuantity>
<Classification domain="UNSPSC">(UNSPSC-code)</Classification>
</ItemDetail>
</ItemIn>
In beide gevallen is het regelbedrag 500 / 100 × 3,75 = 18,75. Zonder prijseenheid gaat het in OCI mis: per stuk kost de kabelbinder 0,0375, het prijsveld heeft 3 decimalen, dus wordt het 0.038 en de regel 500 × 0,038 = 19,00. In cXML doet PriceBasisQuantity hetzelfde werk als NEW_ITEM-PRICEUNIT. Of het inkoopsysteem van je klant dat element leest, test je; anders verkoop je per zak van 100.
Drie dingen veranderen onderweg. De eenheid gaat van de ISO-code PCE naar de UN/CEFACT-code EA. Er komt een Classification bij, die cXML verplicht stelt en die in OCI een optioneel veld is. En de omschrijving heeft andere grenzen: NEW_ITEM-DESCRIPTION is 40 tekens, de cXML-Description heeft geen vaste lengte, maar het optionele ShortName erin is maximaal 50 tekens, met 30 als aanbeveling.
Waar OCI stopt
- Bij de winkelmand. Er is geen order, geen bevestiging en geen factuur in de specificatie. Elk inkoopsysteem kiest zelf hoe de order komt: AFAS en Elari met cXML, andere met een pdf per e-mail.
- Bij btw. De specificatie heeft geen btw-veld. AFAS leest het percentage uit
NEW_ITEM-CUST_FIELD1, Elari uitNEW_ITEM-VATPERCENTAGE. Per klant leg je vast welk veld het wordt. - Bij de inlog. Gebruikersnaam en wachtwoord gaan via de browser van de inkoper. Bij GET staan ze in de URL en daarmee in de toegangslog van de webshop.
- Bij fouten. Een winkelmand die het inkoopsysteem afwijst, geeft geen statuscode aan de webshop. Bij AFAS houdt één regel die niet klopt de hele overdracht tegen, en dat ziet alleen de inkoper.
- Bij de tekenset. Het inkoopsysteem geeft bijvoorbeeld
iso-8859-1op. Een webshop die UTF-8 terugstuurt, levert "geïsoleerd" af als "geïsoleerd". Zie tekencodering en UTF-8.
Waar cXML stopt
- Bij de eisen per regel. Elke
ItemInmoetSupplierPartID,UnitPrice,Description,UnitOfMeasureenClassificationhebben. Een webshop zonder UNSPSC-codes of met eenheden als "stuk" moet die eerst vertalen; zie eenheden en verpakkingen. - Bij het netwerk. Via SAP Business Network zet het netwerk zichzelf in
Sender. Een webshop die de klant zoekt opSenderen niet opFrom, antwoordt dan401. - Bij de pogingen. Op een
5xxbeveelt de referentie 10 nieuwe pogingen aan, een keer per uur. Een orderadres dat langer dan 10 uur onbereikbaar is, mist de order. Een herhaling heeft dezelfdepayloadID; wie daar niet op controleert, maakt de order twee keer aan. - Bij de catalogus. Een cXML-catalogus uploaden mag tot 4 MB; groter geeft status
468.
Wat elk vraagt in onderhoud
| Wat verandert | OCI | cXML |
|---|---|---|
| Per klant | Parameternamen, de velden die het systeem leest, het btw-veld, de orderroute | Identiteiten, gedeeld geheim, Extrinsic-velden zoals kostenplaats |
| Per versie | 4.0 en 5.0; OCI_VERSION is volgens SAP informatief |
Elke versie heeft een eigen DTD; het bericht noemt hem in de DOCTYPE |
| Bij de leverancier | Korte omschrijvingen van 40 tekens, ISO-eenheden, prijseenheden | UN/CEFACT-eenheden, UNSPSC-codes, een orderadres dat altijd bereikbaar is |
AFAS en Elari zijn een voorbeeld van het onderhoud bij OCI. AFAS noemt voor zijn standaarddefinitie 12 velden en leest van NEW_ITEM-VENDORMAT 30 tekens; Elari leest er standaard 8 en vraagt btw in een veld dat SAP niet kent. Dezelfde webshop stuurt voor twee klanten dus twee verschillende winkelmanden.
Wat betekent dit voor je koppeling?
Voor je webshop is het verschil kleiner dan het lijkt: de inlog, de sessie met de prijzen van de klant en de knop die de winkelmand terugstuurt, zijn voor beide protocollen gelijk. Het werk zit in de velden per klant en, bij cXML, in het orderadres en de berichten die daarna komen.
Wij bouwen beide op je bestaande webshop en zetten de order die volgt in je ERP. Het hele verloop staat op OCI en PunchOut, de cXML-berichten één voor één op PunchOut koppeling. Vertel welk inkoopsysteem je klant gebruikt.
Veelgestelde vragen
Kan één webshop zowel OCI als cXML aan?
Ja. De inlog, de sessie met de prijzen van de klant en de overdrachtsknop zijn voor beide gelijk. Alleen het binnenkomende startbericht en het formaat van de winkelmand verschillen. De koppeling herkent per klant welk protocol hij gebruikt en bouwt het juiste formulier.
Welk protocol is veiliger?
Bij OCI gaan gebruikersnaam en wachtwoord via de browser van de inkoper, en bij GET staan ze in de URL. Secure OCI, beschreven in de specificatie van 5.0, haalt ze daar weg. Bij cXML staat het gedeelde geheim in een bericht van server naar server; de winkelmand die via de browser gaat, bevat het geheim niet.
Gebruikt AFAS OCI of cXML?
Allebei. De winkelmand komt via OCI terug in InSite, en na goedkeuring in Profit stuurt AFAS de order als cXML naar de leverancier. Elari, voorheen Spend Cloud, werkt op dezelfde manier. Wat AFAS per onderdeel vraagt, staat op OCI koppeling AFAS.
Is cXML hetzelfde als EDI?
Nee, al dekken ze deels dezelfde documenten. cXML gebruikt XML-berichten over HTTPS en heeft ook de PunchOut-sessie. EDI wisselt orders, bevestigingen, verzendberichten en facturen uit in eigen formaten, zonder sessie. Meer daarover op EDI koppeling.
Vertel wat je nodig hebt
Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.
- Je weet de prijs en de doorlooptijd voordat je iets toezegt
- Wij zoeken uit welke koppeling het werk uit handen neemt
- Wij verzorgen de bouw, hosting, bewaking en het onderhoud
- Je team krijgt minder overtypwerk en minder uitzoekwerk