1.2.1. GooglePay\ApplePay

Google Pay and Apple Pay are digital wallets from different companies. Both are secure, contactless payment systems that allow users to pay with their devices instead of physical cards by converting cards into digital codes. To use Apple Pay, you add cards to the Wallet app on Apple devices, while Google Pay uses the Google Pay app to facilitate payments via NFC or QR codes.

To perform the generic sale operation, please follow the instructions described in the article 1.1.1. Sale Transactions

Below are described the changes required to be made to the generic sale request to support Google Pay or Apple Pay Sale transaction.

The main difference is that the card data does not need to be provided in the request and alternatively, the payment data received from Apple Pay or Google Pay must be passed in the payment_data field.

Along with the payment_data field, a payment_data_type field also needs to be provided which indicates the type of data that was transferred to the payment_data field.

Sale Request Parameters

Parameter Type Comment Necessity*
payment_data String
[JSON stringify in base64]
Data that was received from the service Conditional
payment_data_type String Indicates the type of data that was transferred to the payment_data field.

Possible meanings:
applepay_encrypted
applepay_decrypted
googlepay_encrypted
googlepay_decrypted
Conditional

Depending on the value of payment_data_type field, the appropriate processing algorithms and, if necessary, decryption keys will be applied.

If the data and the specification method do not match, we will not be able to process the data correctly, which will cause an error in the system and the transaction will be rejected in processing.

Step by step collecting payment_data field

Sale Request with googlepay_decrypted

Step 1: After decrypting the payload, the merchant gets the following data

{
  "messageExpiration" : "1758537951177",
  "messageId" : "AH2EjtdwD7yt8YzY0fJaw7s4QzlkjC_uFUnxJRyZioe9Ekpce719sqHdYJ92KPhSqn49z6Py6huWQMIufdH7WH6cJVaWwHeC83zsuDamDAFjZ62BMWjMvOY",
  "paymentMethod": "CARD",
  "paymentMethodDetails":{
    "expirationYear":2027,
    "expirationMonth":12,
    "pan":"4111111111111111",
    "authMethod":"PAN_ONLY"}
}

Step 2: Convert the above parameters to string format

{"messageExpiration":"1758537951177","messageId":"AH2EjtdwD7yt8YzY0fJaw7s4QzlkjC_uFUnxJRyZioe9Ekpce719sqHdYJ92KPhSqn49z6Py6huWQMIufdH7WH6cJVaWwHeC83zsuDamDAFjZ62BMWjMvOY","paymentMethod":"CARD","paymentMethodDetails":{"expirationYear":2027,"expirationMonth":12,"pan":"4111111111111111","authMethod":"PAN_ONLY"}}

Step 3: Encode the resulting string into base64

eyJtZXNzYWdlRXhwaXJhdGlvbiI6IjE3NTg1Mzc5NTExNzciLCJtZXNzYWdlSWQiOiJBSDJFanRkd0Q3eXQ4WXpZMGZKYXc3czRRemxrakNfdUZVbnhKUnlaaW9lOUVrcGNlNzE5c3FIZFlKOTJLUGhTcW40OXo2UHk2aHVXUU1JdWZkSDdXSDZjSlZhV3dIZUM4M3pzdURhbURBRmpaNjJCTVdqTXZPWSIsInBheW1lbnRNZXRob2QiOiJDQVJEIiwicGF5bWVudE1ldGhvZERldGFpbHMiOnsiZXhwaXJhdGlvblllYXIiOjIwMjcsImV4cGlyYXRpb25Nb250aCI6MTIsInBhbiI6IjQxMTExMTExMTExMTExMTEiLCJhdXRoTWV0aG9kIjoiUEFOX09OTFkifX0=

Example

&client_orderid=***
&order_desc=****
&address1=***
&city=***
&state=***
&zip_code=***
&country=***
&phone=***  
&amount=***
&email=***
&first_name=John
&last_name=Doe
¤cy=***
&ipaddress=***
&site_url=***
&redirect_url=***
&redirect_success_url=*** 
&redirect_fail_url=***
&server_callback_url=***
&control=***
&customer_browser_color_depth=***
&customer_browser_java_enabled=***
&customer_browser_accept_header=***
&customer_browser_javascript_enabled=***
&customer_browser_accept_language=***
&customer_browser_screen_height=***
&customer_browser_screen_width=***
&customer_browser_time_zone=***
&customer_browser_user_agent=***
&customer_browser_info=***
&payment_data=eyJtZXNzYWdlRXhwaXJhdGlvbiI6IjE3NTg1Mzc5NTExNzciLCJtZXNzYWdlSWQiOiJBSDJFanRkd0Q3eXQ4WXpZMGZKYXc3czRRemxrakNfdUZVbnhKUnlaaW9lOUVrcGNlNzE5c3FIZFlKOTJLUGhTcW40OXo2UHk2aHVXUU1JdWZkSDdXSDZjSlZhV3dIZUM4M3pzdURhbURBRmpaNjJCTVdqTXZPWSIsInBheW1lbnRNZXRob2QiOiJDQVJEIiwicGF5bWVudE1ldGhvZERldGFpbHMiOnsiZXhwaXJhdGlvblllYXIiOjIwMjcsImV4cGlyYXRpb25Nb250aCI6MTIsInBhbiI6IjQxMTExMTExMTExMTExMTEiLCJhdXRoTWV0aG9kIjoiUEFOX09OTFkifX0= 
&payment_data_type=googlepay_decrypted

Sale Request with googlepay_encrypted

Please note that with this method the merchant is required to send their keys or certificates to technical support, for correct endpoint configuration.

Otherwise, the host will not be able to decrypt the payment data.

Step 1: The merchant receives the following data set from Google Pay

{
  "signature": "MEUCIQCv/vR6XzpXcFxk16KJxS4vcM1EbThSxF6zlfIyHTwwoAIgZR01G18NFCXPbnRPgYcXQgM4sG5+xI+OibgTQEjGUNA=",
  "intermediateSigningKey": {
      "signedKey": "{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEXHONvIO4iQ/w8SNaxJ5Kn7wFCYQrqXMVrwrJO9XcPmS1ccbwTx5RlPVJjeP5uakGguaefxjjs/pdpevd5KAQQ\\u003d\\u003d\",\"keyExpiration\":\"1758612685813\"}",
      "signatures": [
          "MEQCIAiEkiflmvILqxzjVnkQCAIY+WgeS4o1O/AbE5aDHkj2AiBT4PACu7knktWuhsFVK2Vlc4jAZGktVsY0kC313WggIQ=="
      ]
  },
  "protocolVersion": "ECv2",
  "signedMessage": "{\"encryptedMessage\":\"ZrqUDk+fatoTul4zausrZyH9zpZ06+3TkVN2DQPrTZ2MbwncSdDei6RgXMvAuI5e5dKnzqXHEKUV3hj+cg7NqG/tNQg/wrq1g6EvaV2zXkuOW8mgfDYp16bZLeTRtPeSaRPKqUshmYbnEVjc0qeE918xrJH8ZusTwxOetjOnDaedMKO3xeBuklQJXSwHucmJTA+QjVvbbggKdo+WSp6LLKoekVlLPVd9kLeWbuYXqHF+d092LorZFsRMyhAfC0RS+ywRGmOcCB9mr7g+KJJJj6UEZFzLew0qHrOo2UPBGzlq8vt6PJNs2B/1B+3FG8qdcWHQ+v8/aoRy1c9hibNJwYlxUsxhjK9Oao8IsQwMW0X8554g5go3hBwDXDqrXMkFxNTYIpQu6HEG8iPba3jD7JTeNnHioVQ\\u003d\",\"ephemeralPublicKey\":\"BC7FJOKlsHXt1AQJocAaQB1989xEiQXOdsLEh+HbCURzIWrvCockhCaoFIapC8vlTmcdJ+iAjDPgE242tuHFA44\\u003d\",\"tag\":\"8xBi2n+uVo8REqy87gKml7fSt9n8VZ0wXlpYEki1Kmg\\u003d\"}"
}

Step 2: Convert the above parameters to string format

{"signature": "MEUCIQCv/vR6XzpXcFxk16KJxS4vcM1EbThSxF6zlfIyHTwwoAIgZR01G18NFCXPbnRPgYcXQgM4sG5+xI+OibgTQEjGUNA=", "intermediateSigningKey": {"signedKey": "{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEXHONvIO4iQ/w8SNaxJ5Kn7wFCYQrqXMVrwrJO9XcPmS1ccbwTx5RlPVJjeP5uakGguaefxjjs/pdpevd5KAQQ\\u003d\\u003d\",\"keyExpiration\":\"1758612685813\"}", "signatures": ["MEQCIAiEkiflmvILqxzjVnkQCAIY+WgeS4o1O/AbE5aDHkj2AiBT4PACu7knktWuhsFVK2Vlc4jAZGktVsY0kC313WggIQ=="]}, "protocolVersion": "ECv2", "signedMessage": "{\"encryptedMessage\":\"ZrqUDk+fatoTul4zausrZyH9zpZ06+3TkVN2DQPrTZ2MbwncSdDei6RgXMvAuI5e5dKnzqXHEKUV3hj+cg7NqG/tNQg/wrq1g6EvaV2zXkuOW8mgfDYp16bZLeTRtPeSaRPKqUshmYbnEVjc0qeE918xrJH8ZusTwxOetjOnDaedMKO3xeBuklQJXSwHucmJTA+QjVvbbggKdo+WSp6LLKoekVlLPVd9kLeWbuYXqHF+d092LorZFsRMyhAfC0RS+ywRGmOcCB9mr7g+KJJJj6UEZFzLew0qHrOo2UPBGzlq8vt6PJNs2B/1B+3FG8qdcWHQ+v8/aoRy1c9hibNJwYlxUsxhjK9Oao8IsQwMW0X8554g5go3hBwDXDqrXMkFxNTYIpQu6HEG8iPba3jD7JTeNnHioVQ\\u003d\",\"ephemeralPublicKey\":\"BC7FJOKlsHXt1AQJocAaQB1989xEiQXOdsLEh+HbCURzIWrvCockhCaoFIapC8vlTmcdJ+iAjDPgE242tuHFA44\\u003d\",\"tag\":\"8xBi2n+uVo8REqy87gKml7fSt9n8VZ0wXlpYEki1Kmg\\u003d\"}"}

Step 3: Encode the resulting string into base64

eyJzaWduYXR1cmUiOiAiTUVVQ0lRQ3YvdlI2WHpwWGNGeGsxNktKeFM0dmNNMUViVGhTeEY2emxmSXlIVHd3b0FJZ1pSMDFHMThORkNYUGJuUlBnWWNYUWdNNHNHNSt4SStPaWJnVFFFakdVTkE9IiwgImludGVybWVkaWF0ZVNpZ25pbmdLZXkiOiB7InNpZ25lZEtleSI6ICJ7XCJrZXlWYWx1ZVwiOlwiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhIT052SU80aVEvdzhTTmF4SjVLbjd3RkNZUXJxWE1WcndySk85WGNQbVMxY2Nid1R4NVJsUFZKamVQNXVha0dndWFlZnhqanMvcGRwZXZkNUtBUVFcXHUwMDNkXFx1MDAzZFwiLFwia2V5RXhwaXJhdGlvblwiOlwiMTc1ODYxMjY4NTgxM1wifSIsICJzaWduYXR1cmVzIjogWyJNRVFDSUFpRWtpZmxtdklMcXh6alZua1FDQUlZK1dnZVM0bzFPL0FiRTVhREhrajJBaUJUNFBBQ3U3a25rdFd1aHNGVksyVmxjNGpBWkdrdFZzWTBrQzMxM1dnZ0lRPT0iXX0sICJwcm90b2NvbFZlcnNpb24iOiAiRUN2MiIsICJzaWduZWRNZXNzYWdlIjogIntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcIlpycVVEaytmYXRvVHVsNHphdXNyWnlIOXpwWjA2KzNUa1ZOMkRRUHJUWjJNYnduY1NkRGVpNlJnWE12QXVJNWU1ZEtuenFYSEVLVVYzaGorY2c3TnFHL3ROUWcvd3JxMWc2RXZhVjJ6WGt1T1c4bWdmRFlwMTZiWkxlVFJ0UGVTYVJQS3FVc2htWWJuRVZqYzBxZUU5MTh4ckpIOFp1c1R3eE9ldGpPbkRhZWRNS08zeGVCdWtsUUpYU3dIdWNtSlRBK1FqVnZiYmdnS2RvK1dTcDZMTEtvZWtWbExQVmQ5a0xlV2J1WVhxSEYrZDA5MkxvclpGc1JNeWhBZkMwUlMreXdSR21PY0NCOW1yN2crS0pKSmo2VUVaRnpMZXcwcUhyT28yVVBCR3pscTh2dDZQSk5zMkIvMUIrM0ZHOHFkY1dIUSt2OC9hb1J5MWM5aGliTkp3WWx4VXN4aGpLOU9hbzhJc1F3TVcwWDg1NTRnNWdvM2hCd0RYRHFyWE1rRnhOVFlJcFF1NkhFRzhpUGJhM2pEN0pUZU5uSGlvVlFcXHUwMDNkXCIsXCJlcGhlbWVyYWxQdWJsaWNLZXlcIjpcIkJDN0ZKT0tsc0hYdDFBUUpvY0FhUUIxOTg5eEVpUVhPZHNMRWgrSGJDVVJ6SVdydkNvY2toQ2FvRklhcEM4dmxUbWNkSitpQWpEUGdFMjQydHVIRkE0NFxcdTAwM2RcIixcInRhZ1wiOlwiOHhCaTJuK3VWbzhSRXF5ODdnS21sN2ZTdDluOFZaMHdYbHBZRWtpMUttZ1xcdTAwM2RcIn0ifQ

Example

The complete request should look like this

curl --location 'https://api.fyst.watch/paynet/api/v2/sale/[ENDPOINT]' 
--header 'Content-Type: application/x-www-form-urlencoded' 
&client_orderid=***
&order_desc=****
&address1=***
&city=***
&state=***
&zip_code=***
&country=***
&phone=***
&amount=***
&email=***
&first_name=John
&last_name=Doe
¤cy=***
&ipaddress=***
&site_url=***
&redirect_url=***
&redirect_success_url=***
&redirect_fail_url=***
&server_callback_url=***
&control=***
&customer_browser_color_depth=***
&customer_browser_java_enabled=***
&customer_browser_accept_header=***
&customer_browser_javascript_enabled=***
&customer_browser_accept_language=***
&customer_browser_screen_height=***
&customer_browser_screen_width=***
&customer_browser_time_zone=***
&customer_browser_user_agent=***
&customer_browser_info=***
&payment_data=eyJzaWduYXR1cmUiOiAiTUVVQ0lRQ3YvdlI2WHpwWGNGeGsxNktKeFM0dmNNMUViVGhTeEY2emxmSXlIVHd3b0FJZ1pSMDFHMThORkNYUGJuUlBnWWNYUWdNNHNHNSt4SStPaWJnVFFFakdVTkE9IiwgImludGVybWVkaWF0ZVNpZ25pbmdLZXkiOiB7InNpZ25lZEtleSI6ICJ7XCJrZXlWYWx1ZVwiOlwiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhIT052SU80aVEvdzhTTmF4SjVLbjd3RkNZUXJxWE1WcndySk85WGNQbVMxY2Nid1R4NVJsUFZKamVQNXVha0dndWFlZnhqanMvcGRwZXZkNUtBUVFcXHUwMDNkXFx1MDAzZFwiLFwia2V5RXhwaXJhdGlvblwiOlwiMTc1ODYxMjY4NTgxM1wifSIsICJzaWduYXR1cmVzIjogWyJNRVFDSUFpRWtpZmxtdklMcXh6alZua1FDQUlZK1dnZVM0bzFPL0FiRTVhREhrajJBaUJUNFBBQ3U3a25rdFd1aHNGVksyVmxjNGpBWkdrdFZzWTBrQzMxM1dnZ0lRPT0iXX0sICJwcm90b2NvbFZlcnNpb24iOiAiRUN2MiIsICJzaWduZWRNZXNzYWdlIjogIntcImVuY3J5cHRlZE1lc3NhZ2VcIjpcIlpycVVEaytmYXRvVHVsNHphdXNyWnlIOXpwWjA2KzNUa1ZOMkRRUHJUWjJNYnduY1NkRGVpNlJnWE12QXVJNWU1ZEtuenFYSEVLVVYzaGorY2c3TnFHL3ROUWcvd3JxMWc2RXZhVjJ6WGt1T1c4bWdmRFlwMTZiWkxlVFJ0UGVTYVJQS3FVc2htWWJuRVZqYzBxZUU5MTh4ckpIOFp1c1R3eE9ldGpPbkRhZWRNS08zeGVCdWtsUUpYU3dIdWNtSlRBK1FqVnZiYmdnS2RvK1dTcDZMTEtvZWtWbExQVmQ5a0xlV2J1WVhxSEYrZDA5MkxvclpGc1JNeWhBZkMwUlMreXdSR21PY0NCOW1yN2crS0pKSmo2VUVaRnpMZXcwcUhyT28yVVBCR3pscTh2dDZQSk5zMkIvMUIrM0ZHOHFkY1dIUSt2OC9hb1J5MWM5aGliTkp3WWx4VXN4aGpLOU9hbzhJc1F3TVcwWDg1NTRnNWdvM2hCd0RYRHFyWE1rRnhOVFlJcFF1NkhFRzhpUGJhM2pEN0pUZU5uSGlvVlFcXHUwMDNkXCIsXCJlcGhlbWVyYWxQdWJsaWNLZXlcIjpcIkJDN0ZKT0tsc0hYdDFBUUpvY0FhUUIxOTg5eEVpUVhPZHNMRWgrSGJDVVJ6SVdydkNvY2toQ2FvRklhcEM4dmxUbWNkSitpQWpEUGdFMjQydHVIRkE0NFxcdTAwM2RcIixcInRhZ1wiOlwiOHhCaTJuK3VWbzhSRXF5ODdnS21sN2ZTdDluOFZaMHdYbHBZRWtpMUttZ1xcdTAwM2RcIn0ifQ 
&payment_data_type=googlepay_encrypted

The order for a transaction using the Apple Pay method is generated according to the same principles as those described above for the Google Pay method.