Split the screen on the payment terminal to show data while collecting input.
You can vertically split a landscape display of a payment terminal, such as the M400. This allows you to show data on one side of the screen and collect input from a shopper on the other side of the screen. like taking a survey. For example, show a shopper receipt on one side, and take a survey on the other side.
You can send two display requests at the same time. But you can only send one input request next to a display request.
This feature will be available from software version 1.90.
How it works
You specify in an XML file what data you want to show. You convert that XML file to Base64.
You will pass the Base64-encoded string inside the DisplayOutput.OutputContent.OutputXHTML of the DisplayRequest.
You specify in an XML file what data you want to collect. You convert that XML file to Base64.
You will pass the Base64-encoded string inside the DisplayOutput.OutputContent.OutputXHTML of the InputRequest.
You send both requests simultaneously. If you don't send both requests at the same time, the terminal screen shows the first request on one side. The other side shows a black background until you send the second request.
If input is collected, you receive the data inside InputResult.Input of the InputResponse.
You then pass the relevant data from InputResult.Input to your system for validation and further use.
Show data
We currently support showing an image or a virtual receipt without a QR code.
In the XML example below, specify:
<screen name>: the screen split ratio. Can be split_50x50, split_40x60, and split_60x40.
<screen side>: the side of the split screen on which to show the request. Can be left or right.
<ReferenceID>: the type of request: Image.
<Text>: the image file converted to a Base64-encoded string.
Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.
SaleID
Your unique ID for the POS system component to send this request from.
POIID
The unique ID of the terminal to send this request to. Format: [device model]-[serial number].
If the request is successful, the payment terminal shows the data on the specified side of the screen and you receive a display response with OutputResult.Response.Result: Success.
The other side of the screen shows a black background until you send the other request.
If an error occurs while decoding the image, the image won't be shown and you receive a display response with OutputResult.Response.Result: Failure. See XML validation for information about how errors in the XML content are reported.
In the XML example below, specify:
<screen name>: the screen split ratio. Can be split_50x50, split_40x60, and split_60x40.
<screen side>: the side of the split screen on which to show the request. Can be left or right.
<receipt>: the receipt information. This can contain:
<title>: the header line of the virtual receipt.
<lines>: contains line items that represent the goods that the shopper is purchasing. Each line item can have a count, description, and amount.
<subtotal>: amount due before discounts and taxes.
<tax>: total discounts, amount and type of taxes, total tax amount.
<total>: final amount due.
Example XML file
<?xml version="1.0" encoding="UTF-8"?>
<screen name="split_50x50" side="left">
<receipt>
<title>Your Items</title>
<lines>
<!-- the lines element can have 0 or more lineitems -->
<lineitem>
<description>** SALES **</description>
</lineitem>
<lineitem>
<!-- all elements (count, description, and amount) are optional -->
<count>1</count>
<description>Running shoes</description>
<amount>
<!-- an amount must have a currency symbol or code, and a value -->
<currency>$</currency>
<value>79.99</value>
</amount>
</lineitem>
<lineitem>
<count>2</count>
<description>Green T-shirt @ 9.89</description>
<amount>
<currency>$</currency>
<value>19.78</value>
</amount>
</lineitem>
<lineitem>
<description>** RETURNS **</description>
</lineitem>
<lineitem>
<count>1</count>
<description>Grey t-shirt @ 12.99</description>
<amount>
<currency>$</currency>
<value>-12.99</value>
</amount>
</lineitem>
<lineitem>
<description />
<!-- a lineitem containing only an empty description returns a blank line -->
</lineitem>
<lineitem>
<description>** DISCOUNTS **</description>
</lineitem>
<lineitem>
<description>Loyalty discount</description>
<amount>
<currency>$</currency>
<value>-4.48</value>
</amount>
</lineitem>
<lineitem>
<description>____________________</description>
</lineitem>
<!-- an empty lineitem returns a blank line (taking up vertical space) -->
<lineitem />
</lines>
<!-- a receipt can have 0 or 1 subtotal element -->
<subtotal>
<!-- description and amount are both optional -->
<description>Subtotal</description>
<amount>
<currency>$</currency>
<value>86.78</value>
</amount>
</subtotal>
<!-- a receipt can have 0 or 1 tax element -->
<tax>
<!-- tax element can have 0 or 1 totaldiscount element-->
<totaldiscount>
<description>Total discount:</description>
<amount>
<currency>$</currency>
<value>-4.48</value>
</amount>
</totaldiscount>
<!-- tax element can have 0 or more taxitem elements -->
<taxitem>
<!-- description and amount are both optional -->
<description>State tax:</description>
<amount>
<currency>$</currency>
<value>5.97</value>
</amount>
</taxitem>
<taxitem>
<description>County tax:</description>
<amount>
<currency>$</currency>
<value>1.85</value>
</amount>
</taxitem>
<!-- tax element can have 0 or 1 taxtotal element -->
<taxtotal>
<!-- description and amount are both optional -->
<description>Total tax:</description>
<amount>
<currency>$</currency>
<value>7.82</value>
</amount>
</taxtotal>
</tax>
<!-- a receipt can have 0 or 1 total element -->
<total>
<!-- description and amount are both optional -->
<description>Total amount:</description>
<amount>
<currency>$</currency>
<value>90.12</value>
</amount>
</total>
</receipt>
</screen>
Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.
SaleID
Your unique ID for the POS system component to send this request from.
POIID
The unique ID of the terminal to send this request to. Format: [device model]-[serial number].
The payment terminal shows the virtual receipt on the specified side of the screen. The receipt auto-scrolls to the bottom and the header and footer are 'sticky'.
The other side of the screen shows a black background, until you send the other request.
If the request is not successful, you receive a display response with OutputResult.Response.Result: Failure and more information about why the request failed. See XML validation for information about how errors in the XML content are reported.
After the input is collected on the other part of the screen, the shown data resizes to the full width of the screen and continues to show. To stop it from showing, you need to send a payment request, or a request to show the standby screen.
Collect input
We currently support presenting shoppers with a form to collect their phone number or a multiple choice form that allows a single answer.
When using split screen input requests, the users cannot select the Confirm or Cancel keys on the terminal keypad. Instead, you need to implement logic to confirm or decline the request using the buttons on the input screen. The numerical keypad and the Clear key can still be used.
In the XML example below, specify:
<screen name>: the screen split ratio. Can be split_50x50, split_40x60, and split_60x40.
<screen side>: the side of the split screen on which to show the request. Can be left or right.
<ReferenceID>: the type of request: GetPhoneNumber.
<Text>: shows the specified text on screen, for example Enter your phone number:.
Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.
SaleID
Your unique ID for the POS system component to send this request from.
POIID
The unique ID of the terminal to send this request to. Format: [device model]-[serial number].
The payment terminal shows the input request on the specified side of the screen. The other side of the screen shows a black background, until you send the other request.
Wait for the user to supply the requested input.
The provided input is not validated against a format.
If the input is received from the terminal, the InputResult.Input contains the entered numerals (phone number) inside DigitInput.
Example response when the user entered a phone number
If the input request times out, the InputResult.Response has AdditionalResponse: message=Screen%20timeout, Result: Failure, and ErrorCondition: Cancel.
If you make a payment request while the input request is waiting for input on the terminal, the payment request overrides the input request. The InputResult.Response has AdditionalResponse: message=A%20higher%20priority%20request%20has%20been%20received, Result: Failure, and ErrorCondition: Busy.
If the user declines to respond (by selecting the Skip button), the InputResult.Input.DigitInput field is empty. The InputResult.Response has Result: Failure and ErrorCondition: Cancel.
Pass the phone number from the DigitInput field to your system for validation and further use.
The multiple choice screen shows a header, optionally a sub-header, and 5 buttons to choose from. The user can select one option and we only pass which option is selected. You then need to implement in your system what that option does.
In the XML example below, specify:
<screen name>: the screen split ratio. Can be split_50x50, split_40x60, and split_60x40.
<screen side>: the side of the split screen on which to show the request. Can be left or right.
<ReferenceID>: the type of request: TileButtons. Shows 5 options to choose from.
<Text>: shows the specified text as the header of the multiple choice question, for example Select an option:.
Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (POIID) being used.
SaleID
Your unique ID for the POS system component to send this request from.
POIID
The unique ID of the terminal to send this request to. Format: [device model]-[serial number].
InputRequest.MenuEntry: an array of up to 5 items representing the options to choose from. The terminal shows these items as a scrollable list of buttons that the user can tap to select. Each item in the array has:
Parameter
Description
OutputFormat
Text
OutputText
An array of one or two Text fields to specify the answer or menu button. The first text field will show in bold. The second text field is optional; you can omit it from the request. For example, you could write a short-form answer in the first field, and the long-form answer in the second field.
InputRequest.InputData: this part of the request body handles the user input.
Parameter
Description
Device
CustomerInput
InfoQualify
Input
InputCommand
GetMenuEntry
MaxInputTime
(Integer) Time-out in seconds. This is the time that the user gets to finish their input.
The payment terminal shows the multiple choice question on the specified side of the screen. If the other request is not sent at the same time, the other side of the screen shows a black background until the request is sent.
Wait for the user to supply the requested input.
The provided input is not validated against a format.
If input is provided to the terminal, the MenuEntryNumber inside InputResult.Input contains an array that indicates the option that the user selected. For example, if the third option is selected, the third item in the array is 1 and all other array items are 0.
Example response when the shopper selected an option
If the input request times out, the InputResult.Response has AdditionalResponse: message=Screen%20timeout, Result: Failure, and ErrorCondition: Cancel.
If you make a payment request while the input request is waiting for input on the terminal, the payment request overrides the input request. The InputResult.Response has AdditionalResponse: message=A%20higher%20priority%20request%20has%20been%20received, Result: Failure, and ErrorCondition: Busy.
Pass the relevant data from InputResult.Input to your system for validation and further use.
See XML validation for information about how errors in the XML content are reported.
XML validation
When we receive your display and input requests, we check if we can parse the XML content. We can also check whether the XML content matches the XML Schema Definition (XSD). We only do this XSD check if it is enabled for your account.
Parsing
We always check whether we can parse the XML content of your request.
For example, if the XML contains a syntax error like a missing caret >, we can't parse the XML. We'll send a failure response with XHTML data could not be parsed.
XSD
If we can parse the XML content and XSD checking is enabled, we validate the XML against the XSD.
To use this validation, ask our POS Support Team to enable the virtual receipt XSD check.
For example, if you add an element that is not in the XSD or if you omit a required element, the XML doesn't match the XSD. We'll send a failure response with XSD validation failed.