Sale request

An overview of the Sale request message for Android.

Overview

👉 The Sale request is used to prompt payment from the customer for a specific amount, including the desired tip amount. Once the customer has attempted or completed payment, a related transaction (either successful or unsuccessful) will be created.

This request allows for multimerchant functionality with the ISV schema. For multimerchant functionality without the ISV schema, please see Multimerchant Sale request

The client app must implement a mechanism to send messages using Android intents and URI calls and to receive the result in a custom URI callback.

Sale request

For a typical Sale request, the client app must provide the following information:

Field Description Example Required Card terminal support Character limit Type
scheme The Viva custom URL scheme, the host and the version. 'vivapayclient://pay/v1' Android Card Terminals'viva.com | Terminal' application for Android
appId The client app ID. For successful validation, should not be empty. 'com.example.myapp' Android Card Terminals'viva.com | Terminal' application for Android
action Sale transaction. For successful validation, should not be empty. 'sale' Android Card Terminals'viva.com | Terminal' application for Android
clientTransactionId A unique transaction ID transmitted to the host for storage with the transaction. Note that this value will be provided in the Merchant Reference field provided in the sales export response. '12345678901234567890123456789012' Android Card Terminals'viva.com | Terminal' application for Android 2048 String
amount Amount in cents without any decimal digits. This value must not be empty and must be an integer larger than zero. '1200' = 12 euro Android Card Terminals'viva.com | Terminal' application for Android 10 integer (int32)
tipAmount The tip that will be added on top of the amount. This must be less than or equal to the amount. '200' = 2 euro Android Card Terminals'viva.com | Terminal' application for Android 10 integer (int32)
sourceCode The store/source code that will be linked to the transaction.
  • If a source code parameter is not specified, the source code assigned to the terminal will automatically be associated with the transaction.
  • When the sourceCode is specified, the transaction will be linked to the sourceCode accordingly.
  • In ISV integration scenarios, the sourceCode is disregarded and only ISV_merchantSourceCode is being recognized as the transaction source.
[A payment source (physical store) that is associated with the transaction]

How to create a payment source for CP payments
'viva.com | Terminal' application for Android 20 integer (int32)
withInstallments Enable card installments. Only in Greek Merchants 'true' Android Card Terminals'viva.com | Terminal' application for Android Boolean
preferredInstallments Number of preferred card installments. Only in Greek Merchants. If the number is between the allowed range and the card supports installments then the flow complete without any prompt for installments. If the number is 0 or > max allowed number of installments then the user will be prompt to enter the number in the app. If the card does not support installments then the app will request from the user how to proceed with the flow. If withInstallments is true preferredInstallments must be integer and not empty. '10' Required if withInstallments is set Android Card Terminals'viva.com | Terminal' application for Android 2 integer (int32)
callback The URI callback that will handle the result. For successful validation, should not be empty. 'mycallbackscheme://result' Android Card Terminals'viva.com | Terminal' application for Android
show_receipt A flag indicating if the receipt and transaction result will be shown. If true both transaction result and receipt will be shown. If false receipt will not be shown and result will be shown if show_transaction_result is true. 'false' 'viva.com | Terminal' application for Android
show_transaction_result A flag indicating whether transaction result will be shown. 'true' 'viva.com | Terminal' application for Android Boolean
show_rating A flag indicating if the rating flow will be shown. 'true' Android Card Terminals'viva.com | Terminal' application for Android Boolean
ISV_amount The amount the ISV charges. Only for ISV Partners '100' = 1€ Required for ISV integration Android Card Terminals'viva.com | Terminal' application for Android 10 integer (int32)
ISV_clientId The ID of the ISV client. It is mandatory that if client ID is provided the ISV_amount and ISV_clientSecret parameters should be provided too. Only for ISV Partners
Refer to note below.
kf7fpz4c4gkc6ch03u4415o8acipq9xdefzuto4b6by94.apps.vivapayments.com Required for ISV integration Android Card Terminals'viva.com | Terminal' application for Android
ISV_clientSecret The secret of the ISV client. Only for ISV Partners
Refer to note below.
SY5Nt33019xdyagX85Ct6DQwpTiZhG Required for ISV integration Android Card Terminals'viva.com | Terminal' application for Android
ISV_sourceCode The source code of the ISV. Only for ISV Partners
Refer to note below.
[A payment source (physical store) that is associated with a terminal]

How to create a payment source for ISV
Android Card Terminals'viva.com | Terminal' application for Android 4 integer (int32)
ISV_merchantId Support for merchant switching via the inter-app while utilizing ISV feature. 8d40824a-a5d3-4639-819c-6e8bddb99477 Required for multimerchant integration 'viva.com | Terminal' application for Android
ISV_currencyCode Currency used for the given merchant when ISV is being used.
You may find all the currency codes here.
978 Required for ISV integration 'viva.com | Terminal' application for Android 3 integer (int32)
ISV_merchantSourceCode The source code of the merchant. [A payment source (physical store) that is associated with a terminal]

How to create a payment source for stores
'viva.com | Terminal' application for Android 4 integer (int32)
ISV_customerTrns The ISV transaction description for customer. Description of items/services
(up to 2048 characters).
'viva.com | Terminal' application for Android 2048 String
ISV_clientTransactionId A unique transaction ID transmitted to the host for storage with the transaction of the ISV. Note that this value will be provided in the Merchant Reference field provided in the sales export response. 2600679
(up to 2048 characters).
'viva.com | Terminal' application for Android
paymentMethod The payment method to be presented first to the user.

The same time, the user is able to select another payment method
Choose one of the following values:
  • CardPresent
  • MOTO
  • QrDefault
  • QrPayconic
  • AliPay
  • Paypal
  • Klarna
The CardPresent is the default payment method if the parameter paymentMethod is not specified in the Sales Request
Android Card Terminals'viva.com | Terminal' application for Android
aadeProviderId [*] Unique Number to identify specific Provider (ΥΠΑΗΕΣ):

  • VivaDemo - ‘999’
  • SoftOne - ‘101’
  • EnterSoft - ‘102’
  • Impact - ‘103’
  • Epsilon Net - ‘104’
  • Novus Conceptus - ‘105’
  • Cloud Services IKE - ‘106’
  • Primer Software - ‘107’
  • ILYDA = ‘108’
  • Prosvasis = ‘109’
  • MAT = ‘110’
  • Simply = ‘111’
  • Kappa = ‘112’
  • SBZ = ‘113’
  • OneSys = ‘114’
  • ORIAN = ‘115’
  • TESAE = ‘116’
  • Karpodinis = ‘117’
  • Cloud T = ‘118’
  • Πάροχος Λύσεων Πληροφορικής Α.Ε. = ‘119’
  • '999'
    Please note that this parameter apply only for Greek merchants.
    Android Card Terminals'viva.com | Terminal' application for Android 3 Numeric
    aadeProviderSignatureData [*] The unencrypted signature that includes the fields below with semicolon as a delimiter “;”:

  • Receipt UID
  • MARK (Unique ID provided by AADE - commonly null as this provider after the end of the transaction)
  • Date and time of the Signature
  • Amount to be paid
  • Sum Amount without TAX
  • VAT percentage
  • Sum Amount with TAX
  • TID
  • AD33729F4ED749928AAFA00B90EE4EA91551BAC1;;20231204080313;1051;10000;2400;12400;POS_1
    Please note that this parameter apply only for Greek merchants.
    Android Card Terminals'viva.com | Terminal' application for Android 200 Alphanumeric
    aadeProviderSignature [*] The fields of providerSignatureFields encrypted using a public key and the Elliptic Curve Digital Signature Algorithm (ECDSA):

  • Algorithm: ECDSA
  • Curve: NISTP256
  • HASH: SHA256
  • The signature is sent to POS in base64 format
  • o0094r3Yk3KTqASLkW3evlDsnIg/ZAdUUf6UCXDtjqpI/dquzAT4WNX3yzS/GLciVNbT75H4pj8hLOV0EpHtzw=="
    Please note that this parameter apply only for Greek merchants.
    Android Card Terminals'viva.com | Terminal' application for Android
    protocol The protocol used. Always pass this value: int_default Required for Paydroid devices Android Card Terminals

    [*] These parameters are only applicable in Greece

    ISV parameter info:

    • ISV_amount is only for ISV partners and is required for ISV integration. This value is set during an API call.
    • ISV_clientId can be found under Settings > API access in the viva banking app
    • ISV_clientSecret as above.
    • ISV_sourceCode is the payment source for ISV set up under Sales > Physical Payments > Stores.

    The above parameters must be used to create a URI call. Please see the below examples:

    Intent payIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
                            "vivapayclient://pay/v1"
                                    + "?appId=com.example.myapp"
                                    + "&action=sale"
                                    + "&clientTransactionId=1234567801234"
                                    + "&amount=1200"
                                    + "&tipAmount=200"
                                    + "&show_receipt=true"
                                    + "&show_transaction_result=true"
                                    + "&show_rating=true"
                                    + "&ISV_amount=100"
                                    + "&ISV_clientId=kf7fpz4c4gkc6ch03u4415o8acipq9xdefzuto4b6by94.apps.vivapayments.com"
                                    + "&ISV_clientSecret=SY5Nt33019xdyagX85Ct6DQwpTiZhG"
                                    + "&ISV_sourceCode=Default"
                                    + "&ISV_currencyCode=978"
                                    + "&ISV_customerTrns=ItemDescription"
                                    + "&ISV_clientTransactionId=12345678901234567890123456789012"
                                    + "&ISV_merchantId=1234567890"
                                    + "&ISV_merchantSourceCode=9090"
                                    + "&paymentMethod=CardPresent"
                                    + "&callback=mycallbackscheme://result"));
    
    payIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    payIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(payIntent);
    Intent payIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
                            "vivapayclient://pay/v1"
                                    + "?appId=com.example.myapp"
                                    + "&action=sale"
                                    + "&clientTransactionId=1234567801234"
                                    + "&amount=1200"
                                    + "&tipAmount=200"
                                    + "&show_receipt=true"
                                    + "&show_transaction_result=true"
                                    + "&show_rating=true"
                                    + "&withInstallments=true"
                                    + "&preferredInstallments=10"
                                    + "&ISV_amount=100"
                                    + "&ISV_clientId=kf7fpz4c4gkc6ch03u4415o8acipq9xdefzuto4b6by94.apps.vivapayments.com"
                                    + "&ISV_clientSecret=SY5Nt33019xdyagX85Ct6DQwpTiZhG"
                                    + "&ISV_sourceCode=Default"
                                    + "&ISV_currencyCode=978"
                                    + "&ISV_customerTrns=ItemDescription"
                                    + "&ISV_clientTransactionId=12345678901234567890123456789012"
                                    + "&callback=mycallbackscheme://result"));
    
    payIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    payIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(payIntent);
    Intent payIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
                            "vivapayclient://pay/v1"
                                    + "?appId=com.example.myapp"
                                    + "&action=sale"
                                    + "&clientTransactionId=1234567801234"
                                    + "&amount=1200"
                                    + "&tipAmount=200"
                                    + "&show_receipt=true"
                                    + "&show_transaction_result=true"
                                    + "&show_rating=true"
                                    + "&aadeProviderId=999"
                                    + "&aadeProviderSignatureData=AD33729F4ED749928AAFA00B90EE4EA91551BAC1;;20231204080313;1051;10000;2400;12400;POS_1"
                                    + "&aadeProviderSignature=o0094r3Yk3KTqASLkW3evlDsnIg/ZAdUUf6UCXDtjqpI/dquzAT4WNX3yzS/GLciVNbT75H4pj8hLOV0EpHtzw=="
                                    + "&callback=mycallbackscheme://result"));
    
    payIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    payIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(payIntent);
    Intent payIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
                            "vivapayclient://pay/v1"
                                    + "?appId=com.example.myapp"
                                    + "&action=sale"
                                    + "&clientTransactionId=1234567801234"
                                    + "&amount=1200"
                                    + "&tipAmount=200"
                                    + "&show_receipt=true"
                                    + "&show_transaction_result=true"
                                    + "&show_rating=true"
                                    + "&withInstallments=true"
                                    + "&preferredInstallments=10"                                
                                    + "&callback=mycallbackscheme://result"));
    
    payIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    payIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    startActivity(payIntent);

    Sale response

    After executing a Sale transaction the ‘viva.com | Terminal’ application responds with a Sale response result to indicate if the transaction has been approved or not.

    The result is received as a URI in the callback activity intent:

    Uri result = getIntent().getData()`

    The table below summarises the contents of an approved response.

    Field Description Example Card terminal support
    callback The URI callback that will handle the result. 'mycallbackscheme://result' Android Card Terminals'viva.com | Terminal' application for Android
    status The status of the transaction. 'success' Android Card Terminals'viva.com | Terminal' application for Android
    message A string containing information about the transaction status. 'Transaction successful' Android Card Terminals'viva.com | Terminal' application for Android
    action Sale transaction. 'sale' Android Card Terminals'viva.com | Terminal' application for Android
    clientTransactionId The client transaction ID. '12345678901234567890123456789012' Android Card Terminals'viva.com | Terminal' application for Android
    amount The amount in cents without any decimal digits. If action is cancel and amount is not empty must be integer and bigger than zero.
    (Used in successful and declined receipts)
    '1200' = 12 euro Android Card Terminals'viva.com | Terminal' application for Android
    tipAmount How much of the amount in cents is considered as tip without any decimal digits.
    (Used in successful and declined receipts)
    '200' = 2 euro Android Card Terminals'viva.com | Terminal' application for Android
    verificationMethod The verification method used.

    Possible values: CHIP, CONTACTLESS, MAGNETIC, MANUAL ENTRY
    'CHIP' Android Card Terminals'viva.com | Terminal' application for Android
    rrn The Retrieval Reference Number of the transaction RRN.
    (Used in successful and declined receipts)
    '123456833121' Android Card Terminals'viva.com | Terminal' application for Android
    cardType The card type. 'VISA' Android Card Terminals'viva.com | Terminal' application for Android
    accountNumber The card number masked. Note that only the 6 first and the 4 last digits are provided. All other digits are masked with stars.
    (Used in successful and declined receipts)
    '479275\*\*\*\*\*\*9999' Android Card Terminals'viva.com | Terminal' application for Android
    referenceNumber A 6-digit number indicating the transaction's STAN number. '833121' Android Card Terminals'viva.com | Terminal' application for Android
    authorisationCode A 6-digit number indicating the transaction's Authorisation code provided by the host. '690882' Android Card Terminals'viva.com | Terminal' application for Android
    tid A 12 character string indicating the terminal's TID number. ' 16016684' Android Card Terminals'viva.com | Terminal' application for Android
    orderCode The order code. ' 9256110059000200' Android Card Terminals'viva.com | Terminal' application for Android
    shortOrderCode 10-digit integer. '1234567890' Android Card Terminals'viva.com | Terminal' application for Android
    merchantApproved This field is returned only if the terminal is in offline mode. It indicates that the transaction is completed in offline mode.
    (offline mode only)
    'true' 'viva.com | Terminal' application for Android
    installments Number of card installments. ' 10' Android Card Terminals'viva.com | Terminal' application for Android
    transactionDate The transaction date in ISO 8601 format.
    (Used in successful and declined receipts)
    '2019-09-13T12:14:19.8703452+03:00' Android Card Terminals'viva.com | Terminal' application for Android
    transactionId A unique identifier for the transaction. 'a78e045c-49c3-4743-9071-f1e0ed71810c' Android Card Terminals'viva.com | Terminal' application for Android
    paymentMethod Payment method used for the payment. 'CARD_PRESENT' 'viva.com | Terminal' application for Android
    ISV_amount The amount that the ISV charges. '100' = 1€ 'viva.com | Terminal' application for Android
    ISV_clientId The ID of the ISV client. 'qwerty123456' 'viva.com | Terminal' application for Android
    ISV_clientSecret The secret of the ISV client. 'qwerty123456' 'viva.com | Terminal' application for Android
    sourceCode The source code attributed to the merchant and associated with the transaction. '2412' 'viva.com | Terminal' application for Android
    ISV_sourceCode The reseller source code of the ISV. 'qwerty123456' 'viva.com | Terminal' application for Android
    aid A string indicating the AID of the card.
    (Used in successful receipts)
    'A000000003101001' Android Card Terminals
    vatNumber The VAT number of merchant.
    (if print VAT is enabled in the 'viva.com | Terminal' application settings)
    (Used in successful and declined receipts)
    '123412341' Android Card Terminals
    address The address of merchant
    (if print address is enabled in the 'viva.com | Terminal' application settings)
    (Used in successful receipts)
    ‘Main St 123, 12312 Anytown’ Android Card Terminals
    businessDescription Merchant’s Business/Trade/Store name (depending on what option is selected in the 'viva.com | Terminal' application settings),
    (Used in successful receipts)
    'Wonka Industries' Android Card Terminals
    printLogoOnMerchantReceipt A boolean indicating weather the VivaWallet logo should be printed on merchant receipt.
    (Used in successful receipts)
    'false' Android Card Terminals
    merchantReceiptPAN This field contains the value of the PAN (and additional clipping) that should be printed in merchant receipt. If is empty, then apply the default clipping.
    (Used in successful receipts)
    '629914XXXXXXXXX6770' Android Card Terminals
    cardholderReceiptPAN This field contains the value of the PAN (and additional clipping) that should be printed in customer receipt. If is empty, then apply the default clipping. '629914XXXXXXXXX6770' Android Card Terminals
    transactionReceiptAcquirerZone If it is not empty then this value should be printed at the end of the customer receipt.
    (Used in successful receipts)
    'qwerty123456' Android Card Terminals
    cardholderReceiptText If is not empty then this value should be printed at the end of the customer receipt.
    (Used in successful receipts)
    'qwerty123456' Android Card Terminals
    merchantReceiptText If is not empty then this value should be printed at the end of the customer receipt.
    (Used in successful receipts)
    'qwerty123456' Android Card Terminals
    cardholderName Name of the cardholder.
    (Used in successful receipts)
    'JOHN DOE' Android Card Terminals
    cardExpirationDate Expiration date of the card (YYMM).
    (Used in successful receipts)
    '2212' Android Card Terminals
    cardholderNameExpirationDateFlags Each char may be 0 (false) or 1 (true) and indicates if the cardholder name and the expiration date should be printed on the merchant/cardholder receipts)

    1st char: if 1 then the Cardholder Name should be printed in the merchant's receipt. If 0, then it should not.

    2nd char: if 1 then the Cardholder Name should be printed in the cardholder's receipt. If 0, then it should not.

    3rd char: if 1 then the Expiration Date should be printed in the merchant's receipt. If 0, then it should not.

    4rd char: if 1 then the Expiration Date should be printed in the cardholder's receipt. If 0, then it should not.
    (Used in successful receipts)
    '1010' Android Card Terminals
    needsSignature A boolean indicating if the receipt needs a signature section.
    (Used in successful receipts)
    false Android Card Terminals
    addQRCode A boolean indicating if the order code should be printed as a QR.
    (Used in successful receipts)
    false Android Card Terminals
    terminalSerialNumber The serial number of the terminal.
    (Used in successful receipts)
    “1234567891“ Android Card Terminals
    currency The currency of the transaction.
    (Used in successful receipts)
    “EUR“ Android Card Terminals
    errorText Text to print on the receipt stating the error description and the error ccode.
    (Used in declined receipts)
    “Transaction failed - Z-3“ Android Card Terminals
    applicationVersion The version off the application.
    (Used in declined receipts)
    'v3.7.0(1956)' Android Card Terminals
    oldBalance The old balance of the cardholder.
    (Used in successful receipts)
    '200' = 2 euro Android Card Terminals
    newBalance The new balance of the cardholder.
    (Used in successful receipts)
    '200' = 2 euro Android Card Terminals
    entryMode Indicates the method used for PAN entry to initiate a transaction. You may find all the POS Entry Modes here. '07' Android Card Terminals
    loyaltyMerchant Merchant id ‘12345678901234567890123456789012’ 'viva.com | Terminal' application for Android
    loyaltyTerminal Terminal id '12345678901234567890123456789012' 'viva.com | Terminal' application for Android
    loyaltyPacketNo Batch number '12345678901234567890123456789012' 'viva.com | Terminal' application for Android
    loyaltyTransactionNo Sequence number '12345678901234567890123456789012' 'viva.com | Terminal' application for Android
    loyaltyPaymentAmount Amount to be paid. Measured in cents. '200' = 2 euro 'viva.com | Terminal' application for Android
    loyaltyRedemptionAmount Redeemed amount. Measured in cents. '50 = '0.5 euro 'viva.com | Terminal' application for Android
    loyaltyFinalAmount The final amount after the calculation of (initial Amount - redemption amount). Measured in cents. '100' = 1 euro 'viva.com | Terminal' application for Android
    loyaltyPointsCollected The points collected for the current transaction. Measured in points. 500 'viva.com | Terminal' application for Android
    loyaltyPointsRedeemed The points calculated for the selected amount to be redeemed. Measured in points. 250 'viva.com | Terminal' application for Android
    loyaltyPointsPrevBalance The previous balance of the customer’s points. Measured in points. 750 'viva.com | Terminal' application for Android
    loyaltyPointsNewBalance The new balance of the customer’s points. Measured in points. 1000 'viva.com | Terminal' application for Android
    loyaltyExtraMessage Extra messages sent by the loyalty provider 'loyalty message' 'viva.com | Terminal' application for Android
    loyaltyProgramId The id which indicates the loyalty program for the current transaction.

    The mapping of values in this field is shown in the table ‘Loyalty Programs Enumeration’ below.

    Please note: Loyalty bonus schemes are supported in Greece only
  • Eurobank €πιστροφή = 1
  • NBG Go4More = 2
  • Alpha Bonus = 3
  • 'viva.com | Terminal' application for Android
    loyaltyLogoUrl Url to get the loyalty’s logo 'http://logo.com' 'viva.com | Terminal' application for Android
    aadeTransactionId An AADE-specific transaction ID.

    Format: Acquirer Unique code + RRN + Authorization code.

    Example: ‘116’ + ‘123456833121’ + ‘690882’ = '116123456833121690882'
    '116123456833121690882' Android Card Terminals'viva.com | Terminal' application for Android

    Please see sample responses below for transactions made with the ‘viva.com | Terminal’ application for Android.
    Parameters may vary for transactions made with Paydroid card terminals.

    A sale response for an approved transaction looks as follows:

    A sale response for an offline mode transaction looks as follows. Please note, offline payment functionality is not supported within ISV integrations:

    A sale response for a failed transaction looks as follows:

    Note: transactions may fail for various reasons. Additionally, the structure of a failed message is the same as in the case of an approved transaction. Fields such as referenceNumber and authorisationCode may not have values since there is no STAN code available, nor an authorisation code.

    A sale response for a successful sale transaction using AADE parameters looks as follows:

    You may find below the response samples per loyalty Greek schemes (Alpha Bank Loyalty, Eurobank €πιστροφή , NBG Go4More)

    Alpha Bank Loyalty

    Eurobank

    NBG

    Loyalty Programs Enumeration

    Loyalty Program Value
    Eurobank επιστροφή 1
    NBG Go4more 2
    ALPHA Bonus 3

    Key to card terminal product categories

    To understand the icons used on the above tables, see the below table.

    Product category Terminal models Icon
    Android Card Terminals Android Card Terminal Ethernet, Android Card Terminal 4G, Mobile Card Terminal Plus, Mobile Card Terminal. Android Card Terminals
    'viva.com | Terminal' application for Android Mini Card Reader, Pocket Card Terminal connected via Bluetooth or USB to the 'viva.com | Terminal' application for Android. Android Card Terminals
    Linux Card Terminals Countertop, IM20, S900, S800, D200. Linux Card Terminals

    Get Support

    If you would like to integrate with Viva, or if you have any queries about our products and solutions, please see our Contact & Support page to see how we can help!