Sale request

An overview of the Sale request message for iOS.

Our ‘viva.com | Terminal’ application (tap-on-phone) supports Apple Tap to Pay in the UK, the Netherlands, France & Italy.

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.

The client app must implement a mechanism to send messages using URL schemes 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
scheme The Viva custom URL scheme, the host and the version. 'vivapayclient://pay/v1'
merchantKey The merchant's key. For successful validation, should not be empty.
Deprecated: you may pass any value.
'SG23323424EXS3'
appId The client app id. 'com.example.myapp'
action Sale transaction. 'sale'
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'
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
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
withInstallments Enable card installments. 'true'
preferredInstallments Number of preferred card installments. 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. '10' Required if withInstallments is set
show_receipt Option to show the receipt screen, before returning to the InterApp, after performing a sale on Viva.com | Terminal App. 'false'
show_rating Option to show the rating/feedback screen, before returning to the InterApp, after performing a sale on Viva.com | Terminal App. 'false'
show_transaction_result Option to show the transaction result screen, before returning to the InterApp, after performing a sale on Viva.com | Terminal App. If show_receipt is set to 'true’ this value will be neglected, therefore the transaction result screen will be shown. 'false'
ISV_amount The fee charged by the ISV on the sale. Amount in cents. Only for ISV Partners '10' =0.1€ Required for ISV integration
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.
'auyf99x03sachvn3f5ogldykz8214c2o4vl8cvvs97p19.apps.vivapayments.com' Required for ISV integration
ISV_clientSecret The secret of the ISV client. Only for ISV Partners
Refer to note below.
'qwerty123456' Required for ISV integration
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
ISV_merchantId Support for merchant switching via the inter-app while utilizing ISV feature 'qwerty123456'
ISV_merchantSourceCode The merchant source code of the ISV 'Default'
ISV_customerTrns The ISV transaction description for customer ‘qwerty123456’
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. '12345678901234567890123456789012'
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.
    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.
    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.
    protocol The protocol used (internal use only) Always pass this value: int_default
    callback Your custom URI callback that will handle the result. 'interapp-callback'

    [*] These parameters are only applicable in Greece.

    ISV parameter info:

    • 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.

    Using the information above, our custom URI should be created like this.

    typealias ISVDetails = (clientId: String, amount: Decimal, clientSecret: String, sourceCode: String?)
    
    func createSaleRequest(amount: Decimal, tipAmount: Decimal?, clientTransactionId: String?, isvDetails: ISVDetails?, numberOfInstallments: Int?) -> String {
    // construct sale action url
    var saleActionURL = Constants.saleUrlString // vivapayclient://pay/v1?callback=interapp-callback&merchantKey=SG23323424EXS3&appId=com.vivawallet.InterAppDemo&action=sale
    
    saleActionURL += "&amount=\(((amount * 100) as NSDecimalNumber).intValue)" // The amount in cents without any decimal digits.
    
    if let tip = tipAmount {
        saleActionURL += "&tipAmount=\(((tip * 100) as NSDecimalNumber).intValue)" // The tip amount in cents without any decimal digits.
    }
    
    // append clientTransactionId parameter (if any)
    if let transactionId = clientTransactionId, transactionId != "" {
        saleActionURL += "&clientTransactionId=\(transactionId)"
    }
    
    // append number of installments parameter (if any) - available for Greek merchants only
    if let preferredInstallments = numberOfInstallments, preferredInstallments > 1 {
        saleActionURL += "&withInstallments=true" // enable installments parameter - available for Greek merchants only
        saleActionURL += "&preferredInstallments=\(preferredInstallments)" // available for Greek merchants only
    }
    else {
        saleActionURL += "&withInstallments=false" // no installments parameter (should be used)
    }
    
    if let isvDetails = isvDetails {
        saleActionURL += "&ISV_clientId=\(isvDetails.clientId)"
        saleActionURL += "&ISV_amount=\(((isvDetails.amount * 100) as NSDecimalNumber).intValue)" // The ISV amount in cents without any decimal digits.
        saleActionURL += "&ISV_clientSecret=\(isvDetails.clientSecret)"
        if let sourceCode = isvDetails.sourceCode {
            saleActionURL += "&ISV_sourceCode=\(sourceCode)"
        }
    }
    
    let showReceipt = UserDefaults.standard.value(forKey: "show_receipt") as? Bool ?? true
    saleActionURL += "&show_receipt=\(showReceipt)"
    
    let showRating = UserDefaults.standard.value(forKey: "show_rating") as? Bool ?? true
    saleActionURL += "&show_rating=\(showRating)"
    
    let showResult = UserDefaults.standard.value(forKey: "show_transaction_result") as? Bool ?? true
    saleActionURL += "&show_transaction_result=\(showResult)"
    
    return saleActionURL
    }
    
    //USE LIKE THIS
    let saleActionURL = createSaleRequest(amount: 12.00, tipAmount: 2.00, clientTransactionId: nil, isvDetails: nil, numberOfInstallments: nil)
    (UIApplication.shared.delegate as? AppDelegate)?.performInterAppRequest(request: saleActionURL)
    

    Request example

    Request sample:vivapayclient://pay/v1?callback=interapp-callback&merchantKey=SG23323424EXS3&appId=com.vivawallet.InterAppDemo&action=sale&amount=1200&tipAmount=200&withInstallments=false&show_receipt=false&show_rating=true

    Request sample for merchants registered in Greece(including AADE parameters):vivapayclient://pay/v1?callback=interapp-callback&merchantKey=SG23323424EXS3&appId=com.vivawallet.InterAppDemo&action=sale&amount=1200&tipAmount=200&withInstallments=false&show_receipt=false&show_rating=true&aadeProviderId=999&aadeProviderSignatureData=AD33729F4ED749928AAFA00B90EE4EA91551BAC1;;20231204080313;1051;10000;2400;12400;POS_1&aadeProviderSignature=o0094r3Yk3KTqASLkW3evlDsnIg/ZAdUUf6UCXDtjqpI/dquzAT4WNX3yzS/GLciVNbT75H4pj8hLOV0EpHtzw==

    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.

    The table below summarises the contents of an approved response.

    Field Description Example
    callback The URI callback that will handle the result. 'interapp-callback://result'
    status The status of the transaction. 'success'
    message A string containing information about the transaction status. 'Transaction successful'
    action Sale transaction. 'sale'
    clientTransactionId The client transaction ID. '12345678901234567890123456789012'
    amount The amount in cents without any decimal digits. '1200' = 12 euro
    tipAmount How much of the amount in cents is considered as tip without any decimal digits. '200' = 2 euro
    verificationMethod The verification method used.

    Possible values: CHIP, CONTACTLESS, MAGNETIC, MANUAL ENTRY
    'CONTACTLESS'
    rrn The Retrieval Reference Number of the transaction RRN. '123456833121'
    cardType The card type. 'Debit Mastercard'
    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. '537489******1831'
    referenceNumber A 6-digit number indicating the transaction's STAN number. '833121'
    authorisationCode A 6-digit number indicating the transaction's Authorisation code provided by the host. '690882'
    tid A 12 character string indicating the terminal's TID number. '16016684'
    orderCode The order code. '1091166300000136'
    shortOrderCode The order code in short format. '1091166300'
    installments Number of card installments. '10'
    transactionDate The transaction date in ISO 8601 format. '2019-09-13T12:14:19.8703452+03:00'
    transactionId A unique identifier for the transaction. 'a78e045c-49c3-4743-9071-f1e0ed71810c'
    appId The application id that was used for the transaction. A0000000041010
    aadeTransactionId An AADE-specific transaction ID.

    Format: Acquirer Unique code + RRN + Authorization code.

    Example: ‘116’ + ‘123456833121’ + ‘690882’ = '116123456833121690882'
    '116123456833121690882'

    Examples

    A sale response result for an approved transaction looks as follows:

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

    It is expected that certain transactions will fail for various reasons. A Sale response result for a failed transaction looks as follows:

    The structure of the 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.

    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!