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.