cXML Overview
Receiving/Sending cXML
The majority of cXML documents are sent server-to-server via HTTP(S) POST requests where the POST body is the cXML. The only exception is the shopping cart (PunchOutOrderMessage
) which is transmitted from the shoppers browser to their eProcurement system as part of an HTML form.
Example cXML HTTP POST Request
POST /cxml HTTP/1.1 Host: www.example.com Content-Type: text/xml; charset="UTF-8" Content-Length: 284 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.041/cXML.dtd"> <cXML payloadID="1539050765.83749@example.com" timestamp="2018-04-07T16:16:53-05:00"> <Header> </Header> <Request deploymentMode="production"> </Request> </cXML>
cXML Document Structure
The first line in a cXML document must be: <?xml version="1.0" encoding="UTF-8"?>
. Encodings other than UTF-8 may be supported but should be avoided when possible.
The second line must be the DOCTYPE line which will vary depending on the DTD being used:
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.041/cXML.dtd">
.
The cXML
element must follow the DOCTYPE line and include the payloadID
and timestamp
attributes.
The cXML[@payloadID]
must be a unique number, used for logging purposes to identify documents that might have been lost or had problems. This value should not change for retry attempts. For transactional documents, the payloadID should be saved in the application generating the document and the application receiving the document. The recommended format for the value is <unix_timestamp>.<process_id>.<5_random_digits>@<hostname>
. For example: 1539050765.512.83749@example.com
The timestamp
attribute must be the ISO 8601 date/time of when the document was generated. For example: 2018-04-07T16:16:53-05:00
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.041/cXML.dtd">
<cXML payloadID="1539050765.512.83749@example.com" timestamp="2018-04-07T16:16:53-05:00">
<Header>
<!-- Credentials go here -->
</Header>
<!-- Message, Request, or Response element goes here -->
</cXML>
Deployment Mode
The Message
and Request
elements include a deploymentMode
attribute that should be set to "test" or "production". It is important to set this attribute correctly as some systems will handle requests differently depending on this value.
Credentials
Most cXML documents contain a Header element which can include 3 container elements for credentials: From
, To
, and Sender
. The cXML standard allows the credentials to identify buyers and suppliers using different domains (eg DUNS, NetworkId). In practice, a simplified version of the standard is typically used which is summarized below. Refer to the cXML User Guide for a detailed explanation of the Header
/ Credential
elements.
Credential[@domain]
The Credential[@domain]
attribute should be set to NetworkId
unless an actual DUNS number is being used, in which case it should be set to DUNS
.
eCommerce Implementation
Create a data model for storing cXML connections in a database table or file. New connections should be created for each buying organization accessing the PunchOut site. Some buying organizations may require multiple connections to access different catalogs.
Field | Description |
---|---|
Description |
A short description of the connection |
Username |
A unique username for the buyer |
Password Hash |
A hash of the password using a modern hashing algorithm |
Outbound Test URL |
URL to send test documents to |
Outbound Prod URL |
URL to send production documents to |
Account |
Associate the connection with a buying organization or catalog |
Receiving cXML Documents
When a cXML request is received, search for a connection with a Sender/Credential/Identity
that matches the username and a Sender/Credential/SharedSecret
that matches the password. If no connection is found, repeat the process using the From/Credential/Identity
to match against the username where the Sender/Credential/SharedSecret
matches the password. This process will be compatible with the majority of eProcurement systems.
Sending cXML Documents
When sending cXML documents to an eProcurement system (order confirmations, ship notices, invoices, etc), the username should be used to populate the To/Credential/Identity
field and the password should populate the Sender/Credential/SharedSecret
. The From/Credential/Identity
and Sender/Credential/Identity
should be populated with an identifier representing the name of the supplier. Test documents should be sent to the "Outbound Test URL" and production documents should be sent to the "Outbound Prod URL". In both cases, the deploymentMode
attribute should be set correctly.
Sample cXML Credentials
<Header>
<From>
<Credential domain="NetworkId">
<Identity>buyer_id</Identity>
</Credential>
</From>
<To>
<Credential domain="DUNS">
<Identity>supplier_id</Identity>
</Credential>
</To>
<Sender>
<Credential domain="NetworkId">
<Identity>sender_id</Identity>
<SharedSecret>password</SharedSecret>
</Credential>
<UserAgent>Application Name v1.2.3</UserAgent>
</Sender>
</Header>