To be able to resolve issues with your requests, you need to know how Terminal API informs you of the processing status of your request. This is communicated in the Response
object of the API response, which has:
Result
: one of the following values:- Success: the request succeeded / the transaction was approved on the terminal.
- Partial: the transaction amount has been partially approved.
- Failure: the request or transaction didn't succeed. The remaining
Response
fields provide more information about the error, to enable you to determine how to handle it.
ErrorCondition
: this field is included when the request or transaction fails, and indicates the cause of the failure.AdditionalResponse
: more information about the error condition. You'll receive either a string of form-encoded key-value pairs or a Base64 string that you need to decode to get a JSON object.
Now let's see what you can do when:
- The request failed because it was invalid.
- You made a payment request but didn't receive a result.
- The result of your payment request indicates the transaction failed.
Invalid message format
A Response
object with Result
Failure and ErrorCondition
MessageFormat indicates there was a mistake in the request you sent. Proceed as follows:
-
Determine what caused the error, based on the
message
,warnings
, orerrors
in theAdditionalResponse
. For example, a missing required field or an unexpected field.The following example is for a response indicating that the
Currency
field is missing from the payment request: -
Refer to the Terminal API reference if necessary, then manually fix your request and try again.
Invalid JSON format
If your API request does not contain a valid JSON object, you receive a Bad JSON
HTTP reply that specifies the line number and a description of the issue:
- Manually fix the JSON error on the line mentioned in the HTTP reply and try again.
Unavailable service
A Response
object with Result
Failure and ErrorCondition
UnavailableService indicates we were unable to implement your request. Proceed as follows:
-
Determine what caused the error, based on the
message
,warnings
, orerrors
in theAdditionalResponse
. For example:- You tried to use functionality that the payment terminal doesn't support.
- You tried to use a ProtocolVersion that the terminal cannot manage.
- You tried to use functionality that we do not support.
The following example is for a response indicating that there's a mismatch between the protocol versions (2.0 in the request and 3.0 on the terminal):
-
Depending on the cause of the error, manually fix your request and send it again. For example, after receiving the above failure response you'd specify the same protocol version that the terminal supports.
No result received
We recommend that your integration automatically checks the status of a transaction any time it fails to receive a transaction response.
Payment requests time out after a while. If you do not receive a payment response (or you receive a response indicating a time-out) after 120 seconds (local integration) or 150 seconds (cloud integration), and the internet connection hasn't dropped, your integration should automatically check the transaction status.
If you do not receive a transaction result, neither synchronously nor asynchronously, proceed as follows:
-
Make a TransactionStatusRequest (see Verify transaction status for details).
-
Determine your next action based on the TransactionStatusResponse.Response:
Response Description Action Result
SuccessThe transaction was processed. Use the RepeatedResponseMessageBody
to determine how to process the transaction.ErrorCondition
InProgressThe payment terminal is waiting for a response from the shopper, or there is a delay with the card issuer. Continue making a transaction status request for this transaction every five seconds until you receive a response indicating the transaction was processed. ErrorCondition
NotFoundPossible causes: - The details you specified in the transaction status request are incorrect.
- We did not receive your request; maybe your connection dropped after sending the request.
Possible actions: - Provide the details of the original transaction in the
MessageReference
of your transaction status request. - Retry the original transaction.
Terminal unavailable (cloud integration)
When you send a
PaymentRequest
to a payment terminal that is unavailable, the payment cannot be processed. In a cloud integration, the Terminal API generates a Reject event notification.
Note that event notifications are always presented as a SaleToPOIRequest
.
The EventNotification
body contains:
RejectedMessage
: a Base64 string containing the payment request that couldn't be processed. Decode this to get the original payment request as a JSON object.EventToNotify
: RejectEventDetails
: a message indicating why the payment terminal is unavailable.
Here's an example event notification for an unavailable payment terminal in a cloud integration:
The steps that you can take, relate to the EventDetails
message you receive:
Did not receive a response
"message=Did+not+receive+a+response+from+the+POI."
This message indicates that the request was sent but the payment terminal didn't respond, possibly because the WebSocket is down at the terminal.
- Make a
TransactionStatusRequest
to verify whether the WebSocket connection has been restored and the payment is now processed.
Failed to send message
"message=Failed+to+send+message+to+POI.+There+may+be+a+network+issue+or+it+may+not+have+the+websocket+connected."
This message indicates that probably the WebSocket for the payment terminal is not available on the cloud Terminal API router.
-
Check the WebSocket connection:
- The terminal display should have a cloud icon in the top row.
-
Check the cloud connection from your Customer Area, using an API request, or on the terminal itself.
Unknown POIID
"message=Unknown+POIID+P400Plus-123456789"
This message indicates that the terminal ID (POIID) in the payment request is incorrect, or that the terminal is in the inventory of the Company account and hasn't been assigned to a merchant account or store that allows processing payments.
- On the payment terminal, open the terminal information (press 5 and then the Confirm button or see the instructions for your payment terminal model) and verify that the terminal ID in the format [device model]-[serial number] matches the POIID that you specified in the payment request. For example, P400Plus-123456789.
If the POIID matches, go to the next step. - Verify that the payment terminal is assigned to a merchant account or store. You can do this using a
/getTerminalsUnderAccount
request, or using your Customer Area.
Declined payment
When a
PaymentRequest
results in a Response
object with Result
Failure and one of the error conditions listed below, the transaction was declined.
The AdditionalResponse
has more information about why the transaction was declined in the refusalReason
and message
fields. These fields are our mapping of the response we receive from acquirers and issuers.
Here's an example failure response for a declined payment:
When your payment request is declined, you need to determine whether you can retry it:
-
Check the ErrorCondition in the
PaymentResponse.Response
, because in many cases this already indicates whether you can retry the transaction.Error condition Retry? Aborted Busy See next step Cancel See next step DeviceOut InvalidCard See next step NotAllowed Refusal See next step UnreachableHost WrongPIN -
For the error conditions Cancel, InvalidCard, and Refusal, check the
AdditionalResponse
for therefusalReason
andmessage
. For the error condition Busy, check the response for aserviceId
. You can use this if you want to cancel the transaction.You can use the
ErrorCondition
to code your POS app. TherefusalReason
andMessage
fields are included for additional insight, and should not be coded against.
TheserviceId
can be used by the POS app to cancel a transaction.Select the tabs for details.
For more information, see our reference documentation for refusal reasons. If you enabled receiving the
refusalReasonRaw
field in theAdditionalResponse
, also see our reference documentation for raw acquirer responses.The
refusalReasonRaw
provides additional information. But if you base your code on it, that might break your integration because acquirers and issuers sometimes change their raw responses without notice. -
If applicable, retry the transaction.
Time-out
Various time-outs can occur during a transaction:
- A processing time-out. You receive a Failure response and the transaction is cancelled.
- A device time-out. You receive a Failure response and the transaction is cancelled.
- A request time-out. You receive an event notification and the transaction can still be completed on the payment terminal.
Time-out |
How to recognize | Action |
---|---|---|
Processing time-out | Transaction response with: Response.Result : Failure ErrorCondition : Communication timeout |
Retry the transaction using a different card or payment method. |
Device time-out | Transaction response with: Response.Result : Failure ErrorCondition : Cancel AdditionalResponse : indicates the type of device time-out |
Retry the transaction. |
Request time-out | Event notification with: EventToNotify : Reject EventDetails : message=Timed+out+waiting+for+response+from+POI. |
Make a transactions status request to see if the transaction has been processed. |
Error condition comparison
The table below compares error conditions and troubleshooting steps specific to making a PaymentRequest
, TransactionStatusRequest
, or ReversalRequest
(a referenced refund).
Error condition | PaymentRequest | TransactionStatusRequest | ReversalRequest |
---|---|---|---|
Aborted | Retry | not applicable | Optionally retry |
Cancel | See Declined payment | not applicable | not applicable |
DeviceOut | Wait and retry | Wait and retry | Wait and retry |
InProgress | not applicable | See No result received | not applicable |
InvalidCard | See Declined payment | not applicable | not applicable |
Invalid message format | |||
NotAllowed | Do not retry | Wait and retry | Wait and retry or Retry different device |
NotFound | Manual recovery | See No result received | Manual recovery |
Refusal | See Declined payment | not applicable | Manual recovery |
Unavailable service | |||
UnreachableHost | Retry | Retry | Retry |
WrongPIN | Retry | not applicable | not applicable |
Unexpected card entry modes
A payment can fail if it is not within the transaction limits that you set or if the entry mode is not supported. For example, making a contactless chip transaction that is above the Contactless reader limit.
You can check the posEntryMode
inside the AdditionalResponse
to see whether a card, a QR code, or another entry mode was used to make the transaction.
posEntryMode
values can be:
Entry mode | Description |
---|---|
RFID | Payment instrument information taken from RFID |
Keyed | Manual key entry |
Manual | Reading of embossing or optical character recognition (OCR) of printed data either at time of transaction or after the event |
File | Account data on file |
Scanned | Scanned by a bar code reader |
MagStripe | Magnetic stripe card reader |
ICC | Contact ICC (asynchronous) |
SynchronousICC | Contact ICC (synchronous) |
Tapped | Contactless card reader |
Contactless | Magnetic Stripe Contactless card reader conform to ISO 14443 |
Mobile | Mobile phone. |
CheckReader | Check Reader |
In some cases, you might want to enforce using a specific entry mode, for example when making a Manual key entry payment.
You can do this by specifying one of the entry modes from the table inside the TransactionConditions.ForceEntryMode
object of the payment request: