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 | Description | Location |
|---|---|---|
| .Net | .Net NuGet package | on Nuget |
| Source Code | on GitHub | |
| Demo Application implementing the sdk | on GitHub | |
| Java | Source Code | on GitHub |
| Library | on Maven Central | |
| Demo Application implementing the sdk | on GitHub | |
| Android Demo Application implementing the sdk | on GitHub | |
| Swift Framework (for iOS) | Source Code | on GitHub |
| Demo Application implementing the sdk | on GitHub | |
| FusionCloudIOS cocoapod (for iOS) | Source Code | on 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:5000for 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
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:
- String text string of variable length
- Boolean true or false
- Number defined in this document as either
integerordecimal. 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. - Null optional types can be represented as null
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:
- A MessageHeader object.
- A Payload object of variable types.
- 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. | Format | Description |
|---|---|---|---|
| ProtocolVersion | ✔ | String | Version of the Sale to POI protocol specifications. Set to "3.1-dmg". Present when MessageCategory is "Login" otherwise absent. |
| MessageClass | ✔ | String | Informs the receiver of the class of message. Possible values are "Service", "Device", or "Event" |
| MessageCategory | ✔ | String | Indicates the category of message. Possible values are "CardAcquisition", "Display", "Login", "Logout", "Payment" |
| MessageType | ✔ | String | Type of message. Possible values are "Request", "Response", or "Notification" |
| ServiceID | ✔ | String | A unique value which will be mirrored in the response. See ServiceID. |
| SaleID | ✔ | String | Uniquely identifies the Sale System. The SaleID is provided by DataMesh, and must match the SaleID configured in Unify. |
| POIID | ✔ | String | Uniquely 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. | Format | Description |
|---|---|---|---|
| ContentType | ✔ | String | Set to "id-ctauthData" |
| AuthenticatedData | ✔ | Object | |
| Version | ✔ | String | Set to "v0" |
| Recipient | ✔ | Object | |
| KEK | ✔ | Object | |
| Version | ✔ | String | Set to "v4" |
| KEKIdentifier | ✔ | Object | |
| KeyIdentifier | ✔ | String | "SpecV2TestMACKey" for test environment, and "SpecV2ProdMACKey" for production |
| KeyVersion | ✔ | String | An incrementing value. Either a counter or date formatted as YYYYMMDDHHmmss.mmm. See KeyVersion |
| KeyEncryptionAlgorithm | ✔ | Object | |
| Algorithm | ✔ | String | Set to "des-ede3-cbc". |
| EncryptedKey | ✔ | String | A double length 3DES key. See EncryptedKey |
| MACAlgorithm | ✔ | Object | |
| Algorithm | ✔ | String | Set to "id-retail-cbc-mac-sha-256" |
| EncapsulatedContent | ✔ | Object | |
| ContentType | ✔ | String | Set to "iddata" |
| MAC | ✔ | String | MAC of message content. See MAC |
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.
- If a login hasn't already been sent for the session, send a login request as detailed in login request
- Ensure "PrinterReceipt" is included in SaleTerminalData.SaleCapabilities if payment receipts are to be redirected to the Sale System
- Await the a login response and
- Ensure the ServiceID in the result matches the request
- Record the POISerialNumber to be sent in subsequent login requests
- Send a payment request, including all required fields, as detailed in payment request
- Set PaymentData.PaymentType to "Normal"
- Set the purchase amount in PaymentTransaction.AmountsReq.RequestedAmount
- Set SaleTransactionID to a unique value for the sale on this Sale System
- Populate the SaleItem array with the product basket for the transaction
- If configured in SaleTerminalData.SaleCapabilities, handle any display, print, and input events the POI System sends
- The expected user interface handling is outlined in user interface
- The expected payment receipt handling is outlined in receipt printing
- Await the payment response
- Ensure the ServiceID in the result matches the request
- Check Response.Result for the transaction result
- If Response.Result is "Success", record the following to enable future matched refunds: SaleID, POIID, and POITransactionID
- Check PaymentResult.AmountsResp.AuthorizedAmount (it may not equal the
RequestedAmountin the payment request) - If the Sale System is handling tipping or surcharge, check the PaymentResult.AmountsResp.TipAmount, and PaymentResult.AmountsResp.SurchargeAmount
- Print the receipt contained in
PaymentReceipt
- Implement error handling outlined in error handling
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.
- If a login hasn't already been sent for the session, send a login request as detailed in login request
- Ensure "PrinterReceipt" is included in SaleTerminalData.SaleCapabilities if payment receipts are to be redirected to the Sale System
- Await the a login response and
- Ensure the ServiceID in the result matches the request
- Record the POISerialNumber to be sent in subsequent login requests
- Send a payment request, including all required fields, as detailed in payment request
- Set PaymentData.PaymentType to "Refund"
- Set the refund amount in PaymentTransaction.AmountsReq.RequestedAmount
- Set SaleTransactionID to a unique value for the sale on this Sale System
- If refunding a previous purchase, set the following fields in PaymentTransaction.OriginalPOITransaction
- Set SaleID to the SaleID of the original purchase payment request
- Set POIID to the POIID of the original purchase payment request
- Set POITransactionID to the value returned in POIData.POITransactionID of the original purchase payment response
- The product basket is not required for refunds
- If configured in SaleTerminalData.SaleCapabilities, handle any display, print, and input events the POI System sends
- The expected user interface handling is outlined in user interface
- The expected payment receipt handling is outlined in receipt printing
- Await the payment response
- Ensure the ServiceID in the result matches the request
- Check Response.Result for the transaction result
- Check PaymentResult.AmountsResp.AuthorizedAmount (it may not equal the
RequestedAmountin the payment request) - Print the receipt contained in
PaymentReceipt
- Implement error handling outlined in error handling
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 Language | Method Name | GitHub File | GitHub Repository |
|---|---|---|---|
| C# .Net | DoPayment | MainWindow.xaml.cs | sdk-dotnet-testpos |
| Java | doPayment | FusionClientDemo.java | fusioncloud-sdk-java-demo |
| Swift | doPayment | ViewController.swift | fusioncloud-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. | Format | Description |
|---|---|---|---|
| ProtocolVersion | ✔ | String | "3.1-dmg" |
| MessageClass | ✔ | String | "Service" |
| MessageCategory | ✔ | String | "Login" |
| MessageType | ✔ | String | "Request" |
| ServiceID | ✔ | String | A unique value which will be mirrored in the response. See ServiceID. |
| SaleID | ✔ | String | Uniquely identifies the Sale System |
| POIID | ✔ | String | Uniquely 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. | Format | Description |
|---|---|---|---|
| DateTime | ✔ | String | Current Sale System time, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00" |
| SaleSoftware | ✔ | Object | Object containing Sale System identification |
| ProviderIdentification | ✔ | String | The name of the company supplying the Sale System. Provided by DataMesh. |
| ApplicationName | ✔ | String | The name of the Sale System application. Provided by DataMesh. |
| SoftwareVersion | ✔ | String | The software version of the Sale System. Must be the software version of the current build. |
| CertificationCode | ✔ | String | Certification code for this Sale System. Provided by DataMesh. |
| SaleTerminalData | ✔ | Object | Object containing Sale System configuration |
| TerminalEnvironment | ✔ | String | "Attended", "SemiAttended", or "Unattended" |
| SaleCapabilities | ✔ | Array | Advises the POI System of the Sale System capabilities. See SaleCapabilities |
| TotalsGroupId | String | Groups transactions in a login session | |
| OperatorLanguage | String | Operator language. Set to 'en' | |
| OperatorId | String | Groups transactions under this operator id | |
| ShiftNumber | String | Groups transactions under this shift number | |
| POISerialNumber | String | The POISerialNumber from the last login response, or absent if this is the first login | |
| Pairing | Boolean | True 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. | Format | Description |
|---|---|---|---|
| ProtocolVersion | ✔ | String | "3.1-dmg" |
| MessageClass | ✔ | String | "Service" |
| MessageCategory | ✔ | String | "Login" |
| MessageType | ✔ | String | "Response" |
| ServiceID | ✔ | String | Mirrored from the request |
| SaleID | ✔ | String | Mirrored from the request |
| POIID | ✔ | String | Mirrored from the request |
LoginResponse
Attributes | Requ. | Format | Description |
|---|---|---|---|
| Response | ✔ | Object | Object indicating the result of the login |
| Result | ✔ | String | Indicates the result of the response. Possible values are "Success" and "Failure" |
| ErrorCondition | String | Indicates the reason an error occurred. Only present when Result is "Failure". See ErrorCondition for more information on possible values. | |
| AdditionalResponse | String | Provides additional error information. Only present when Result is "Failure". See AdditionalResponse for more information on possible values. | |
| POISystemData | Object | Only present when Result is "Success" | |
| DateTime | ✔ | String | Time on the POI System, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00" |
| TokenRequestStatus | ✔ | Boolean | True if POI tokenisation of PANs is available and usable |
| POITerminalData | ✔ | Object | Object representing the POI Terminal |
| TerminalEnvironment | ✔ | String | Mirrored from the request |
| POICapabilities | ✔ | Array | An array of strings which reflect the hardware capabilities of the POI Terminal. "MagStripe", "ICC", and "EMVContactless" |
| GenericProfile | ✔ | String | Set to "Custom" |
| POISerialNumber | ✔ | String | If POIID is "POI Server", then a virtual POI Terminal Serial Number. Otherwise the serial number of the POI Terminal |
| POIStatus | ✔ | String | Object representing the current status of the POI Terminal |
| GlobalStatus | ✔ | String | The 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 |
| SecurityOKFlag | ✔ | Boolean | True if the security module is present |
| PEDOKFlag | ✔ | Boolean | True if PED is available and usable for PIN entry |
| CardReaderOKFlag | ✔ | Boolean | True if card reader is available and usable |
| PrinterStatus | ✔ | String | Indicates terminal printer status. Possible values are "OK", "PaperLow", "NoPaper", "PaperJam", "OutOfOrder" |
| CommunicationOKFlag | ✔ | Boolean | True if terminal's communication is available and usable |
| FraudPreventionFlag | ✔ | Boolean | True 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. | Format | Description |
|---|---|---|---|
| MessageClass | ✔ | String | "Service" |
| MessageCategory | ✔ | String | "Logout" |
| MessageType | ✔ | String | "Request" |
| ServiceID | ✔ | String | A unique value which will be mirrored in the response. See ServiceID. |
| SaleID | ✔ | String | Uniquely identifies the Sale System |
| POIID | ✔ | String | Uniquely identifies the POI Terminal |
LogoutRequest
Attributes | Requ. | Format | Description |
|---|---|---|---|
| MaintenanceAllowed | Boolean | Indicates 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. | Format | Description |
|---|---|---|---|
| MessageClass | ✔ | String | "Service" |
| MessageCategory | ✔ | String | "Logout" |
| MessageType | ✔ | String | "Response" |
| ServiceID | ✔ | String | A unique value which will be mirrored in the response. See ServiceID. |
| SaleID | ✔ | String | Uniquely identifies the Sale System |
| POIID | ✔ | String | Uniquely identifies the POI Terminal |
LogoutResponse
Attributes | Requ. | Format | Description |
|---|---|---|---|
| Response | ✔ | Object | Object which represents the result of the response |
| Result | ✔ | String | Indicates the result of the response. Possible values are "Success" and "Failure" |
| ErrorCondition | String | Indicates 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. | |
| AdditionalResponse | String | Provides 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. | Format | Description |
|---|---|---|---|
| MessageClass | ✔ | String | "Service" |
| MessageCategory | ✔ | String | "Payment" |
| MessageType | ✔ | String | "Request" |
| ServiceID | ✔ | String | A unique value which will be mirrored in the response. See ServiceID. |
| SaleID | ✔ | String | Uniquely identifies the Sale System |
| POIID | ✔ | String | Uniquely identifies the POI Terminal |
PaymentRequest
Attributes | Requ. | Format | Description |
|---|---|---|---|
| SaleData | ✔ | Object | Sale System information attached to this payment |
| OperatorID | String | Only required if different from Login Request | |
| OperatorLanguage | String | Set to "en" | |
| ShiftNumber | String | Only required if different from Login Request | |
| SaleReferenceID | String | Mandatory for pre-authorisation and completion, otherwise optional. See SaleReferenceID | |
| TokenRequestedType | String | If present, indicates which type of token should be created for this payment. See TokenRequestedType | |
| SaleTransactionID | ✔ | Object | |
| TransactionID | ✔ | String | Unique 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 |
| TimeStamp | ✔ | String | Time of initiating the payment request on the POI System, formatted as ISO8601 DateTime. e.g. "2019-09-02T09:13:51.0+01:00" |
| SaleTerminalData | Object | Define Sale System configuration. Only include if elements within have different values to those in Login Request | |
| TerminalEnvironment | String | "Attended", "SemiAttended", or "Unattended" | |
| SaleCapabilities | Array | Advises the POI System of the Sale System capabilities. See SaleCapabilities | |
| TotalsGroupId | String | Groups transactions in a login session | |
| PaymentTransaction | ✔ | Object | |
| AmountsReq | ✔ | Object | Object which contains the various components which make up the payment amount |
| Currency | ✔ | String | Three character currency code. Set to "AUD" |
| RequestedAmount | ✔ | Decimal | The requested amount for the transaction sale items, including cash back and tip requested |
| CashBackAmount | Decimal | The Cash back amount. Only if cash back is included in the transaction by the Sale System | |
| TipAmount | Decimal | The 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. | |
| PaidAmount | Decimal | Sum of the amount of sale items – RequestedAmount. Present only if an amount has already been paid in the case of a split payment. | |
| MaximumCashBackAmount | Decimal | Available if CashBackAmount is not present. If present, the POI Terminal prompts for the cash back amount up to a maximum of MaximumCashBackAmount | |
| MinimumSplitAmount | Decimal | Present only if the POI Terminal can process an amount less than the RequestedAmount as a split amount. Limits the minimum split amount allowed. | |
| OriginalPOITransaction | Object | Identifies a previous POI transaction. Mandatory for Refund and Completion. See OriginalPOITransaction | |
| SaleID | ✔ | String | SaleID which performed the original transaction |
| POIID | ✔ | String | POIID which performed the original transaction |
| POITransactionID | ✔ | Object | |
| TransactionID | ✔ | String | TransactionID from the original transaction |
| TimeStamp | ✔ | String | TimeStamp from the original transaction |