Skip to main content

Fusion Cloud

The Fusion Cloud API allows the Sale System to communicate with a POI terminal via a Websocket connected to the DataMesh Unify switch.

Reference code

Development Language
DescriptionLocation
.Net.Net NuGet packageon Nuget
Source Codeon GitHub
Demo Application implementing the sdkon GitHub
JavaSource Codeon GitHub
Libraryon Maven Central
Demo Application implementing the sdkon GitHub
Android Demo Application implementing the sdkon GitHub
Swift Framework (for iOS)Source Codeon GitHub
Demo Application implementing the sdkon GitHub
FusionCloudIOS cocoapod (for iOS)Source Codeon GitHub
Demo included in the pod Example

Security requirements

Unify utilises secure websockets for communication between Sale System and POI Server.

  • The Sale System and merchant environment must support outgoing TCP connections to *.datameshgroup.io:443, *.datameshgroup.io:4000, and *.datameshgroup.io:5000 for both the terminal and Sale System
  • As a cloud service, Unify may run on several IP addresses.
    • The Sale System must always use the DNS endpoints provided by DataMesh and never limit connectivity to a specific IP address
  • The Sale System websocket connection must use TLS v1.2 or v1.3 with the SNI extension and one of the following ciphers:
    • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (TLS v1.2)
    • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (TLS v1.2)
    • TLS_AES_128_GCM_SHA256 (TLS v1.3)
    • TLS_CHACHA20_POLY1305_SHA256 (TLS v1.3)
    • TLS_AES_256_GCM_SHA384 (TLS v1.3)
  • The Sale System must ensure the connection to Unify is trusted by validating the server-side certificate chain
    • Unify utilises standard, public Root CA
    • Contact integrations@datameshgroup.com for alternative connection methods if required
    • If certificate validation fails the Sale System must display an error and drop the connection.
  • The Sale System must resolve the DNS address before each connection attempt, and never hard code IP addresses
  • The Sale System should manage SSL certificate revocation lists and ensure OS security updates are applied
  • The Sale System should store the SaleID, POIID, and KEK in a secure location. These values are used to identify the Sale System and authenticate the SecurityTrailer
tip

Over time, Data Mesh may require the Sale System to update the TLS requirements provided above if a security risk is identified. In this situation DataMesh will provide the new requirements and allow a reasonable amount of time to allow the Sale System to meet the new requirements.

Endpoints

Production environment

wss://nexo.datameshgroup.io:5000

Test environment

wss://www.cloudposintegration.io/nexouat1

Message format

SaleToPOIRequest

{
"SaleToPOIRequest": {
"MessageHeader":{...},
"PaymentRequest":{...},
"SecurityTrailer":{...}
}
}

SaleToPOIResponse

{
"SaleToPOIResponse": {
"MessageHeader":{...},
"PaymentResponse":{...},
"SecurityTrailer":{...}
}
}

All messages use JSON format with UTF-8 encoding.

Supported primitive data elements are:

  1. String text string of variable length
  2. Boolean true or false
  3. Number defined in this document as either integer or decimal. For all number fields the Sale System MUST remove the digits equal to zero on left and the right of the value and any useless decimal point (eg. 00320.00 is expressed 320, and 56.10 is expressed 56.1). This simplifies parsing and MAC calculations.
  4. Null optional types can be represented as null
tip

Additional fields will be added to the message specification over time. To ensure forwards compatibility the Sale System must ignore when extra objects and fields are present in response messages.

The base of every message is the SaleToPOIRequest object for requests, and SaleToPOIResponse object for responses.

The SaleToPOIRequest and SaleToPOIResponse contain three objects:

  1. A MessageHeader object.
  2. A Payload object of variable types.
  3. A SecurityTrailer object.

MessageHeader

MessageHeader

"MessageHeader":{
"ProtocolVersion":"3.1-dmg",
"MessageClass":"",
"MessageCategory":"",
"MessageType":"",
"ServiceID":"",
"SaleID":"",
"POIID":""
}

A MessageHeader is included with each request and response. It defines the protocol, message type, sale and POI id.

Attributes
Requ.FormatDescription
ProtocolVersionStringVersion of the Sale to POI protocol specifications. Set to "3.1-dmg". Present when MessageCategory is "Login" otherwise absent.
MessageClassStringInforms the receiver of the class of message. Possible values are "Service", "Device", or "Event"
MessageCategoryStringIndicates the category of message. Possible values are "CardAcquisition", "Display", "Login", "Logout", "Payment"
MessageTypeStringType of message. Possible values are "Request", "Response", or "Notification"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System. The SaleID is provided by DataMesh, and must match the SaleID configured in Unify.
POIIDStringUniquely identifies the POI Terminal. The POIID is provided by DataMesh, and must match the POIID configured in Unify. For Sale Systems that do not need a POI Terminal, the value must be "POI Server"
Only in the Login request after a successful QR POS Pairing, this field will contain the PairingPOIID value from the pairing QR code data

Payload

An object which defines fields for the request/response. The object name depends on the MessageCategory defined in the MessageHeader

e.g. a login will include LoginRequest/LoginResponse, and a payment will include a PaymentRequest/PaymentResponse.

The Cloud API Reference outlines the expected payload for each supported request.

SecurityTrailer

SecurityTrailer

"SecurityTrailer":{
"ContentType":"id-ctauthData",
"AuthenticatedData":{
"Version":"v0",
"Recipient":{
"KEK":{
"Version":"v4",
"KEKIdentifier":{
"KeyIdentifier":"SpecV2TestMACKey",
"KeyVersion":"20191122164326.594"
},
"KeyEncryptionAlgorithm":{
"Algorithm":"des-ede3-cbc"
},
"EncryptedKey":"834EAB305DD18724B9ADF361FC698CE0"
},
"MACAlgorithm":{
"Algorithm":"id-retail-cbc-mac-sha-256"
},
"EncapsulatedContent":{
"ContentType":"iddata"
},
"MAC":"C5142F4DB828AA1C"
}
}
}

A SecurityTrailer object is included with each request and response.

Unify authenticates requests from the Sale System by examining the SecurityTrailer, along with the SaleID, POIID, and CertificationCode

Session Keys are used to generate/verify a Message Authentication Code (MAC) to prove the authenticity of transactions. They are also used to protect Sensitive Card Data if sent from the Sale System. Session keys must change for every message.

SecurityTrailer

Attribute
Requ.FormatDescription
ContentTypeStringSet to "id-ctauthData"
AuthenticatedDataObject
VersionStringSet to "v0"
RecipientObject
  KEKObject
   VersionStringSet to "v4"
   KEKIdentifierObject
    KeyIdentifierString"SpecV2TestMACKey" for test environment, and "SpecV2ProdMACKey" for production
    KeyVersionStringAn incrementing value. Either a counter or date formatted as YYYYMMDDHHmmss.mmm. See KeyVersion
   KeyEncryptionAlgorithmObject
    AlgorithmStringSet to "des-ede3-cbc".
   EncryptedKeyStringA double length 3DES key. See EncryptedKey
  MACAlgorithmObject
   AlgorithmStringSet to "id-retail-cbc-mac-sha-256"
   EncapsulatedContentObject
    ContentTypeStringSet to "iddata"
  MACStringMAC of message content. See MAC
info

For brevity the SecurityTrailer has been excluded from examples.

Perform a purchase

To perform a purchase the Sale System will need to implement requests, and handle responses outlined in the payment lifecycle.

Perform a refund

To perform a refund the Sale System will need to implement requests, and handle responses outlined in the payment lifecycle.

If refunding a previous purchase, the Sale System should include details of the original purchase.

Sample code for Performing a Purchase or Refund

Please refer to the methods in the files listed below to view sample code handling on how to perform a payment/refund.

Development LanguageMethod NameGitHub FileGitHub Repository
C# .NetDoPaymentMainWindow.xaml.cssdk-dotnet-testpos
JavadoPaymentFusionClientDemo.javafusioncloud-sdk-java-demo
SwiftdoPaymentViewController.swiftfusioncloud-sdk-ios-demo

Methods

Login

The Sale System sends a NEXO Login request when it is ready to pair with a POI terminal and before any Reconciliation Request. The Sale System can pair with multiple POI terminals by sending another NEXO Login request.

Login request

Login request

{
"SaleToPOIRequest":{
"MessageHeader":{
"ProtocolVersion":"3.1-dmg",
"MessageClass":"Service",
"MessageCategory":"Login",
"MessageType":"Request",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"LoginRequest":{
"DateTime":"xxx",
"SaleSoftware":{
"ProviderIdentification":"xxx",
"ApplicationName":"xxx",
"SoftwareVersion":"xxx",
"CertificationCode":"xxx"
},
"SaleTerminalData":{
"TerminalEnvironment":"xxx",
"SaleCapabilities":[
"xxx",
"xxx",
"xxx"
],
"TotalsGroupID":"xxx"
},
"OperatorLanguage":"en",
"OperatorID":"xxx",
"ShiftNumber":"xxx",
"POISerialNumber":"xxx",
"Pairing": "true or false"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
ProtocolVersionString"3.1-dmg"
MessageClassString"Service"
MessageCategoryString"Login"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System
POIIDStringUniquely identifies the POI Terminal
Only in the Login request after a successful QR POS Pairing, this field will contain the PairingPOIID value from the pairing QR code data

LoginRequest

Attributes
Requ.FormatDescription
DateTimeStringCurrent Sale System time, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00"
SaleSoftwareObjectObject containing Sale System identification
ProviderIdentificationStringThe name of the company supplying the Sale System. Provided by DataMesh.
ApplicationNameStringThe name of the Sale System application. Provided by DataMesh.
SoftwareVersionStringThe software version of the Sale System. Must be the software version of the current build.
CertificationCodeStringCertification code for this Sale System. Provided by DataMesh.
SaleTerminalDataObjectObject containing Sale System configuration
TerminalEnvironmentString"Attended", "SemiAttended", or "Unattended"
SaleCapabilitiesArrayAdvises the POI System of the Sale System capabilities. See SaleCapabilities
TotalsGroupIdStringGroups transactions in a login session
OperatorLanguageStringOperator language. Set to 'en'
OperatorIdStringGroups transactions under this operator id
ShiftNumberStringGroups transactions under this shift number
POISerialNumberStringThe POISerialNumber from the last login response, or absent if this is the first login
PairingBooleanTrue if the POI ID in the MessageHeader is the PairingPOIID value from the pairing QR code data for the QR POS Pairing

Login response

Login response

{
"SaleToPOIResponse":{
"MessageHeader":{
"ProtocolVersion":"3.1-dmg",
"MessageClass":"Service",
"MessageCategory":"Login",
"MessageType":"Response",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"LoginResponse":{
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
"POISystemData":{
"DateTime":"xxx",
"POISoftware":{
"ProviderIdentification":"xxx",
"ApplicationName":"xxx",
"SoftwareVersion":"xxx"
},
"POITerminalData":{
"TerminalEnvironment":"xxx",
"POICapabilities":[
"xxx",
"xxx",
"xxx"
],
"POIProfile":{
"GenericProfile":"Custom"
},
"POISerialNumber":"xxx"
},
"POIStatus":{
"GlobalStatus":"xxx",
"PEDOKFlag":"true or false",
"CardReaderOKFlag":"true or false",
"PrinterStatus":"xxx",
"CommunicationOKFlag":"true or false",
"FraudPreventionFlag":"true or false"
},
"TokenRequestStatus":"true or false"
}
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
ProtocolVersionString"3.1-dmg"
MessageClassString"Service"
MessageCategoryString"Login"
MessageTypeString"Response"
ServiceIDStringMirrored from the request
SaleIDStringMirrored from the request
POIIDStringMirrored from the request

LoginResponse

Attributes
Requ.FormatDescription
ResponseObjectObject indicating the result of the login
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
POISystemDataObjectOnly present when Result is "Success"
DateTimeStringTime on the POI System, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00"
TokenRequestStatusBooleanTrue if POI tokenisation of PANs is available and usable
POITerminalDataObjectObject representing the POI Terminal
  TerminalEnvironmentStringMirrored from the request
  POICapabilitiesArrayAn array of strings which reflect the hardware capabilities of the POI Terminal. "MagStripe", "ICC", and "EMVContactless"
  GenericProfileStringSet to "Custom"
  POISerialNumberStringIf POIID is "POI Server", then a virtual POI Terminal Serial Number. Otherwise the serial number of the POI Terminal
POIStatusStringObject representing the current status of the POI Terminal
  GlobalStatusStringThe current status of the POI Terminal. "OK" when the terminal is available. "Maintenance" if unavailable due to maintenance processing. "Unreachable" if unreachable or not responding
  SecurityOKFlagBooleanTrue if the security module is present
  PEDOKFlagBooleanTrue if PED is available and usable for PIN entry
  CardReaderOKFlagBooleanTrue if card reader is available and usable
  PrinterStatusStringIndicates terminal printer status. Possible values are "OK", "PaperLow", "NoPaper", "PaperJam", "OutOfOrder"
  CommunicationOKFlagBooleanTrue if terminal's communication is available and usable
  FraudPreventionFlagBooleanTrue if the POI detects possible fraud

Logout

Logging out is optional.

If sent, it tells the POI system that it won’t send new transactions to the POI Terminal and unpairs the Sale Terminal from the POI Terminal. Any further transactions to that POI Terminal will be rejected by the POI System until the next Login.

The Sale System may send multiple Login requests without a Logout request.

Logout request

Logout request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Logout",
"MessageType":"Request",
"ServiceID":"xxxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"LogoutRequest":{
"MaintenanceAllowed":"true or false"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Logout"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System
POIIDStringUniquely identifies the POI Terminal

LogoutRequest

Attributes
Requ.FormatDescription
MaintenanceAllowedBooleanIndicates if the POI Terminal can enter maintenance mode. Default to true if not present.

Logout response

Logout response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Logout",
"MessageType":"Response",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"LogoutResponse":{
"Response":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx xxxx xxxx xxxx xxxx"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Logout"
MessageTypeString"Response"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System
POIIDStringUniquely identifies the POI Terminal

LogoutResponse

Attributes
Requ.FormatDescription
ResponseObjectObject which represents the result of the response
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when result is "Failure". Possible values are "MessageFormat", "Busy", "DeviceOut", "UnavailableService" and others. Note the Sale System should handle error conditions outside the ones documented in this specification.
AdditionalResponseStringProvides additional error information. Only present when result is "Failure". See AdditionalResponse for more information of possible values.

Payment

The payment message is used to perform purchase, purchase + cash out, cash out only, and refund requests.

Payment request

Payment request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Payment",
"MessageType":"Request",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"PaymentRequest":{
"SaleData":{
"OperatorID":"xxx",
"OperatorLanguage":"en",
"ShiftNumber":"xxx",
"SaleTransactionID":{
"TransactionID":"xxx",
"TimeStamp":"xxx"
},
"SaleReferenceID":"xxx",
"SaleTerminalData":{
"TerminalEnvironment":"xxx",
"SaleCapabilities":[
"xxx",
"xxx",
"xxx"
],
"TotalsGroupID":"xxx"
},
"TokenRequestedType":"Customer | Transaction"
},
"PaymentTransaction":{
"AmountsReq":{
"Currency":"AUD",
"RequestedAmount":"x.xx",
"CashBackAmount":"x.xx",
"TipAmount":"x.xx",
"PaidAmount":"x.xx",
"MaximumCashBackAmount":"x.xx",
"MinimumSplitAmount":"x.xx"
},
"OriginalPOITransaction":{
"SaleID":"xxx",
"POIID":"xxx",
"POITransactionID":{
"TransactionID":"xxx",
"TimeStamp":"xxx"
},
"ReuseCardDataFlag":true,
"ApprovalCode":"xxx",
"LastTransactionFlag":true
},
"TransactionConditions":{
"AllowedPaymentBrand":[
"xxx",
"xxx",
"xxx"
],
"AcquirerID":[
"xxx",
"xxx",
"xxx"
],
"DebitPreferredFlag":true,
"ForceOnlineFlag":true,
"MerchantCategoryCode":"xxx"
},
"SaleItem":[
{
"ItemID":"xxx",
"ProductCode":"xxx",
"EanUpc":"xxx",
"UnitOfMeasure":"xxx",
"Quantity":"xx.x",
"UnitPrice":"xx.x",
"ItemAmount":"xx.x",
"TaxCode":"xxx",
"SaleChannel":"xxx",
"ProductLabel":"xxx",
"AdditionalProductInfo":"xxx",
"CostBase":"xxx",
"Discount":"xxx",
"Categories":["xxx","xxx"],
"Brand":"xxx",
"QuantityInStock":"xxx",
"Tags":["xxx","xxx","xxx"]
"PageURL":"xxx",
"ImageURLs":["xxx","xxx"],
"Size":"xxx",
"Colour":"xxx",
"Weight":xx.xx,
"WeightUnitOfMeasure":"xxx"
}
]
},
"PaymentData":{
"PaymentType":"xxx",
"PaymentInstrumentData":{
"PaymentInstrumentType":"xxx",
"CardData":{
"EntryMode":"xxx",
"ProtectedCardData":{
"ContentType":"id-envelopedData",
"EnvelopedData":{
"Version":"v0",
"Recipient":{
"KEK":{
"Version":"v4",
"KEKIdentifier":{
"KeyIdentifier":"xxxDATKey",
"KeyVersion":"xxx"
},
"KeyEncryptionAlgorithm":{
"Algorithm":"des-ede3-cbc"
},
"EncryptedKey":"xxx"
}
},
"EncryptedContent":{
"ContentType":"id-data",
"ContentEncryptionAlgorithm":{
"Algorithm":"des-ede3-cbc",
"Parameter":{
"InitialisationVector":"xxx"
}
},
"EncryptedData":"xxx"
}
}
},
"SensitiveCardData":{
"PAN":"xxx",
"ExpiryDate":"xxx",
"CCV":"xxx"
},
"PaymentToken":{
"TokenRequestedType":"xxx",
"TokenValue":"xxx"
}
}
}
},
"CustomFields": [
{
"Key": "xxx",
"Type": "xxx",
"Value": "xxx"
}
]
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Payment"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System
POIIDStringUniquely identifies the POI Terminal
PaymentRequest
Attributes
Requ.FormatDescription
SaleDataObjectSale System information attached to this payment
OperatorIDStringOnly required if different from Login Request
OperatorLanguageStringSet to "en"
ShiftNumberStringOnly required if different from Login Request
SaleReferenceIDStringMandatory for pre-authorisation and completion, otherwise optional. See SaleReferenceID
TokenRequestedTypeStringIf present, indicates which type of token should be created for this payment. See TokenRequestedType
SaleTransactionIDObject
  TransactionIDStringUnique reference for this sale ticket. Not necessarily unique per payment request; for example a sale with split payments will have a number of payments with the same TransactionID
  TimeStampStringTime of initiating the payment request on the POI System, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00"
SaleTerminalDataObjectDefine Sale System configuration. Only include if elements within have different values to those in Login Request
  TerminalEnvironmentString"Attended", "SemiAttended", or "Unattended"
  SaleCapabilitiesArrayAdvises the POI System of the Sale System capabilities. See SaleCapabilities
  TotalsGroupIdStringGroups transactions in a login session
PaymentTransactionObject
AmountsReqObjectObject which contains the various components which make up the payment amount
  CurrencyStringThree character currency code. Set to "AUD"
  RequestedAmountDecimalThe requested amount for the transaction sale items, including cash back and tip requested
  CashBackAmountDecimalThe Cash back amount. Only if cash back is included in the transaction by the Sale System
  TipAmountDecimalThe Tip amount. Only if tip is included in the transaction. Setting TipAmount to 0 will display the Tip Entry screen in the POI Terminal. Do not set TipAmount to 0 if you don't want the Tip Entry screen to be displayed in the POI terminal.
  PaidAmountDecimalSum of the amount of sale items – RequestedAmount. Present only if an amount has already been paid in the case of a split payment.
  MaximumCashBackAmountDecimalAvailable if CashBackAmount is not present. If present, the POI Terminal prompts for the cash back amount up to a maximum of MaximumCashBackAmount
  MinimumSplitAmountDecimalPresent only if the POI Terminal can process an amount less than the RequestedAmount as a split amount. Limits the minimum split amount allowed.
OriginalPOITransactionObjectIdentifies a previous POI transaction. Mandatory for Refund and Completion. See OriginalPOITransaction
  SaleIDStringSaleID which performed the original transaction
  POIIDStringPOIID which performed the original transaction
  POITransactionIDObject
   TransactionIDStringTransactionID from the original transaction
   TimeStampStringTimeStamp from the original transaction
  ReuseCardDataFlagBooleanIf 'true' the POI Terminal will retrieve the card data from file based on the PaymentToken included in the request. Otherwise the POI Terminal will read the same card again.
  ApprovalCodeStringPresent if a referral code is obtained from an Acquirer
  LastTransactionFlagBooleanSet to true to process the Last Transaction with a referral code
TransactionConditionsObjectOptional transaction configuration. Present only if any of the JSON elements within are present.
  AllowedPaymentBrandArrayRestricts the request to specified card brands. See AllowedPaymentBrand
  AcquirerIDArrayUsed to restrict the payment to specified acquirers. See AcquirerID
  DebitPreferredFlagBooleanIf present, debit processing is preferred to credit processing.
  ForceOnlineFlagBooleanIf 'true' the transaction will only be processed in online mode, and will fail if there is no response from the Acquirer.
  MerchantCategoryCodeStringIf present, overrides the MCC used for processing the transaction if allowed. Refer to ISO 18245 for available codes.
SaleItemArrayArray of SaleItem objects which represent the product basket attached to this transaction. See SaleItem for examples.
  ItemIDIntegerA unique identifier for the sale item within the context of this payment. e.g. a 0..n integer which increments by one for each sale item.
  ProductCodeStringA unique identifier for the product within the merchant, such as the SKU. For example if two customers purchase the same product at two different stores owned by the merchant, both purchases should contain the same ProductCode.
  EanUpcStringA standard unique identifier for the product. Either the UPC, EAN, or ISBN. Required for products with a UPC, EAN, or ISBN
  UnitOfMeasureStringUnit of measure of the Quantity. If this item has no unit of measure, set to "Other"
  QuantityDecimalSale item quantity based on UnitOfMeasure.
  UnitPriceDecimalPrice per sale item unit. Present if Quantity is included.
  ItemAmountDecimalTotal amount of the sale item
  TaxCodeStringType of tax associated with the sale item. Default = "GST"
  SaleChannelStringCommercial or distribution channel of the sale item. Default = "Unknown"
  ProductLabelStringa short, human readable, descriptive name of the product. For example, ProductLabel could contain the product name typically printed on the customer receipt.
  AdditionalProductInfoStringAdditional information, or more detailed description of the product item.
  ParentItemIDIntegerRequired if this item is a 'modifier' or sub-item. Contains the ItemID of the parent SaleItem
  CostBaseDecimalCost of the product to the merchant per unit
  DiscountDecimalIf applied, the amount this sale item was discounted by
  CategoriesArrayArray of categories. Top level "main" category at categories[0]. See Categories for more information.
  BrandStringBrand name - typically visible on the product packaging or label
  QuantityInStockDecimalRemaining number of this item in stock in same unit of measure as Quantity
  TagsArrayString array with descriptive tags for the product
  RestrictedBooleantrue if this is a restricted item, false otherwise. Defaults to false when field is null.
  PageURLStringURL link to the sale items product page
  ImageURLsArrayString array of images URLs for this sale item
  StyleStringStyle of the sale item
  SizeStringSize of the sale item
  ColourStringColour of the sale item
  WeightDecimalSale item weight, based on WeightUnitOfMeasure
  WeightUnitOfMeasureStringUnit of measure of the Weight.
PaymentDataObjectObject representing the payment method. Present only if any of the JSON elements within are present.  
  PaymentTypeStringDefaults to "Normal". Indicates the type of payment to process. "Normal", "Refund", or "CashAdvance". See PaymentType  
  PaymentInstrumentDataObjectObject with represents card details for token or manually enter card details. See for object structure.  
CustomFieldsArrayArray of key/type/value objects containing additional payment information

Payment response

Payment response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Payment",
"MessageType":"Response",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"PaymentResponse":{
"Response":{
"Result":"Success| Partial | Failure",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
"SaleData":{
"SaleTransactionID":{
"TransactionID":"xxx",
"TimeStamp":"xxx"
},
"SaleReferenceID":"xxxx"
},
"POIData":{
"POITransactionID":{
"TransactionID":"xxx",
"TimeStamp":"xxx"
},
"POIReconciliationID":"xxx"
},
"PaymentResult":{
"PaymentType":"xxx",
"PaymentInstrumentData":{
"PaymentInstrumentType":"xxx",
"CardData":{
"EntryMode":"xxx",
"PaymentBrand":"xxx",
"PaymentBrandID":"xxx",
"PaymentBrandLabel":"xxx",
"Account":"xxx",
"MaskedPAN":"xxxxxx…xxxx",
"PaymentToken":{
"TokenRequestedType":"xxx",
"TokenValue":"xxx",
"ExpiryDateTime":"xxx"
}
}
},
"AmountsResp":{
"Currency":"AUD",
"AuthorizedAmount":"x.xx",
"TotalFeesAmount":"x.xx",
"CashBackAmount":"x.xx",
"TipAmount":"x.xx",
"SurchargeAmount":"x.xx"
},
"OnlineFlag":true,
"PaymentAcquirerData":{
"AcquirerID":"xxx",
"MerchantID":"xxx",
"AcquirerPOIID":"xxx",
"AcquirerTransactionID":{
"TransactionID":"xxx",
"TimeStamp":"xxx"
},
"ApprovalCode":"xxx",
"ResponseCode":"xxx",
"HostReconciliationID":"xxx"
}
},
"AllowedProductCodes":[
"1",
"2",
"3"
],
"PaymentReceipt":[
{
"DocumentQualifier":"xxx",
"RequiredSignatureFlag":true,
"OutputContent":{
"OutputFormat":"XHTML",
"OutputXHTML":"xxx"
}
}
]
},
"SecurityTrailer":{...}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Payment"
MessageTypeString"Response"
ServiceIDStringMirrored from the request
SaleIDStringMirrored from the request
POIIDStringMirrored from the request

PaymentResponse

Attributes
Requ.FormatDescription
ResponseObjectObject indicating the result of the payment
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
SaleDataObject
SaleTransactionIDObject
  TransactionIDStringMirrored from the request
  TimeStampStringMirrored from the request
SaleReferenceIDStringMirrored from the request
POIDataObject
POITransactionIDObject
  TransactionIDStringA unique transaction id from the POI system
  TimeStampStringTime on the POI system, formatted as ISO8601
POIReconciliationIDStringPresent if Result is "Success" or "Partial". See POIReconciliationID
PaymentResultObjectObject related to a processed payment
PaymentTypeStringMirrored from the request
PaymentInstrumentDataObject
  PaymentInstrumentTypeString"Card" or "Mobile"
  CardDataObject
   EntryModeStringIndicates how the card was presented. See EntryMode
   PaymentBrandString(1,128)Deprecated. Use PaymentBrandId
   PaymentBrandIdString(4,4)Indicates the payment type used.
   PaymentBrandLabelString(0,256)Descriptive label of the payment type used.
   MaskedPANStringPAN masked with dots, first 6 and last 4 digits visible
   AccountStringPresent if EntryMode is "MagStripe", "ICC", or "Tapped". Indicates the card account used. See Account
   PaymentTokenObjectObject representing a token. Only present if token was requested
    TokenRequestedTypeStringMirrored from the request
    TokenValueStringThe value of the token
    ExpiryDateTimeStringExpiry of the token, formatted as ISO8601
AmountsRespObjectPresent if Result is "Success" or "Partial"
  CurrencyString"AUD"
  AuthorizedAmountDecimalAuthorised amount which could be more, or less than the requested amount
  TotalFeesAmountDecimalTotal of financial fees associated with the payment transaction if known at time of transaction
  CashBackAmountDecimalCash back paid amount
  TipAmountDecimalThe amount of any tip added to the transaction
  SurchargeAmountDecimalThe amount of any surcharge added to the transaction
OnlineFlagBooleanTrue if the transaction was processed online, false otherwise
PaymentAcquirerDataObjectData related to the response from the payment acquirer
  AcquirerIDStringThe ID of the acquirer which processed the transaction
  MerchantIDStringThe acquirer merchant ID (MID)
  AcquirerPOIIDStringThe acquirer terminal ID (TID)
  AcquirerTransactionIDObject
   TransactionIDStringThe acquirer transaction ID
   TimeStampStringTimestamp from the acquirer, formatted as ISO8601
  ApprovalCodeStringThe Acquirer Approval Code. Also referred to as the Authentication Code
  ResponseCodeStringThe Acquirer Response Code. Also referred as the PINPad response code
  STANStringThe Acquirer STAN if available
  RRNStringThe Acquirer RRN if available
  HostReconciliationIDStringIdentifier of a reconciliation period with the acquirer. This normally has a date and time component in it
AllowedProductCodesArrayPresent if ErrorCondition is "PaymentRestriction". Consists of a list of product codes corresponding to products that are purchasable with the given card. Items that exist in the basket but do not belong to this list corresponds to restricted items
PaymentReceiptArrayArray of payment receipt objects which represent receipts to be printed
  DocumentQualifierString"CashierReceipt" for a merchant receipt, otherwise "SaleReceipt"
  RequiredSignatureFlagBooleanIf true, the card holder signature is required on the merchant CashierReceipt.
  OutputContentArrayArray of payment receipt objects which represent receipts to be printed
   OutputFormatString"XHTML"
   OutputXHTMLStringThe payment receipt in XHTML format but coded in BASE64

Display

During a payment, the POI System will send status and error display requests to the Sale System, which enables the Sale System to inform the cashier of the current transaction status.

Follow the user interface guide for details on how to implement the required UI to handle display and input requests.

Display request

Display request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Display",
"MessageType":"Request",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"DisplayRequest":{
"DisplayOutput":{
"ResponseRequiredFlag":false,
"Device":"CashierDisplay",
"InfoQualify":"xxx",
"OutputContent":{
"OutputFormat":"Text",
"OutputText":{
"Text":"xxx"
}
}
}
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Display"
MessageTypeString"Request"
ServiceIDStringMirrored from payment
SaleIDStringMirrored from payment
POIIDStringMirrored from payment

DisplayRequest

Attributes
Requ.FormatDescription
DisplayOutputObjectObject which represents the display
ResponseRequiredFlagBooleanIndicates if the POI System requires a DisplayResponse to be sent for this DisplayRequest
DeviceString"CashierDisplay"
InfoQualifyString"Status" or "Error". See InfoQualify
OutputFormatString"Text"
TextStringSingle line of text to display

Display response

Display response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Display",
"MessageType":"Response",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"DisplayResponse":{
"OutputResult":[
{
"Device":"xxx",
"InfoQualify":"xxx",
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
}
}
]
},
"SecurityTrailer":{...}
}
}

The Sale System is expected to send a DisplayResponse if one or more displays in DisplayOutput have ResponseRequiredFlag set to true.

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Display"
MessageTypeString"Response"
ServiceIDStringMirrored from display request
SaleIDStringMirrored from display request
POIIDStringMirrored from display request

DisplayResponse

Attributes
Requ.FormatDescription
OutputResultObjectResponse for Device/InfoQualify pair where corresponding ResponseRequiredFlag in the DisplayRequest is set to true.
DeviceStringMirrored from display request
InfoQualifyStringMirrored from display request
ResultString"Success", "Partial", or "Failure". See Result.
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.

Input

warning

The Input UI elements are not currently available, and will be supported by a future Unify release. Support for these elements by the Sale System is optional.

During a payment, the POI System will input requests to the Sale System if cashier interaction is required (e.g. signature approved yes/no)

Follow the user interface guide for details on how to implement the required UI to handle display and input requests.

Input request

Input request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Input",
"MessageType":"Request",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"InputRequest":{
"DisplayOutput":{
"Device":"CashierDisplay",
"InfoQualify":"POIReplication",
"OutputContent":{
"OutputFormat":"Text",
"OutputText":{
"Text":"xxx"
}
},
"MenuEntry":[
{
"OutputFormat":"Text",
"OutputText":{
"Text":"xxx"
}
}
]
},
"InputData":{
"Device":"CashierInput",
"InfoQualify":"xxx",
"InputCommand":"xxx",
"MaxInputTime":"xxx",
"MinLength":"xxx",
"MaxLength":"xxx",
"MaskCharactersFlag":"true or false"
}
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Input"
MessageTypeString"Request"
ServiceIDStringMirrored from payment request
DeviceIDStringUnique message identifier
SaleIDStringMirrored from payment request
POIIDStringMirrored from payment request

InputRequest

Attributes
Requ.FormatDescription
DisplayOutputObjectInformation to display and the way to process the display.
DeviceString"CashierDisplay"
InfoQualifyString"POIReplication". See InfoQualify
OutputContentObject
  OutputFormatString"Text"
  OutputTextObjectWrapper for text content
   TextStringSingle line of text. e.g. "Signature Ok?", "Merchant Password", "Select Account Type"
MenuEntryArrayConditional. Array of items to be presented as a menu. Only present if InputCommand = "GetMenuEntry"
  OutputFormatString"Text"
  TextStringOne of the selection String items for the cashier to select from. For example: "Savings", "Cheque" and "Credit" for an account type selection.
InputDataObjectInformation related to an Input request
DeviceString"CashierInput"
InfoQualifyString"Input" or "CustomerAssistance". See InfoQualify
InputCommandString"GetConfirmation", "Password", "TextString", "DigitString", "DecimalString", or "GetMenuEntry". See InputCommand
MaxInputTimeNumberThe maximum number of seconds allowed for providing input. Note the Sale Terminal needs to abort the Input process if it receives a DisplayRequest or InputRequest whilst waiting on input from the Cashier.
MinLengthNumberThe minimum number of characters allowed for entry. Present if InputCommand = "Password", "TextString", "DigitString", or "DecimalString"
MaxLengthNumberThe maximum number of characters allowed for entry. Present if InputCommand = "Password", "TextString", "DigitString", or "DecimalString"
MaskCharactersFlagBooleanIf true, input should be masked with '*'. Present if InputCommand = "Password"

Input response

Input response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Input",
"MessageType":"Response",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"InputResponse":{
"OutputResult":{
"Device":"CashierDisplay",
"InfoQualify":"POIReplication",
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
}
},
"InputResult":{
"Device":"CashierInput",
"InfoQualify":"xxx",
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
"Input":{
"InputCommand":"xxx",
"ConfirmedFlag":"true or false",
"Password":"xxx",
"MenuEntryNumber":"xxx"
}
}
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Input"
MessageTypeString"Response"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
DeviceIDStringMirrored from input request
SaleIDStringMirrored from input request
POIIDStringMirrored from input request

InputResponse

Attributes
Requ.FormatDescription
OutputResultObjectPresent if DisplayOutput is present in the request
DeviceStringMirrored from input request
InfoQualifyStringMirrored from input request
ResponseObject
  ResultString"Success", "Partial", or "Failure". See Result.
  ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
  AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
InputResultObjectInformation related to the result the input
DeviceStringMirrored from input request
InfoQualifyStringMirrored from input request
ResponseObject
  ResultString"Success", "Partial", or "Failure". See Result.
  ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
  AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
InputObject
  InputCommandStringMirrored from input request
  ConfirmedFlagBooleanResult of GetConfirmation input request. Present if InputCommand = "GetConfirmation"
  PasswordStringPassword entered by the Cashier. Mandatory, if InputCommand is "Password". Not allowed, otherwise
  MenuEntryNumberNumberA number from 1 to n, when n is total number of objects in MenuEntry of InputRequest. Mandatory, if InputCommand is "GetMenuEntry". Not allowed, otherwise
  TextInputStringValue entered by the Cashier. Mandatory, if InputCommand is "TextString" or "DecimalString". Not allowed, otherwise
  DigitInputStringValue entered by the Cashier. Mandatory, if InputCommand is "DigitInput". Not allowed, otherwise

Print

During a payment, the POI System may send print requests to the Sale System if a receipt is to be printed before the payment response can be finalised (e.g. when a signature is required).

In this case the Sale System should examine the properties in the print request and print the receipt accordingly.

The final payment receipt, which is to be included in the Sale receipt, is returned in the payment response.

Print request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Print",
"MessageType":"Request",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"PrintRequest":{
"PrintOutput":{
"DocumentQualifier":"CashierReceipt",
"IntegratedPrintFlag":false,
"RequiredSignatureFlag":true,
"OutputContent":{
"OutputFormat":"XHTML",
"OutputXHTML":"xxxx"
},
},
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Print"
MessageTypeString"Request"
ServiceIDStringMirrored from payment request
DeviceIDStringUnique message identifier
SaleIDStringMirrored from payment request
POIIDStringMirrored from payment request

PrintRequest

Attributes
Requ.FormatDescription
PrintOutputObject
  DocumentQualifierString"CashierReceipt" for a merchant receipt, otherwise "SaleReceipt"
  IntegratedPrintFlagBooleanTrue if the receipt should be included with the Sale receipt, false if the receipt should be printed now and paper cut (e.g. for a signature receipt)
  RequiredSignatureFlagBooleanIf true, the card holder signature is required on the merchant CashierReceipt.
  OutputContentArrayArray of payment receipt objects which represent receipts to be printed
   OutputFormatString"XHTML"
   OutputXHTMLStringThe payment receipt in XHTML format but coded in BASE64

Print response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Device",
"MessageCategory":"Print",
"MessageType":"Response",
"ServiceID":"xxx",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"PrintResponse":{
"DocumentQualifier":"CashierReceipt",
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Device"
MessageCategoryString"Print"
MessageTypeString"Response"
ServiceIDStringMirrored from print request
DeviceIDStringMirrored from print request
SaleIDStringMirrored from print request
POIIDStringMirrored from print request

PrintResponse

Attributes
Requ.FormatDescription
DocumentQualifierStringMirrored from print request
ResponseObject
  ResultString"Success", "Partial", or "Failure". See Result.
  ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
  AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.

Transaction status

A transaction status request can be used to obtain the status of a previous transaction. Required for error handling.

Transaction status request

Transaction status request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"TransactionStatus",
"MessageType":"Request",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxxx"
},
"TransactionStatusRequest":{
"MessageReference":{
"MessageCategory":"xxx",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
}
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"TransactionStatus"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUniquely identifies the Sale System
POIIDStringUniquely identifies the POI Terminal

TransactionStatusRequest

Attributes
Requ.FormatDescription
MessageReferenceObjectIdentification of a previous POI transaction. Present if it contains any data.
MessageCategoryString"Payment"
ServiceIDStringThe ServiceID of the transaction to retrieve the status of. If not included the last payment status is returned.
SaleIDStringThe SaleID of the transaction to retrieve the status of. Only required if different from the SaleID provided in the MessageHeader
POIIDStringThe POIID of the transaction to retrieve the status of. Only required if different from the POIID provided in the MessageHeader

Transaction status response

Transaction status response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"TransactionStatus",
"MessageType":"Response",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"TransactionStatusResponse":{
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
"MessageReference":{
"MessageCategory":"xxx",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"RepeatedMessageResponse":{
"MessageHeader":{...},
"RepeatedResponseMessageBody":{
"PaymentResponse":{...},
"ReversalResponse":{...}
}
}
}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"TransactionStatus"
MessageTypeString"Response"
ServiceIDStringMirrored from request
SaleIDStringMirrored from request
POIIDStringMirrored from request

TransactionStatusResponse

Attributes
Requ.FormatDescription
ResponseObjectObject indicating the result of the payment
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
MessageReferenceObjectIdentification of a previous POI transaction. Present if Result is "Success", or Result is "Failure" and ErrorCondition is "InProgress"
MessageCategoryStringMirrored from request
ServiceIDStringMirrored from request, or ServiceID of last transaction if not present in request.
SaleIDStringMirrored from request, but only if present in the request
POIIDStringMirrored from request, but only if present in the request
RepeatedMessageResponseObjectPresent if Result is "Success"
MessageHeaderObjectMessageHeader of the requested payment
PaymentResponseObjectPaymentResponse of the requested payment

Abort transaction

The Sale System can send an abort transaction message to request cancellation of the in-progress transaction.

tip

Cancel transaction is a "request to cancel". Cancellation of the transaction is not guaranteed. There are a number of instances where cancellation is not possible (for example, when the payment has already completed).

After sending a cancel transaction request, the Sale System should always wait for the payment/card acquisition response and validate the success of the sale by checking the Result property.

Abort transaction request

Abort transaction request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Abort",
"MessageType":"Request",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"AbortRequest":{
"MessageReference":{
"MessageCategory":"xxx",
"ServiceID":"xxxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"AbortReason":"xxx"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Abort"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUnique identifier for the Sale System
POIIDStringUniquely identifies the POI Terminal

AbortRequest

Attributes
Requ.FormatDescription
MessageReferenceObjectIdentification of a POI transaction
MessageCategoryString"Payment" or "CardAcquisition"
ServiceIDStringThe ServiceID of the transaction to cancel
SaleIDStringThe SaleID of the transaction to cancel. Only required if different from the SaleID provided in the MessageHeader
POIIDStringThe POIID of the transaction to cancel. Only required if different from the POIID provided in the MessageHeader
AbortReasonStringAny text describing the reason for cancelling the transaction. For example, "User Cancel"

Abort transaction response

Once an abort transaction request has been sent, please continue to wait for the payment response.

If the transaction is successfully aborted, a payment response is returned with Result = "Failure" and ErrorCondition = "Aborted".

If the transaction cannot be aborted, a normal payment response (Result = "Success") is sent back in time.

However, if the abort transaction request message contains an invalid data (e.g. message format error) or if the referenced transaction cannot be not found (e.g. due to an incorrect ServiceID value), an Event Notification will be returned.

Abort transaction response

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Event",
"MessageCategory":"Event",
"MessageType":"Notification",
"DeviceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"EventNotification":{
"TimeStamp":"xxx",
"EventToNotify":"xxx",
"EventDetails":"xxx"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Event"
MessageCategoryString"Event"
MessageTypeString"Notification"
DeviceIDStringUnique message identifier
SaleIDStringMirrored from payment request
POIIDStringMirrored from payment request

EventNotification

Attributes
Requ.FormatDescription
TimeStampStringTime of the event on the POI System, formatted as ISO8601
EventToNotifyString"Reject" if the abort request cannot be accepted (e.g. message format error, ServiceId not found). "CompletedMessage" if payment has already completed.
EventDetailsStringExtra detail on the reason for the event

Reconciliation

Reconciliation request

Reconciliation request

{
"SaleToPOIRequest":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Reconciliation",
"MessageType":"Request",
"ServiceID":"xxxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"ReconciliationRequest":{
"ReconciliationType":"xxx",
"POIReconciliationID":"xxx"
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Reconciliation"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUnique identifier for the Sale System
POIIDStringUniquely identifies the POI Terminal

ReconciliationRequest

Attributes
Requ.FormatDescription
ReconciliationTypeString"SaleReconciliation" to close the current period, "PreviousReconciliation" to request the result of a previous reconciliation
POIReconciliationIDStringPresent if ReconciliationType is "PreviousReconciliation". See POIReconciliationID

Reconciliation response

Reconciliation response

{
"SaleToPOIResponse":{
"MessageHeader":{
"MessageClass":"Service",
"MessageCategory":"Reconciliation",
"MessageType":"Response",
"ServiceID":"xxx",
"SaleID":"xxx",
"POIID":"xxx"
},
"ReconciliationResponse":{
"Response":{
"Result":"xxx",
"ErrorCondition":"xxx",
"AdditionalResponse":"xxx"
},
"ReconciliationType":"xxx",
"POIReconciliationID":"xxx",
"TransactionTotals":[
{
"PaymentInstrumentType":"xxx",
"CardBrand":"xxx",
"OperatorID":"xxx",
"ShiftNumber":"xxx",
"TotalsGroupID":"xxx",
"PaymentCurrency":"AUD",
"PaymentTotals":[
{
"TransactionType":"xxx",
"TransactionCount":"xxx",
"TransactionAmount":"0.00",
"TipAmount":"0.00",
"SurchargeAmount":"0.00"
}
]
}
]
},
"SecurityTrailer":{...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"Reconciliation"
MessageTypeString"Response"
DeviceIDStringUnique message identifier
SaleIDStringMirrored from payment request
POIIDStringMirrored from payment request

ReconciliationResponse

Attributes
Requ.FormatDescription
ResponseObjectObject indicating the result of the login
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
ReconciliationTypeStringMirrored from request
POIReconciliationIDStringPresent if Result is "Success". The ReconciliationID of the period requested
TransactionTotalsArrayPresent if Result is "Success". An array of totals grouped by card brand, then operator, then shift, then TotalsGroupID, then payment currency.
PaymentInstrumentTypeString"Card" (card payment) or "Mobile" (phone/QR code payments)
CardBrandStringA card brand used during this reconciliation period
OperatorIDStringAn operator id used during this reconciliation period
ShiftNumberStringA shift number used during the reconciliation period
TotalsGroupIDStringA custom grouping of transactions as defined by the Sale System
PaymentCurrencyString"AUD"
PaymentTotalsArrayAn array [0..10] of totals grouped by transaction payment type. Present if both TransactionCount and TransactionAmount are not equal to zero
  TransactionTypeStringTransaction type for this payment. See TransactionType
  TransactionCountStringThe number of transactions for the transaction type for the current grouping of transactions
  TransactionAmountNumberThe total amount of transactions for the transaction type for the current grouping of transactions

Card acquisition

The card acquisition request allows the Sale System to tokenise a card which can be used in future payment requests.

Card acquisition request

Card acquisition request

{
"SaleToPOIRequest": {
"MessageHeader": {
"MessageClass": "Service",
"MessageCategory": "CardAcquisition",
"MessageType": "Request",
"ServiceID": "xxx",
"SaleID": "xxx",
"POIID": "xxx"
},
"CardAcquisitionRequest": {
"SaleData": {
"OperatorID": "xxx",
"OperatorLanguage": "en",
"ShiftNumber": "xxx",
"CustomerLanguage": "en",
"SaleTransactionID": {
"TransactionID": "xxx",
"TimeStamp": "xxx"
},
"SaleTerminalData": {
"TerminalEnvironment": "xxx",
"SaleCapabilities": ["xxx", "xxx", "xxx", …]
},
"TokenRequestedType": "Customer",
},
"CardAcquisitionTransaction": {
"AllowedPaymentBrand": ["xxx", "xxx", "xxx", …],
"ForceEntryMode": "xxx"
}
},
"SecurityTrailer": { ... }
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"CardAcquisition"
MessageTypeString"Request"
ServiceIDStringA unique value which will be mirrored in the response. See ServiceID.
SaleIDStringUnique identifier for the Sale System
POIIDStringUniquely identifies the POI Terminal

CardAcquisitionRequest

Attributes
Requ.FormatDescription
SaleDataObjectObject Sale System information attached to this payment
OperatorIDStringOnly required if different from Login Request
OperatorLanguageStringSet to "en"
ShiftNumberStringOnly required if different from Login Request
CustomerLanguageStringSet to "en" for English
TokenRequestedTypeString"Customer"
SaleTransactionIDObject
  TransactionIDStringUnique reference for this sale ticket
  TimeStampStringTime of initiating the request on the POI System, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00"
SaleTerminalDataObjectDefine Sale System configuration. Only include if elements within have different values to those in Login Request
  TerminalEnvironmentString"Attended", "SemiAttended", or "Unattended"
  SaleCapabilitiesArrayAdvises the POI System of the Sale System capabilities. See SaleCapabilities
CardAcquisitionTransactionObjectPresent if any of the JSON elements within are present
  AllowedPaymentBrandArrayRestricts the request to specified card brands. See AllowedPaymentBrand
  ForceEntryModeStringIf present, restricts card presentment to the specified type. See ForceEntryMode

Card acquisition response

Card acquisition response

{
"SaleToPOIResponse": {
"MessageHeader": {
"MessageClass": "Service",
"MessageCategory": "CardAcquisition",
"MessageType": "Response",
"ServiceID": "xxx",
"SaleID": "xxx",
"POIID": "xxx"
},
"CardAcquisitionResponse": {
"Response": {
"Result": "xxx",
"ErrorCondition": "xxx",
"AdditionalResponse": "xxx"
},
"SaleData": {
"SaleTransactionID": {
"TransactionID": "xxx",
"TimeStamp": "xxx"
},
},
"POIData": {
"POITransactionID": {
"TransactionID": "xxx",
"TimeStamp": "xxx"
},
},
"PaymentInstrumentData": {
"PaymentInstrumentType": "xxx",
"CardData": {
"MaskedPAN": "xxxxxx......xxxx",
"EntryMode": "xxx"
},
"PaymentToken": {
"TokenRequestedType": "xxx",
"TokenValue": "xxx",
"ExpiryDateTime": "xxx"
}
}
},
"SecurityTrailer": {...}
}
}

MessageHeader

Attributes
Requ.FormatDescription
MessageClassString"Service"
MessageCategoryString"CardAcquisition"
MessageTypeString"Response"
DeviceIDStringUnique message identifier
SaleIDStringMirrored from payment request
POIIDStringMirrored from payment request

CardAcquisitionResponse

Attributes
Requ.FormatDescription
ResponseObjectObject indicating the result of the login
ResultStringIndicates the result of the response. Possible values are "Success" and "Failure"
ErrorConditionStringIndicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values.
AdditionalResponseStringProvides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values.
SaleDataObject
SaleTransactionIDObject
  TransactionIDStringMirrored from the request
  TimeStampStringMirrored from the request
SaleReferenceIDStringMirrored from the request
POIDataObject
POITransactionIDObject
  TransactionIDStringA unique transaction id from the POI system
  TimeStampStringTime on the POI system, formatted as ISO8601
PaymentInstrumentDataObjectObject with represents card details for token or manually enter card details.
PaymentInstrumentTypeStringDefaults to "Card". Indicates the card source for the payment. See PaymentInstrumentType
CardDataObject
EntryModeStringOnly present if PaymentInstrumentType is "Card". "File" if a Payment Token is used, and "Keyed" for a Card Not Present transaction.
MaskedPANStringPAN masked with dots, first 6 and last 4 digits visible
PaymentTokenObjectOnly present if EntryMode is "File". Object with identifies the payment token.
  TokenRequestedTypeString"Transaction" or "Customer". Must match the type of token recorded in the POI System.
  TokenValueStringToken previously returned from the POI System in the payment, or card acquisition response

Error handling

When the Sale System sends a request, it will receive a matching response. For example, if the Sale System sends a payment request it will receive a payment response.

The Sale System should verify the result of the transaction by checking the Response.Result field in the response.

  • If the Response.Result is "Success", the payment transaction was successful.
  • If the Response.Result is "Failure", the payment transaction failed. The Sale System may check for any errors specified in the Response.ErrorCondition field in the same response message and handle the error accordingly.

In the event the Sale System does not receive a response (for example, due to network error, timeout, or any other unexpected error) it must enter error handling.

Error handling due to network error, timeout, or any other unexpected error is outlined in the diagram below.

  1. Cashier initiates a payment.
  2. Sale System sets txn_in_progress flag in local persistent storage.
  3. Sale System sends a payment request. The timeout period for waiting for a response is 60 seconds. This should reset every time a response (for example, display request) is received.
  4. Sale System saves message reference details in local persistent storage.
  5. Network error/timeout/any other unexpected error occurs.
  6. Sale System awaits Internet availability.
  7. Sale System enters error handling:
    1. Sale System sends an abort transaction request.

      • Sale System must set the AbortRequest.AbortReason field to describe the reason for cancelling the transaction.
      AbortRequest.AbortReason valueDescription
      Network ErrorNetwork related error occured.
      TimeoutNo response from the host after the timeout period.
      Message Format ErrorAn error occured while converting a message.
      Invalid DataAn invalid data was received.
      Other ExceptionAn unwanted exception has occured.
    2. For a maximum of 90 seconds, the Sale System should perform the below in a loop:

      1. Sale System sends a transaction status request and awaits a transaction status response
      2. Sale System handles the transaction status response:
      Response.Result valueResponse.ErrorCondition valueDescription
      SuccessThe transaction was successful.
      The transaction result will be contained in RepeatedMessageResponse.
      The RepeatedMessageResponse will contain the payment response.
      Failure"InProgress"The Terminal is still processing the payment.
      The Sale System should wait for 5 seconds and send a transaction status request again.
      Failureany other value aside from "InProgress"The payment failed.
      The Sale System can exit the loop.
    3. If the Sale System is unable retrieve a result within 90 seconds:

      • Sale System must display UI to ask Cashier to check the transaction history in the POI terminal.
      • Cashier confirms in the Sale System whether the payment transaction succeeded or failed basing on the transaction record in the transaction history in the POI terminal.
    4. Sale System clears the message reference details in the local persistent storage.

    5. Sale System clears the txn_in_progress flag in the local persistent storage.

  8. Sale System proceeds with its successful/failed transaction processing, depending on the transaction result.

Power failure handling

The Sale System can handle a power failure by checking a local transaction status on start up.

  1. Cashier initiates a payment.
  2. Sale System sets txn_in_progress flag in local persistent storage.
  3. Sale System sends a payment request
  4. Sale System saves message reference details in local persistent storage.
  5. Sale System power failure occurs.
  6. Sale System start up after power failure.
  7. Sale System checks if txn_in_progress flag is set. If so, access and use message reference details and enter error handling.
    1. Sale System sends an abort transaction request.
      • Sale System must set the AbortRequest.AbortReason field to "Power Failure".
    2. For a maximum of 90 seconds, Sale System enters loop to check transaction status.
    3. If the Sale System is unable retrieve a result within 90 seconds:
      • Sale System must display UI to ask Cashier to check the transaction history in the POI terminal.
      • Cashier confirms in the Sale System whether the payment transaction succeeded or failed basing on the transaction record in the transaction history in the POI terminal.
    4. Sale System clears the message reference details in the local persistent storage.
    5. Sale System clears the txn_in_progress flag in the local persistent storage.
  8. Sale System proceeds with its successful/failed transaction processing, depending on the transaction result.