Electronic Commerce Modeling Language (ECML)

Wie zich wil storten op het bouwen van een webwinkel, een bestelsysteem of een andere vorm van e-commerce, hoeft daarvoor dankzij PHP en MySQL niet opnieuw het wiel uit te vinden. Je kunt bijvoorbeeld kant-en-klare oplossingen gebruiken zoals Magento (www.magentocommerce.com) en osCommerce (www.oscommerce.com). Minder bekend onder gebruikers van PHP en MySQL is dat er voor e-commerce al bijna tien jaar een aparte internetstandaard bestaat: Electronic Commerce Modeling Language of afgekort ECML.

Voor vooral het dataverkeer bij e-commerce bestaat sinds oktober 1999 een internetstandaard die nog nauwelijks bekend is: Electronic Commerce Modeling Language (ECML). Deze speciale internetstandaard voor e-commerce is vooral belangrijk omdat erin is bepaald welke naam u moet gebruiken voor variabelen. Als samenwerkende webapplicaties allemaal dezelfde variabelennamen accepteren, maakt dat online verkooptransacties veel gemakkelijker. Daarnaast is in ECML vastgelegd welke vorm bepaalde data moeten hebben en kent ECML een apart XML-structuur voor alle data.

Electronic Data Interchange (EDI) via HTML of XHTML

Als internettaal kan ECML worden gebruikt voor het uitwisselen van onder meer klantgegevens, adresgegevens en creditcardgegevens voor transacties met bijvoorbeeld vervoersbedrijven, banken, creditcardmaatschappijen en payment service providers (PSP’s). De gegevens die je vastlegt met PHP-applicaties of opslaat in MySQL-databases, worden dankzij ECML compatibel met systemen van andere bedrijven in het verkoopproces. Tenminste, dat is de bedoeling, want ECML wordt nog weinig gebruikt.

Meer praktisch is ECML vooral belangrijk voor het ontwerpen van formulieren in HTML en Extensible HTML (XHTML). In ECML is namelijk ook vastgelegd welke veldnamen je moet gebruiken in het HTML-element <input name="..." />. Voor de gebruikersverificatie kent ECML bijvoorbeeld de twee veldnamen Ecom_User_ID voor de gebruikersnaam en Ecom_User_Password voor het bijbehorende wachtwoord. In een formulier voor het aanmaken van een gebruikersaccount en later in een formulier voor het inloggen kun je dan de volgende XHTML-code gebruiken:

<form action="..." method="post">
    ...
    <input type="text" name="Ecom_User_ID" />
    ...
    <input type="password" name="Ecom_User_Password" />
    ...
    <input type="hidden" name="Ecom_SchemaVersion" value="urn:ietf:params:ecml:v2.0" />
    ...
</form>

Deze ECML-oplossing zorgt ervoor dat de gebruikersnaam wordt verzonden met de variabelennaam Ecom_User_ID en het gebruikerswachtwoord met de variabelennaam Ecom_User_Password. Het verborgen formulierveld met de naam Ecom_SchemaVersion meldt daarnaast welke datastructuur wordt gebruikt voor deze ECML-gegevens; met de standaardwaarde urn:ietf:params:ecml:v2.0 geef je hier aan webapplicaties door dat er een uniform resource name (URN) wordt gebruikt van de Internet Engineering Task Force (IETF) voor ECML versie 2.0. Dit veld is vereist, vooral om webbrowsers te melden welke versie van ECML ze moeten gebruiken. Browsers kunnen deze melding vervolgens gebruiken om velden alvast te vullen met bijvoorbeeld AutoComplete ofwel AutoAanvullen.

Velden in ECMLv2

De tweede versie ECMLv2 uit juni 2005 (RFC 4112) kent de velden in de tabel aan het einde van dit artikel. De kolom ‘Min.’ noemt de aanbevolen minimumlengte voor elk veld. Alle velden worden uitgebreid toegelicht met noten in RFC 4112 op bijvoorbeeld http://tools.ietf.org/html/rfc4112, http://www.faqs.org/rfcs/rfc4112.html of http://www.rfc-editor.org/rfc/rfc4112.txt.

Merk op dat ECML drie soorten adressen kent: een bezorgadres met het prefix Ecom_ShipTo, een factuuradres met het prefix Ecom_BillTo en een derde adres met het prefix Ecom_ReceiptTo voor bijvoorbeeld een orderbevestiging of kopie van een factuur.

De velden met het prefix Ecom_Payment_Card zijn vooral bedoeld voor creditcards, de velden met Ecom_Loyalty_Card voor klantenkaarten of spaarkaarten en de velden met Ecom_User en Ecom_UserData voor gebruikersaccounts.

Beperkingen van ECML

Houd rekening met de volgende drie beperkingen van ECML. Als je deze internetstandaard wilt gebruiken, zul je enkele velden moeten verwijderen of aanpassen. Daarnaast kan het toevoegen van velden voor bepaalde applicaties zeker geen kwaad.

Verenigde Staten en Amerikaans Engels

Als taal leunt ECML erg op de situatie in de Verenigde Staten en het Amerikaanse Engels. Daardoor is ECML soms minder geschikt voor Europese of Nederlandstalige applicaties.

Een voorbeeld zijn de velden Ecom_ShipTo_Postal_StateProv en Ecom_BillTo_Postal_StateProv. Deze velden zijn bedoeld voor de afkorting van twee letters van een Amerikaanse staat in het bezorgadres (alle velden met het prefix Ecom_ShipTo) en het factuuradres (alles met Ecom_BillTo). In Nederland en België hebben die velden geen betekenis, omdat wij voldoende hebben aan de postcode in Ecom_ShipTo_Postal_PostalCode of Ecom_BillTo_Postal_PostalCode en de plaatsnaam in Ecom_ShipTo_Postal_City of Ecom_BillTo_Postal_City. Je kunt Ecom_ShipTo_Postal_StateProv gebruiken voor een provincie, maar dan wordt het dubbel redundant (overbodig): voor adressen is geen provincie nodig en de provincie is direct af te leiden uit de postcode.

Velden voor een staat of provincie kun je nog weglaten, maar dat geldt helaas niet voor de naam van een klant. Daarvoor gebruikt ECML een oplossing die vaak tot lokalisatieproblemen leidt — en tot usabilityfouten die je vaak aantreft in Nederlandstalige software van Microsoft. Voor namen wordt de typisch Amerikaanse vorm met drie velden gebruikt, bijvoorbeeld Ecom_ShipTo_Postal_Name_First, Ecom_ShipTo_Postal_Name_Middle plus Ecom_ShipTo_Postal_Name_Last. Deze typisch Amerikaanse opzet leidt vaak tot vergelijkbare complicaties, niet alleen in e-commerce maar ook in customer relationship management (CRM).

Wij kennen bijvoorbeeld een duidelijk verschil tussen voornamen en roepnamen. Johannes en Petrus worden Jan of Johan en Piet of Peter. ECML kent dat onderscheid niet, waardoor het veld Ecom_ShipTo_Postal_Name_First slecht bruikbaar wordt. Dat leidt tot dataverlies. Sla je bijvoorbeeld de roepnaam Jan op, dan is niet duidelijk wat de voornaam van de klant is: het kan kortweg Jan zijn, maar ook Johannes. Sla je echter de officiële voornaam Johannes op, dan is niet duidelijk hoe de klant moet worden aangesproken: het kan Jan, Johan of misschien John zijn.

Gebrekkige standaardisatie

De internetstandaard ECML verwijst wel naar bestaande normen van bijvoorbeeld de International Organization for Standardization (ISO), maar past die vaak erg slecht toe. Voor landen in de velden in de velden Ecom_ShipTo_Postal_CountryCode, Ecom_BillTo_Postal_CountryCode en Ecom_ReceiptTo_Postal_CountryCode worden keurig de gestandaardiseerde ISO-landcodes gebruikt, zoals NL voor Nederland en BE voor België. De bedenkers van ECML zijn echter vergeten dat er vergelijkbare ISO-codes bestaan voor talen, zoals nl voor Nederlands, en voor Engels en fr voor Frans. Voor de taal van de gebruikersgegevens gebruikt ECML nu nog het veld Ecom_UserData_Language met een vereiste minimumlengte van dertig karakters. Dat is niet alleen zonde van de opslagruimte. Het leidt ook veel eerder tot fouten, zoals de vervuilde data Nederlands, Dutch, nl-NL en nl voor één taal.

Het opslaan van een taal in een lang tekstveld van minimaal dertig karakters is onhandig, maar dat kunnen we nog vergeven door het een ‘keuze’ te noemen. Andere oplossingen in ECML zijn echt fout. Voor het geslacht verwijst ECML bijvoorbeeld naar de norm ISO/IEC 5218, Information technology -- Codes for the representation of human sexes. Daarvan wordt de sterk verouderde versie gebruikt met de drie letters M van male (mannelijk), F van female (vrouwelijk) en U van unknown (onbekend). Deze actuele versie van ISO-norm 5218 gebruikt echter niet meer drie letters, maar vier integers.

CodeEngelsNederlandsFrans
0Not known Onbekend Inconnu
1Male Mannelijk Masculin
2Female Vrouwelijk Féminin
9Not applicable Niet van toepassing Sans objet

De vernieuwde ISO-norm is om zeker drie redenen beter:

Praktische implementatie

Sommige oplossingen in ECML zijn niet effectief of werken praktisch gewoon onhandig. In Nederland kan een bestelling worden bezorgd met slechts drie gegevens: de postcode, het huisnummer en een eventuele huisnummertoevoeging (bijvoorbeeld de letter A in huisnummer 123-A). Pakketdiensten die in Nederland opereren. zoals TNT Post (www.tntpost.nl) en DHL van Deutsche Post (www.dhl.nl), gebruiken meestal deze drie velden voor het invoeren van adressen in hun systemen. In ECML worden echter velden gebruikt zoals Ecom_ShipTo_Postal_Street_Line1 en Ecom_ShipTo_Postal_PostalCode. Er is wel een apart veld voor de postcode, maar het huisnummer en de huisnummertoevoeging staan samen met de straatnaam in één veld voor één adresregel. En drie verschillende gegevens opslaan in één veld werkt natuurlijk niet goed als je de bezorging fatsoenlijk wilt automatiseren.

Velden en veldnamen in ECMLv2

VeldNaamMin.
ship to titleEcom_ShipTo_Postal_Name_Prefix4
ship to first nameEcom_ShipTo_Postal_Name_First15
ship to middle nameEcom_ShipTo_Postal_Name_Middle15
ship to last nameEcom_ShipTo_Postal_Name_Last15
ship to name suffixEcom_ShipTo_Postal_Name_Suffix4
ship to company nameEcom_ShipTo_Postal_Company20
ship to street line1Ecom_ShipTo_Postal_Street_Line120
ship to street line2Ecom_ShipTo_Postal_Street_Line220
ship to street line3Ecom_ShipTo_Postal_Street_Line320
ship to cityEcom_ShipTo_Postal_City22
ship to state/provinceEcom_ShipTo_Postal_StateProv2
ship to zip/postal codeEcom_ShipTo_Postal_PostalCode14
ship to countryEcom_ShipTo_Postal_CountryCode2
ship to phoneEcom_ShipTo_Telecom_Phone_Number10
ship to emailEcom_ShipTo_Online_Email40
 
bill to titleEcom_BillTo_Postal_Name_Prefix4
bill to first nameEcom_BillTo_Postal_Name_First15
bill to middle nameEcom_BillTo_Postal_Name_Middle15
bill to last nameEcom_BillTo_Postal_Name_Last15
bill to name suffixEcom_BillTo_Postal_Name_Suffix4
bill to company nameEcom_BillTo_Postal_Company20
bill to street line1Ecom_BillTo_Postal_Street_Line120
bill to street line2Ecom_BillTo_Postal_Street_Line220
bill to street line3Ecom_BillTo_Postal_Street_Line320
bill to cityEcom_BillTo_Postal_City22
bill to state/provinceEcom_BillTo_Postal_StateProv2
bill to zip/postal codeEcom_BillTo_Postal_PostalCode14
bill to countryEcom_BillTo_Postal_CountryCode2
bill to phoneEcom_BillTo_Telecom_Phone_Number10
bill to emailEcom_BillTo_Online_Email40
 
receipt to titleEcom_ReceiptTo_Postal_Name_Prefix4
receipt to first nameEcom_ReceiptTo_Postal_Name_First15
receipt to middle nameEcom_ReceiptTo_Postal_Name_Middle15
receipt to last nameEcom_ReceiptTo_Postal_Name_Last15
receipt to name suffixEcom_ReceiptTo_Postal_Name_Suffix4
receipt to company nameEcom_ReceiptTo_Postal_Company20
receipt to street line1Ecom_ReceiptTo_Postal_Street_Line120
receipt to street line2Ecom_ReceiptTo_Postal_Street_Line220
receipt to street line3Ecom_ReceiptTo_Postal_Street_Line320
receipt to cityEcom_ReceiptTo_Postal_City22
receipt to state/provinceEcom_ReceiptTo_Postal_StateProv2
receipt to postal codeEcom_ReceiptTo_Postal_PostalCode14
receipt to countryEcom_ReceiptTo_Postal_CountryCode2
receipt to phoneEcom_ReceiptTo_Telecom_Phone_Number10
receipt to emailEcom_ReceiptTo_Online_Email40
 
name on cardEcom_Payment_Card_Name30
card typeEcom_Payment_Card_Type4
card numberEcom_Payment_Card_Number19
card verification valueEcom_Payment_Card_Verification4
card issuer numberEcom_Payment_Card_IssueNumber2
card expire date dayEcom_Payment_Card_ExpDate_Day2
card expire date monthEcom_Payment_Card_ExpDate_Month2
card expire date yearEcom_Payment_Card_ExpDate_Year4
card valid date dayEcom_Payment_Card_ValidFrom_Day2
card valid date monthEcom_Payment_Card_ValidFrom_Month2
card valid date yearEcom_Payment_Card_ValidFrom_Year4
card protocolsEcom_Payment_Card_Protocol20
 
loyalty card nameEcom_Loyalty_Card_Name30
loyalty card typeEcom_Loyalty_Card_Type20
loyalty card numberEcom_Loyalty_Card_Number40
loyalty card verificationEcom_Loyalty_Card_Verification4
loyalty card expire dayEcom_Loyalty_Card_ExpDate_Day2
loyalty card expire monthEcom_Loyalty_Card_ExpDate_Month2
loyalty card expire yearEcom_Loyalty_Card_ExpDate_Year2
loyalty card valid dayEcom_Loyalty_Card_ValidFrom_Day2
loyalty card valid monthEcom_Loyalty_Card_ValidFrom_Month2
loyalty card valid yearEcom_Loyalty_Card_ValidFrom_Year4
 
consumer order IDEcom_ConsumerOrderID20
 
user IDEcom_User_ID40
user passwordEcom_User_Password20
user certificateEcom_User_Certificate_URL128
user data countryEcom_UserData_Country2
user data languageEcom_UserData_Language30
user data genderEcom_UserData_Gender1
user data birth dayEcom_UserData_BirthDate_Day2
user data birth monthEcom_UserData_BirthDate_Month2
user data birth yearEcom_UserData_BirthDate_Year4
user data preferencesEcom_UserData_Preferences60
 
schema versionEcom_SchemaVersion30
 
wallet IDEcom_WalletID40
wallet URLEcom_Wallet_Location128
 
customer device IDEcom_Device_ID20
customer device typeEcom_Device_Type20
 
end transaction flagEcom_TransactionComplete-
 
merchant home domainEcom_Merchant128
processor home domainEcom_Processor128
transaction identifierEcom_Transaction_ID128
transaction URL inquiryEcom_Transaction_Inquiry500
transaction amountEcom_Transaction_Amount128
transaction currencyEcom_Transaction_CurrencyCode3
transaction dateEcom_Transaction_Date80
transaction typeEcom_Transaction_Type24
transaction signatureEcom_Transaction_Signature160
end transaction flagEcom_TransactionComplete-
 
merchant identifierEcom_Merchant_ID8
merchant terminalEcom_Merchant_Terminal_ID8
merchant terminal dataEcom_Merchant_Terminal_Data128
transaction process codeEcom_Transaction_ProcessingCode6
transaction referenceEcom_Transaction_Reference_ID12
transaction acquirerEcom_Transaction_Acquire_ID13
transaction forwardEcom_Transaction_Forward_ID13
transaction traceEcom_Transaction_Trace_Audit6
transaction effective dateEcom_Transaction_Effective_Date4
transaction CIDEcom_Transaction_CID8
transaction POSEcom_Transaction_POSCode12
transaction private useEcom_Transaction_PrivateUseData166
transaction responseEcom_Transaction_ResponseData27
transaction approval codeEcom_Transaction_ApprovalCode12
transaction retrieval codeEcom_Transaction_RetrievalCode128
transaction response actionEcom_Transaction_ActionCode13
transaction reasonEcom_Transaction_ReasonCode4
transaction AAVEcom_Transaction_AAV3
transaction settlement dateEcom_Transaction_Settle_Date4
transaction capture dateEcom_Transaction_Capture_Date4
transaction Track 1Ecom_Transaction_Track139
transaction Track 2Ecom_Transaction_Track239