{"id":31933236,"url":"https://github.com/tap-payments/gosellsdk-android","last_synced_at":"2025-10-14T05:53:15.529Z","repository":{"id":43352453,"uuid":"122467714","full_name":"Tap-Payments/goSellSDK-Android","owner":"Tap-Payments","description":"goSell Android SDK","archived":false,"fork":false,"pushed_at":"2024-03-11T07:50:28.000Z","size":4363,"stargazers_count":18,"open_issues_count":4,"forks_count":15,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-03-11T08:56:25.510Z","etag":null,"topics":["android","api","gosell","payments","sdk","tap","tappayments"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tap-Payments.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-02-22T11:05:57.000Z","updated_at":"2023-10-14T14:21:03.000Z","dependencies_parsed_at":"2024-03-11T08:57:33.744Z","dependency_job_id":null,"html_url":"https://github.com/Tap-Payments/goSellSDK-Android","commit_stats":null,"previous_names":[],"tags_count":113,"template":false,"template_full_name":null,"purl":"pkg:github/Tap-Payments/goSellSDK-Android","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tap-Payments%2FgoSellSDK-Android","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tap-Payments%2FgoSellSDK-Android/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tap-Payments%2FgoSellSDK-Android/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tap-Payments%2FgoSellSDK-Android/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tap-Payments","download_url":"https://codeload.github.com/Tap-Payments/goSellSDK-Android/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tap-Payments%2FgoSellSDK-Android/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279018002,"owners_count":26086237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","api","gosell","payments","sdk","tap","tappayments"],"created_at":"2025-10-14T05:52:41.224Z","updated_at":"2025-10-14T05:53:15.512Z","avatar_url":"https://github.com/Tap-Payments.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goSell Android SDK\nAndroid SDK to use [goSell API][1].\n\n[![Platform](https://img.shields.io/badge/platform-Android-inactive.svg?style=flat)](https://tap-payments.github.io/goSellSDK-Android/)\n[![Build Status](https://travis-ci.org/Tap-Payments/goSellSDK-Android.svg?branch=master)](https://travis-ci.org/Tap-Payments/goSellSDK-Android/builds/508932837)\n[![Documentation](https://img.shields.io/badge/documentation-100%25-bright%20green.svg)](https://tap-payments.github.io/goSellSDK-Android/)\n[![SDK Version](https://img.shields.io/badge/minSdkVersion-16-blue.svg)](https://stuff.mit.edu/afs/sipb/project/android/docs/reference/packages.html)\n[![SDK Version](https://img.shields.io/badge/targetSdkVersion-28-informational.svg)](https://stuff.mit.edu/afs/sipb/project/android/docs/reference/packages.html)\n\nA library that fully covers payment/authorization/card saving process inside your Android application\n\n# Table of Contents\n---\n\n1. [Requirements](#requirements)\n2. [Installation](#installation)\n   1. [Include goSellSDK library as a dependency module in your project](#include_library_to_code_locally)\n   2. [Installation with jitpack](#installation_with_jitpack)\n\n3. [Setup](#setup)\n    1. [goSellSDK Class Properties](#setup_gosellsdk_class_properties)\n4. [Usage](#usage)\n    1. [Configure SDK with Required Data](#configure_sdk_with_required_data)\n    2. [Configure SDK Look and Feel](#configure_sdk_look_and_feel)\n    3. [Configure SDK Session](#configure_sdk_Session)\n    4. [Configure SDK Transaction Mode](#configure_sdk_transaction_mode)\n    5. [Use Tap PayButton](#init_pay_button)\n    6. [List Saved Cards](#list_saved_cards)\n    6. [Open SDK Interfaces](#sdk_open_interfaces)\n    7. [Open SDK ENUMs](#sdk_open_enums)\n    8. [Open SDK Models](#sdk_open_models)\n5. [SDKSession Delegate](#sdk_delegate)\n    1. [Payment Success Callback](#payment_success_callback)\n    2. [Payment Failure Callback](#payment_failure_callback)\n    3. [Authorization Success Callback](#authorization_success_callback)\n    4. [Authorization Failure Callback](#authorization_failure_callback)\n    5. [Card Saving Success Callback](#card_saving_success_callback)\n    6. [Card Saving Failure Callback](#card_saving_failure_callback)\n    7. [Card Tokenized Success Callback](#card_tokenized_success_callback)\n    8. [Saved Cards List Callback](#saved_cards_list_callback)\n    9. [Session Other Failure Callback](#session_error_callback)\n    10. [Invalid Card Details](#invalid_card_details)\n    11. [Backend Un-known Error](#backecnd_unknow_error)\n    12. [Invalid Transaction Mode](#invalid_transaction_mode)\n    13. [Session Is Starting Callback](#session_is_starting_callback)\n    14. [Session Has Started Callback](#session_has_started_callback)\n    15. [Session Failed To Start Callback](#session_failed_to_start_callback)\n    16. [Session Cancel Callback](#session_cancel_callback)\n    17. [User Enabled Save CARD](#user_enabled_save_card_option)\n    18. [Asynch_Payment_Callback](#asyncPaymentStarted_callback)\n    19. [Payment_Initiated_Callback](#paymentInitiated_callback)\n\n\n6. [Documentation](#docs)\n\n\n\u003ca name=\"requirements\"\u003e\u003c/a\u003e\n# Requirements\n---\nTo use the SDK the following requirements must be met:\n\n1. **Android Studio 3.3** or newer\n2. **Android SDK Tools 26.1.1** or newer\n3. **Android Platform Version: API 28: Android 9.0 (Pie) revision 6** or later\n4. **Build gradle:3.5.0\n\n\u003ca name=\"installation\"\u003e\u003c/a\u003e\n# Installation\n---\n\u003ca name=\"include_library_to_code_locally\"\u003e\u003c/a\u003e\n### Include goSellSDK library as a dependency module in your project\n---\n1. Clone goSellSDK library from Tap repository\n   ```\n       git@github.com:Tap-Payments/goSellSDK-Android.git\n    ```\n2. Add goSellSDK library to your project settings.gradle file as following\n    ```java\n        include ':library', ':YourAppName'\n    ```\n3. Setup your project to include goSellSDK as a dependency Module.\n   1. File -\u003e Project Structure -\u003e Modules -\u003e \u003c\u003c your project name \u003e\u003e\n   2. Dependencies -\u003e click on **+** icon in the screen bottom -\u003e add Module Dependency\n   3. select goSellSDK library\n\n\u003ca name=\"installation_with_jitpack\"\u003e\u003c/a\u003e\n### Installation with JitPack\n---\n[JitPack](https://jitpack.io/) is a novel package repository for JVM and Android projects. It builds Git projects on demand and provides you with ready-to-use artifacts (jar, aar).\n\nTo integrate goSellSDK into your project add it in your **root** `build.gradle` at the end of repositories:\n```java\n\tallprojects {\n\t\trepositories {\n\t\t\t...\n\t\t\tmaven { url 'https://jitpack.io' }\n\t\t}\n\t}\n```\nStep 2. Add the dependency\n```java\n\tdependencies {\n\t         implementation 'com.github.Tap-Payments:goSellSDK-Android:2.17.0'\n\t}\n```\n\n# Note\n---\nRegarding to this Issue \" Google throws this exception on Activity's onCreate method after v27, their meaning is if an Activity is translucent or floating, its orientation should be relied on parent(background) so, Activity can't make      decision on itself. Even if you remove android:screenOrientation=\"portrait\" from the floating or translucent Activity In android Oreo (API 26) you can not change orientation for Activity that offer translucent.\n\nYour Activity that launches the SDK has to set orientation to Portrait, becuase our SDK is just a child to your actvity in case of translucent mode.\n\n\n\u003ca name=\"setup\"\u003e\u003c/a\u003e\n# Setup\n---\nFirst of all, `goSellSDK` should be set up. In this section secret key and application ID are required.\n\n\u003ca name=\"setup_gosellsdk_class_properties\"\u003e\u003c/a\u003e\n## goSellSDK Class Properties\nFirst of all, `goSellSDK` should be set up. To set it up, add the following lines of code somewhere in your project and make sure they will be called before any usage of `goSellSDK`.\n\nBelow is the list of properties in goSellSDK class you can manipulate. Make sure you do the setup before any usage of the SDK.\n\n\u003ca name=\"setup_gosellsdk_class_properties_secret_key\"\u003e\u003c/a\u003e\n### Secret Key and Application ID\n\nTo set it up, add the following line of code somewhere in your project and make sure it will be called before any usage of `goSellSDK`, otherwise an exception will be thrown. **Required**.\n\n*Java:*\n\n```java\n    GoSellSDK.init(context, \"sk_XXXXXXXXXXXXXXXXXXXXXXXX\",\"app_id\");\n```\n*Kotlin:*\n\n```kotlin\n    GoSellSDK.init(context, \"sk_XXXXXXXXXXXXXXXXXXXXXXXX\",\"app_id\")\n```\n1. **`authToken`** - to authorize your requests.// Secret key (format: \"sk_XXXXXXXXXXXXXXXXXXXXXXXX\")\n2. **`app_id`** - replace it using your application ID \"Application main package\".\n\nDon't forget to import the class at the beginning of the file:\n\n*Java:*\n\n```java\n import company.tap.gosellapi.GoSellSDK;\n```\n*Kotlin:*\n\n```kotlin\n import company.tap.gosellapi.GoSellSDK\n```\n\u003ca name=\"setup_gosellsdk_class_properties_mode\"\u003e\u003c/a\u003e\n### Mode\n\nSDK mode defines which mode SDK is operating in, either **sandbox** or **production**.\n\nSDK Mode is automatically identified in the backend based on the secrete key you defined earlier in setup process.\n\n\u003ca name=\"setup_gosellsdk_class_properties_language\"\u003e\u003c/a\u003e\n\nLocalization language of the UI part of the SDK. This is locale identifier.\n\nMake sure it consists only from 2 lowercased letters and is presented in the list of **availableLanguages** property of *goSellSDK* class.\n\n**Notice:** SDK user interface layout direction is behave similar to your App. There is no effect come form the SDK back to your application locale. \n\n\u003ca name=\"usage\"\u003e\u003c/a\u003e\n#Usage\n---\n\u003ca name=\"configure_sdk_with_required_data\"\u003e\u003c/a\u003e\n### Configure SDK With Required Data\n\n`goSellSDK` should be set up. To set it up, add the following lines of code somewhere in your project and make sure they will be called before any usage of `goSellSDK`.\n\n*Java:*\n```java\n\n    /**\n     * Integrating SDK.\n     */\n    private void startSDK(){\n        /**\n         * Required step.\n         * Configure SDK with your Secret API key and App Bundle name registered with tap company.\n         */\n        configureApp();\n\n        /**\n         * Optional step\n         * Here you can configure your app theme (Look and Feel).\n         */\n        configureSDKThemeObject();\n\n        /**\n         * Required step.\n         * Configure SDK Session with all required data.\n         */\n        configureSDKSession();\n\n        /**\n         * Required step.\n         * Choose between different SDK modes\n         */\n        configureSDKMode();\n\n        /**\n         * If you included Tap Pay Button then configure it first, if not then ignore this step.\n         */\n        initPayButton();\n    }\n\n\n\n```\n\n*Kotlin:*\n```kotlin\n\n    /**\n     * Integrating SDK.\n     */\n    private fun startSDK(){\n        /**\n         * Required step.\n         * Configure SDK with your Secret API key and App Bundle name registered with tap company.\n         */\n        configureApp()\n\n        /**\n         * Optional step\n         * Here you can configure your app theme (Look and Feel).\n         */\n        configureSDKThemeObject()\n\n        /**\n         * Required step.\n         * Configure SDK Session with all required data.\n         */\n        configureSDKSession()\n\n        /**\n         * Required step.\n         * Choose between different SDK modes\n         */\n        configureSDKMode()\n\n        /**\n         * If you included Tap Pay Button then configure it first, if not then ignore this step.\n         */\n        initPayButton()\n    }\n\n\n\n```\n\nBelow is the list of properties in goSellSDK class you can manipulate. Make sure you do the setup before any usage of the SDK.\n\n\u003ca name=\"setup_gosellsdk_class_properties_secret_key\"\u003e\u003c/a\u003e\n### Configure SDK Secret Key and Application ID and SDK Language\n\nTo set it up, add the following line of code somewhere in your project and make sure it will be called before any usage of `goSellSDK`, otherwise an exception will be thrown. **Required**.\n\nIf you wish to localize the sdk following languages are available **English, Arabic , German,Turkish** and this has to be passed as below ,if locale not passed then default locale **EN** will be used.\n\n*Java:*\n```java\n     /**\n         * Required step.\n         * Configure SDK with your Secret API key and App Bundle name registered with tap company.\n         */\n        private void configureApp(){\n            GoSellSDK.init(this, \"sk_test_kovrMB0mupFJXfNZWx6Etg5y\",\"company.tap.goSellSDKExample\");  // to be replaced by merchant\n            GoSellSDK.setLocale(\"ar\");//  if you dont pass locale then default locale EN will be used\n        }\n```\n*Kotlin:*\n```kotlin\n     /**\n         * Required step.\n         * Configure SDK with your Secret API key and App Bundle name registered with tap company.\n         */\n        private fun configureApp(){\n            GoSellSDK.init(this, \"sk_test_kovrMB0mupFJXfNZWx6Etg5y\",\"company.tap.goSellSDKExample\")  // to be replaced by merchant\n            GoSellSDK.setLocale(\"ar\")//  if you dont pass locale then default locale EN will be used\n        }\n```\n\n1. **`authToken`** - to authorize your requests.// Secret key (format: \"sk_XXXXXXXXXXXXXXXXXXXXXXXX\")\n2. **`app_id`** - replace it using your application ID \"Application main package\".\n\nDon't forget to import the class at the beginning of the file:\n\n*Java:*\n\n```java\n import company.tap.gosellapi.GoSellSDK;\n```\n*Kotlin:*\n\n```kotlin\n import company.tap.gosellapi.GoSellSDK\n```\n\n\u003ca name=\"configure_sdk_look_and_feel\"\u003e\u003c/a\u003e\n### Configure SDK Look and Feel\n To customize the SDK look and feel you must use **ThemeObject** and populate it as following:\n\n*Java:*\n ```java\n       private void configureSDKThemeObject() {\n\n          ThemeObject.getInstance()\n\n          // set Appearance mode [Full Screen Mode - Windowed Mode]\n          .setAppearanceMode(AppearanceMode.WINDOWED_MODE) // **Required**\n\n           .setSdkLanguage(\"ar\") //if you dont pass locale then default locale EN will be used\n\n          // Setup header font type face **Make sure that you already have asset folder with required fonts**\n          .setHeaderFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\"))//**Optional**\n\n          //Setup header text color\n          .setHeaderTextColor(getResources().getColor(R.color.black1))  // **Optional**\n\n          // Setup header text size\n          .setHeaderTextSize(17) // **Optional**\n\n          // setup header background\n          .setHeaderBackgroundColor(getResources().getColor(R.color.french_gray_new))//**Optional**\n\n          // setup card form input font type\n          .setCardInputFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\"))//**Optional**\n\n          // setup card input field text color\n          .setCardInputTextColor(getResources().getColor(R.color.black))//**Optional**\n\n          // setup card input field text color in case of invalid input\n          .setCardInputInvalidTextColor(getResources().getColor(R.color.red))//**Optional**\n\n          // setup card input hint text color\n          .setCardInputPlaceholderTextColor(getResources().getColor(R.color.black))//**Optional**\n\n          // setup Switch button Thumb Tint Color in case of Off State\n          .setSaveCardSwitchOffThumbTint(getResources().getColor(R.color.gray)) // **Optional**\n\n          // setup Switch button Thumb Tint Color in case of On State\n          .setSaveCardSwitchOnThumbTint(getResources().getColor(R.color.vibrant_green)) // **Optional**\n\n          // setup Switch button Track Tint Color in case of Off State\n          .setSaveCardSwitchOffTrackTint(getResources().getColor(R.color.gray)) // **Optional**\n\n          // setup Switch button Track Tint Color in case of On State\n          .setSaveCardSwitchOnTrackTint(getResources().getColor(R.color.green)) // **Optional**\n\n          // change scan icon\n          .setScanIconDrawable(getResources().getDrawable(R.drawable.btn_card_scanner_normal)) // **Optional**\n       \n         //Show or hide the scanner\n        .setCardScannerIconVisible(true) // **Optional**\n\n          // setup pay button selector [ background - round corner ]\n          .setPayButtonResourceId(R.drawable.btn_pay_selector)\n\n          // setup pay button font type face\n          .setPayButtonFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\")) // **Optional**\n\n          // setup pay button disable title color\n          .setPayButtonDisabledTitleColor(getResources().getColor(R.color.black)) // **Optional**\n\n          // setup pay button enable title color\n          .setPayButtonEnabledTitleColor(getResources().getColor(R.color.White)) // **Optional**\n\n          //setup pay button text size\n          .setPayButtonTextSize(14) // **Optional**\n\n          // show/hide pay button loader\n          .setPayButtonLoaderVisible(true) // **Optional**\n\n          // show/hide pay button security icon\n          .setPayButtonSecurityIconVisible(true) // **Optional**\n\n          // set the text on pay button\n          .setPayButtonText(\"PAY BTN CAN BE VERY VERY VERY  LONGGGG LONGGGGG\") // **Optional**\n\n          // setup dialog textcolor and textsize\n           .setDialogTextColor(getResources().getColor(R.color.black1))     // **Optional**\n           .setDialogTextSize(17)                // **Optional**\n      ;\n\n          }\n ```\n \n *Kotlin:*\n \n ```kotlin\n       private fun configureSDKThemeObject() {\n\n          ThemeObject.getInstance()\n\n          // set Appearance mode [Full Screen Mode - Windowed Mode]\n          .setAppearanceMode(AppearanceMode.WINDOWED_MODE) // **Required**\n\n           .setSdkLanguage(\"ar\") //if you dont pass locale then default locale EN will be used\n\n          // Setup header font type face **Make sure that you already have asset folder with required fonts**\n          .setHeaderFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\"))//**Optional**\n\n          //Setup header text color\n          .setHeaderTextColor(getResources().getColor(R.color.black1))  // **Optional**\n\n          // Setup header text size\n          .setHeaderTextSize(17) // **Optional**\n\n          // setup header background\n          .setHeaderBackgroundColor(getResources().getColor(R.color.french_gray_new))//**Optional**\n\n          // setup card form input font type\n          .setCardInputFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\"))//**Optional**\n\n          // setup card input field text color\n          .setCardInputTextColor(getResources().getColor(R.color.black))//**Optional**\n\n          // setup card input field text color in case of invalid input\n          .setCardInputInvalidTextColor(getResources().getColor(R.color.red))//**Optional**\n\n          // setup card input hint text color\n          .setCardInputPlaceholderTextColor(getResources().getColor(R.color.black))//**Optional**\n\n          // setup Switch button Thumb Tint Color in case of Off State\n          .setSaveCardSwitchOffThumbTint(getResources().getColor(R.color.gray)) // **Optional**\n\n          // setup Switch button Thumb Tint Color in case of On State\n          .setSaveCardSwitchOnThumbTint(getResources().getColor(R.color.vibrant_green)) // **Optional**\n\n          // setup Switch button Track Tint Color in case of Off State\n          .setSaveCardSwitchOffTrackTint(getResources().getColor(R.color.gray)) // **Optional**\n\n          // setup Switch button Track Tint Color in case of On State\n          .setSaveCardSwitchOnTrackTint(getResources().getColor(R.color.green)) // **Optional**\n\n          // change scan icon\n          .setScanIconDrawable(getResources().getDrawable(R.drawable.btn_card_scanner_normal)) // **Optional**\n\n          // setup pay button selector [ background - round corner ]\n          .setPayButtonResourceId(R.drawable.btn_pay_selector)\n\n          // setup pay button font type face\n          .setPayButtonFont(Typeface.createFromAsset(getAssets(),\"fonts/roboto_light.ttf\")) // **Optional**\n\n          // setup pay button disable title color\n          .setPayButtonDisabledTitleColor(getResources().getColor(R.color.black)) // **Optional**\n\n          // setup pay button enable title color\n          .setPayButtonEnabledTitleColor(getResources().getColor(R.color.White)) // **Optional**\n\n          //setup pay button text size\n          .setPayButtonTextSize(14) // **Optional**\n\n          // show/hide pay button loader\n          .setPayButtonLoaderVisible(true) // **Optional**\n\n          // show/hide pay button security icon\n          .setPayButtonSecurityIconVisible(true) // **Optional**\n\n          // set the text on pay button\n          .setPayButtonText(\"PAY BTN CAN BE VERY VERY VERY  LONGGGG LONGGGGG\") // **Optional**\n\n          // setup dialog textcolor and textsize\n           .setDialogTextColor(getResources().getColor(R.color.black1))     // **Optional**\n           .setDialogTextSize(17)                // **Optional**\n\n          }\n ```\n\n\u003ca name=\"configure_sdk_Session\"\u003e\u003c/a\u003e\n## Configure SDK Session\n**SDKSession** is the main interface for goSellSDK library from you application, so you can use it to start SDK with pay button or without pay button.\n\n### Properties\n\n\u003ctable style=\"text-align:center\"\u003e\n    \u003cth colspan=1\u003eProperty\u003c/th\u003e\n    \u003cth colspan=1\u003eType\u003c/th\u003e\n    \u003cth rowspan=1\u003eDescription\u003c/th\u003e\n\n   \u003ctr\u003e\n\t\u003ctd\u003e payButtonView  \u003c/td\u003e\n\t\u003ctd\u003e PayButtonView \u003c/td\u003e\n\t\u003ctd\u003e Pay Button View can be used to start SDK \u003c/td\u003e\n   \u003ctr\u003e\n\n   \u003ctr\u003e\n\t\u003ctd\u003e paymentDataSource  \u003c/td\u003e\n\t\u003ctd\u003e PaymentDataSource \u003c/td\u003e\n\t\u003ctd\u003e Payment data source. All input payment information is passed through this protocol. Required. \u003c/td\u003e\n   \u003ctr\u003e\n\n   \u003ctr\u003e\n\t\u003ctd\u003e activityListener  \u003c/td\u003e\n\t\u003ctd\u003e Activity \u003c/td\u003e\n\t\u003ctd\u003e Activity. used as a context to setup sdk.\u003c/td\u003e\n   \u003ctr\u003e\n\n   \u003ctr\u003e\n\t\u003ctd\u003e sessionDelegate  \u003c/td\u003e\n\t\u003ctd\u003e Activity \u003c/td\u003e\n\t\u003ctd\u003e Activity. it is used to notify Merchant application with all SDK Events \u003c/td\u003e\n   \u003ctr\u003e\n\n\n\u003c/table\u003e\n\n### Methods\n\n\u003ctable style=\"text-align:center\"\u003e\n    \u003cth colspan=1\u003eProperty\u003c/th\u003e\n    \u003cth colspan=1\u003eType\u003c/th\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e addSessionDelegate  \u003c/td\u003e\n\t \u003ctd\u003e pass your activity that implements SessionDelegate interface . you have to override all methods available through this interface \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e instantiatePaymentDataSource  \u003c/td\u003e\n\t \u003ctd\u003e Payment Data Source Object is the main object that is responsible of holding all data required from our backend to return all payment options [ Debit Cards - Credit Cards ] available for this merchant . \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n   \t \u003ctd\u003e setTransactionCurrency  \u003c/td\u003e\n   \t \u003ctd\u003e Set the transaction currency associated to your account. Transaction currency must be of type TapCurrency(\"currency_iso_code\"). i.e new TapCurrency(\"KWD\") \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e setTransactionMode  \u003c/td\u003e\n\t \u003ctd\u003e SDK offers different transaction modes such as [ TransactionMode.PURCHASE - TransactionMode.AUTHORIZE_CAPTURE - TransactionMode.SAVE_CARD - TransactionMode.TOKENIZE_CARD]   \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e setCustomer \u003c/td\u003e\n\t \u003ctd\u003e Pass your customer data. Customer must be of type Tap Customer. You can create Tap Customer as following\n\t  new Customer.CustomerBuilder(customerRefNumber).email(\"cut_email\").firstName(\"cust_firstName\")\n                      .lastName(\"cust_lastName\").metadata(\"\").phone(new PhoneNumber(\"country_code\",\"mobileNo\"))\n                      .middleName(\"cust_middleName\").build();\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e setAmount \u003c/td\u003e\n\t \u003ctd\u003e Set Total Amount. Amount value must be of type BigDecimal i.e new BigDecimal(40) \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t \u003ctd\u003e setPaymentItems \u003c/td\u003e\n\t \u003ctd\u003e ArrayList that contains payment items. each item of this array must be of type PaymentItem. in case of SAVE_CARD or TOKENIZE_CARD you can pass it null\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n  \t \u003ctd\u003e setTaxes \u003c/td\u003e\n  \t \u003ctd\u003e ArrayList that contains Tax items. each item of this array must be of type Tax. in case of SAVE_CARD or TOKENIZE_CARD you can pass it null\u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setShipping \u003c/td\u003e\n  \t \u003ctd\u003e ArrayList that contains Shipping items. each item of this array must be of type Shipping. in case of SAVE_CARD or TOKENIZE_CARD you can pass it null\u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setPostURL \u003c/td\u003e\n  \t \u003ctd\u003e POST URL. \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setPaymentDescription \u003c/td\u003e\n  \t \u003ctd\u003e Payment description. \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setPaymentMetadata \u003c/td\u003e\n  \t \u003ctd\u003e HashMap that contains any other payment related data. \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setPaymentReference \u003c/td\u003e\n  \t \u003ctd\u003e Payment reference. it must be of type Reference object or null \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setPaymentStatementDescriptor \u003c/td\u003e\n  \t \u003ctd\u003e Payment Statement Description \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e isRequires3DSecure \u003c/td\u003e\n  \t \u003ctd\u003e Enable or Disable 3D Secure \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setReceiptSettings \u003c/td\u003e\n  \t \u003ctd\u003e Identify Receipt Settings. You must pass  Receipt object or null \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setAuthorizeAction \u003c/td\u003e\n  \t \u003ctd\u003e Identify AuthorizeAction. You must pass AuthorizeAction object or null \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setDestination \u003c/td\u003e\n  \t \u003ctd\u003e Identify Array of destination. You must pass Destinations object or null \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e start \u003c/td\u003e\n  \t \u003ctd\u003e Start SDK Without using Tap Pay button. You must call this method whereever you want to show TAP Payment screen. Also, you must pass your activity as a context   \u003c/td\u003e\n  \t\u003c/tr\u003e\n  \t\u003ctr\u003e\n  \t \u003ctd\u003e setButtonView \u003c/td\u003e\n  \t \u003ctd\u003e If you included TAP PayButton in your activity then you need to configure it and then pass it to SDKSession through this method.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n     \u003ctd\u003e setDefaultCardHolderName \u003c/td\u003e\n     \u003ctd\u003e Sets default CardHoldername in the field, without the user need to re-type.(OPTIONAL) \u003c/td\u003e\n     \u003c/tr\u003e\n     \u003ctr\u003e\n     \u003ctd\u003eisUserAllowedToEnableCardHolderName \u003c/td\u003e\n     \u003ctd\u003e Lets default CardHoldername in the field,can be editable or not based on user configuration .(OPTIONAL) \u003c/td\u003e\n     \u003c/tr\u003e\n      \u003ctr\u003e\n        \u003ctd\u003esdkSession.cancelSession(this); \u003c/td\u003e\n     \u003ctd\u003e Merchant can now cancel the session and stop all process initiating the SDK. .(OPTIONAL) \u003c/td\u003e\n         \u003c/tr\u003e\n      \u003ctr\u003e\n      \u003ctd\u003esetTopUp \u003c/td\u003e\n      \u003ctd\u003e Merchant can now send a topUp object while initiating the SDK. .(OPTIONAL) \u003c/td\u003e\n      \u003c/tr\u003e\n\u003c/table\u003e\n\n\n**Configure SDK Session Example**\n\n*Java:*\n```java\n\n          /**\n           * Configure SDK Session\n           */\n           private void configureSDKSession() {\n            \n            // Instantiate SDK Session\n            if(sdkSession==null) sdkSession = new SDKSession();   //** Required **\n    \n            // pass your activity as a session delegate to listen to SDK internal payment process follow\n            sdkSession.addSessionDelegate(this);    //** Required **\n    \n            // initiate PaymentDataSource\n            sdkSession.instantiatePaymentDataSource();    //** Required **\n    \n            // set transaction currency associated to your account\n            sdkSession.setTransactionCurrency(new TapCurrency(\"KWD\"));    //** Required **\n    \n            // Using static CustomerBuilder method available inside TAP Customer Class you can populate TAP Customer object and pass it to SDK\n            sdkSession.setCustomer(getCustomer());    //** Required **\n    \n            // Set Total Amount. The Total amount will be recalculated according to provided Taxes and Shipping\n            sdkSession.setAmount(new BigDecimal(40));  //** Required **\n    \n            // Set Payment Items array list\n            sdkSession.setPaymentItems(new ArrayList\u003cPaymentItem\u003e());// ** Optional ** you can pass empty array list\n    \n            // Set Taxes array list\n            sdkSession.setTaxes(new ArrayList\u003cTax\u003e());// ** Optional ** you can pass empty array list\n    \n            // Set Shipping array list\n            sdkSession.setShipping(new ArrayList\u003c\u003e());// ** Optional ** you can pass empty array list\n    \n            // Post URL\n            sdkSession.setPostURL(\"\"); // ** Optional **\n    \n            // Payment Description\n            sdkSession.setPaymentDescription(\"\"); //** Optional **\n    \n            // Payment Extra Info\n            sdkSession.setPaymentMetadata(new HashMap\u003c\u003e());// ** Optional ** you can pass empty array hash map\n    \n            // Payment Reference\n            sdkSession.setPaymentReference(null); // ** Optional ** you can pass null\n    \n            // Payment Statement Descriptor\n            sdkSession.setPaymentStatementDescriptor(\"\"); // ** Optional **\n            \n             // Enable or Disable Saving Card\n             sdkSession.isUserAllowedToSaveCard(true); //  ** Required ** you can pass boolean\n                    \n            // Enable or Disable 3DSecure\n            sdkSession.isRequires3DSecure(true);\n    \n            //Set Receipt Settings [SMS - Email ]\n            sdkSession.setReceiptSettings(null); // ** Optional ** you can pass Receipt object or null\n    \n            // Set Authorize Action\n            sdkSession.setAuthorizeAction(null); // ** Optional ** you can pass AuthorizeAction object or null\n    \n            sdkSession.setDestination(null); // ** Optional ** you can pass Destinations object or null\n            \n            sdkSession.setMerchantID(null); // ** Optional ** you can pass merchant id or null\n\n             sdkSession.setPaymentType(\"WEB\");   //** Merchant can customize payment options [WEB/CARD] for each transaction or it will show all payment options granted to him.\n\n            sdkSession.setDefaultCardHolderName(\"TEST TAP\"); // ** Optional ** you can pass default CardHolderName of the user .So you don't need to type it.\n\n            sdkSession.isUserAllowedToEnableCardHolderName(false); //** Optional ** you can enable/ disable  default CardHolderName .\n\n            sdkSession.setTopUp(getTopUp()); // ** Optional ** you can pass TopUp object for Merchant.\n\n            /**\n             * Use this method where ever you want to show TAP SDK Main Screen.\n             * This method must be called after you configured SDK as above\n             * This method will be used in case of you are not using TAP PayButton in your activity.\n             */\n            sdkSession.start(this);\n                }\n ```\n \n *Kotlin:*\n```kotlin\n\n          /**\n           * Configure SDK Session\n           */\n           private void configureSDKSession() {\n            \n            // Instantiate SDK Session\n            if(sdkSession==null) sdkSession = new SDKSession()   //** Required **\n    \n            // pass your activity as a session delegate to listen to SDK internal payment process follow\n            sdkSession.addSessionDelegate(this)    //** Required **\n    \n            // initiate PaymentDataSource\n            sdkSession.instantiatePaymentDataSource()    //** Required **\n    \n            // set transaction currency associated to your account\n            sdkSession.setTransactionCurrency(new TapCurrency(\"KWD\"))   //** Required **\n    \n            // Using static CustomerBuilder method available inside TAP Customer Class you can populate TAP Customer object and pass it to SDK\n            sdkSession.setCustomer(getCustomer())    //** Required **\n    \n            // Set Total Amount. The Total amount will be recalculated according to provided Taxes and Shipping\n            sdkSession.setAmount(new BigDecimal(40))  //** Required **\n    \n            // Set Payment Items array list\n            sdkSession.setPaymentItems(new ArrayList\u003cPaymentItem\u003e())// ** Optional ** you can pass empty array list\n    \n            // Set Taxes array list\n            sdkSession.setTaxes(new ArrayList\u003cTax\u003e())// ** Optional ** you can pass empty array list\n    \n            // Set Shipping array list\n            sdkSession.setShipping(new ArrayList\u003c\u003e())// ** Optional ** you can pass empty array list\n    \n            // Post URL\n            sdkSession.setPostURL(\"\") // ** Optional **\n    \n            // Payment Description\n            sdkSession.setPaymentDescription(\"\") //** Optional **\n    \n            // Payment Extra Info\n            sdkSession.setPaymentMetadata(new HashMap\u003c\u003e())// ** Optional ** you can pass empty array hash map\n    \n            // Payment Reference\n            sdkSession.setPaymentReference(null) // ** Optional ** you can pass null\n    \n            // Payment Statement Descriptor\n            sdkSession.setPaymentStatementDescriptor(\"\") // ** Optional **\n            \n             // Enable or Disable Saving Card\n             sdkSession.isUserAllowedToSaveCard(true) //  ** Required ** you can pass boolean\n                    \n            // Enable or Disable 3DSecure\n            sdkSession.isRequires3DSecure(true)\n    \n            //Set Receipt Settings [SMS - Email ]\n            sdkSession.setReceiptSettings(null); // ** Optional ** you can pass Receipt object or null\n    \n            // Set Authorize Action\n            sdkSession.setAuthorizeAction(null) // ** Optional ** you can pass AuthorizeAction object or null\n    \n            sdkSession.setDestination(null) // ** Optional ** you can pass Destinations object or null\n            \n            sdkSession.setMerchantID(null) // ** Optional ** you can pass merchant id or null\n\n             sdkSession.setPaymentType(\"WEB\")   //** Merchant can customize payment options [WEB/CARD] for each transaction or it will show all payment options granted to him.\n\n            sdkSession.setDefaultCardHolderName(\"TEST TAP\") // ** Optional ** you can pass default CardHolderName of the user .So you don't need to type it.\n\n            sdkSession.isUserAllowedToEnableCardHolderName(false) //** Optional ** you can enable/ disable  default CardHolderName .\n\n            /**\n             * Use this method where ever you want to show TAP SDK Main Screen.\n             * This method must be called after you configured SDK as above\n             * This method will be used in case of you are not using TAP PayButton in your activity.\n             */\n            sdkSession.start(this)\n                }\n ```\n \n \u003ca name=\"configure_sdk_transaction_mode\"\u003e\u003c/a\u003e\n  **Configure SDK Transaction Mode**\n  \n  You have to choose only one Mode of the following modes:\n  \n   **Note:-**\n     - In case of using PayButton, then don't call sdkSession.start(this); because the SDK will start when user clicks the tap pay button.\n\n*Java:*\n ```java\n        /**\n           * Configure SDK Theme\n           */\n          private void configureSDKMode(){\n      \n              /**\n               * You have to choose only one Mode of the following modes:\n               * Note:-\n               *      - In case of using PayButton, then don't call sdkSession.start(this); because the SDK will start when user clicks the tap pay button.\n               */\n              /**\n               *  Start using  SDK features through SDK main activity (With Tap CARD FORM)\n               */\n              startSDKUI();\n\n          }\n ```\n *Kotlin:*\n ```kotlin \n        /**\n           * Configure SDK Theme\n           */\n          private fun configureSDKMode(){\n      \n              /**\n               * You have to choose only one Mode of the following modes:\n               * Note:-\n               *      - In case of using PayButton, then don't call sdkSession.start(this)  because the SDK will start when user clicks the tap pay button.\n               */\n              /**\n               * Start using  SDK features through SDK main activity (With Tap CARD FORM)\n               */\n              startSDKUI()\n\n          }\n ```\n \n \u003ca name=\"init_pay_button\"\u003e\u003c/a\u003e\n   If you included Tap Pay Button then configure it first, if not then ignore this step.\n   \n  **Use Tap PayButton**\n  \n  *Java:*\n  ```java\n     /**\n          * Include pay button in merchant page\n          */\n         private void initPayButton() {\n     \n             payButtonView = findViewById(R.id.payButtonId);\n     \n             payButtonView.setupFontTypeFace(ThemeObject.getInstance().getPayButtonFont());\n     \n             payButtonView.setupTextColor(ThemeObject.getInstance().getPayButtonEnabledTitleColor(),\n                     ThemeObject.getInstance().getPayButtonDisabledTitleColor());\n     //\n             payButtonView.getPayButton().setTextSize(ThemeObject.getInstance().getPayButtonTextSize());\n     //\n             payButtonView.getSecurityIconView().setVisibility(ThemeObject.getInstance().isPayButtSecurityIconVisible()?View.VISIBLE:View.INVISIBLE);\n     \n             payButtonView.setBackgroundSelector(ThemeObject.getInstance().getPayButtonResourceId());\n     \n             if(sdkSession!=null){\n                 TransactionMode trx_mode = sdkSession.getTransactionMode();\n                 if(trx_mode!=null){\n     \n                     if (TransactionMode.SAVE_CARD == trx_mode  ) {\n                         payButtonView.getPayButton().setText(getString(company.tap.gosellapi.R.string.save_card));\n                     }\n                     else if(TransactionMode.TOKENIZE_CARD == trx_mode ){\n                         payButtonView.getPayButton().setText(getString(company.tap.gosellapi.R.string.tokenize));\n                     }\n                     else {\n                         payButtonView.getPayButton().setText(getString(company.tap.gosellapi.R.string.pay));\n                     }\n                 }else{\n                     configureSDKMode();\n                 }\n                 sdkSession.setButtonView(payButtonView, this, SDK_REQUEST_CODE);\n             }\n     \n     \n         }\n \n  ```\n*Kotlin:*\n  ```kotlin\n     /**\n        * Include pay button in merchant page\n        */\n       private void initPayButton() {\n   \n           payButtonView = findViewById(R.id.payButtonId)\n   \n           payButtonView.setupFontTypeFace(ThemeObject.getInstance().payButtonFont)\n   \n           payButtonView.setupTextColor(ThemeObject.getInstance().payButtonEnabledTitleColor,\n                   ThemeObject.getInstance().payButtonDisabledTitleColor)\n   //\n           payButtonView.getPayButton().setTextSize(ThemeObject.getInstance().payButtonTextSize)\n   //\n           payButtonView.getSecurityIconView().setVisibility(ThemeObject.getInstance().isPayButtSecurityIconVisible?View.VISIBLE:View.INVISIBLE)\n   \n           payButtonView.setBackgroundSelector(ThemeObject.getInstance().payButtonResourceId)\n   \n           if(sdkSession!=null){\n               TransactionMode trx_mode = sdkSession.getTransactionMode();\n               if(trx_mode!=null){\n   \n                   if (TransactionMode.SAVE_CARD == trx_mode ) {\n                       payButtonView.payButton.text(getString(company.tap.gosellapi.R.string.save_card))\n                   }\n                   else if(TransactionMode.TOKENIZE_CARD == trx_mode ){\n                       payButtonView.payButton.text(getString(company.tap.gosellapi.R.string.tokenize))\n                   }\n                   else {\n                       payButtonView.payButton.text(getString(company.tap.gosellapi.R.string.pay))\n                   }\n               }else{\n                   configureSDKMode()\n               }\n               sdkSession.setButtonView(payButtonView, this, SDK_REQUEST_CODE)\n           }\n   \n   \n       }\n \n  ```\n  \n\u003ca name=\"list_saved_cards\"\u003e\u003c/a\u003e\n  **List Saved Cards**\n \n *Java:*\n  ```java\n       /**\n          * retrieve list of saved cards from the backend.\n          */\n         private void listSavedCards(){\n             if(sdkSession!=null)\n                 sdkSession.listAllCards(\"CUSTOMER_ID\",this);\n         } \n  ``` \n   *Kotlin:*\n  ```kotlin\n       /**\n          * retrieve list of saved cards from the backend.\n          */\n         private fun listSavedCards(){\n             if(sdkSession!=null) sdkSession.listAllCards(\"CUSTOMER_ID\",this)\n         } \n  ``` \n**To populate TAP Customer object**\n\n*Java:*\n```java\n     private Customer getCustomer() {\n                         return new Customer.CustomerBuilder(null).email(\"abc@abc.com\").firstName(\"firstname\")\n                                 .lastName(\"lastname\").metadata(\"\").phone(new PhoneNumber(\"965\",\"69045932\"))\n                                 .middleName(\"middlename\").build();\n     }\n```\n*Kotlin:*\n```kotlin\n      private val customer: Customer\n        private get() { \n            val customer = if (settingsManager != null) settingsManager!!.customer else null\n            val phoneNumber = if (customer != null) customer.phone else PhoneNumber(\"965\", \"69045932\")\n            return CustomerBuilder(null).email(\"abc@abc.com\").firstName(\"firstname\")\n                    .lastName(\"lastname\").metadata(\"\").phone(PhoneNumber(phoneNumber?.countryCode, phoneNumber.number))\n                    .middleName(\"middlename\").build()\n        }\n```\n\n\u003ca name=\"sdkSession_data_source\"\u003e\u003c/a\u003e\n### SDKSession Payment Data Source\n\n**PaymentDataSource** is an interface which you should implement somewhere in your code to pass payment information in order to be able to access payment flow within the SDK.\n\n\u003ca name=\"session_data_source_structure\"\u003e\u003c/a\u003e\n### Structure\n\nThe following table describes its structure and specifies which fields are required for each of the modes.\n\n\u003ctable style=\"text-align:center\"\u003e\n    \u003cth rowspan=2\u003eMember\u003c/th\u003e\n    \u003cth colspan=1\u003eType\u003c/th\u003e\n    \u003cth colspan=3\u003eRequired\u003c/th\u003e\n    \u003cth rowspan=2\u003eDescription\u003c/th\u003e\n    \u003ctr\u003e\n        \u003cth\u003e\u003csub\u003eAndroid\u003c/sub\u003e\u003c/th\u003e\n        \u003cth\u003e\u003csub\u003ePurchase\u003c/sub\u003e\u003c/th\u003e\n        \u003cth\u003e\u003csub\u003eAuthorize\u003c/sub\u003e\u003c/th\u003e\n        \u003cth\u003e\u003csub\u003eCard Saving\u003c/sub\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003csub\u003e\u003ci\u003emode\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eTransactionMode\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e\u003csub\u003eMode of the transactions (purchase or authorize). If this    property is not implemented, \u003ci\u003epurchase\u003c/i\u003e mode is used.\u003c/sub\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e\u003csub\u003e\u003ci\u003ecustomer\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eCustomer\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003etrue\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e\u003csub\u003eCustomer information. For more details on how to create the customer, please refer to \u003ci\u003eCustomer\u003c/i\u003e class reference.\u003c/sub\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003e\u003csub\u003e\u003ci\u003ecurrency\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eCurrency\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=2\u003e\u003csub\u003e\u003ci\u003etrue\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\u003ctd\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e\u003csub\u003eCurrency of the transaction.\u003c/sub\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003csub\u003e\u003ci\u003eamount\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003e\u003cnobr\u003eBigDecimal\u003c/nobr\u003e\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e\u003csub\u003ePayment/Authorization amount.\u003cbr\u003e\u003cb\u003eNote:\u003c/b\u003e In order to have payment amount either \u003ci\u003eamount\u003c/i\u003e or \u003ci\u003eitems\u003c/i\u003e should be implemented. If both are implemented, \u003ci\u003eitems\u003c/i\u003e is preferred.\u003c/sub\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003eitems\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eArrayList \u003cnobr\u003e[PaymentItem]\u003c/PaymentItem\u003e \u003c/nobr\u003e\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eList of items to pay for.\u003cbr\u003e\u003cb\u003eNote:\u003c/b\u003e In order to have payment amount either \u003ci\u003eamount\u003c/i\u003e or \u003ci\u003eitems\u003c/i\u003e should be implemented. If both are implemented, \u003ci\u003eitems\u003c/i\u003e is preferred.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003etaxes\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eArrayList \u003cnobr\u003e[Tax]\u003c/PaymentItem\u003e \u003c/nobr\u003e\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eYou can specify taxation details here. By default, there are no taxes.\u003cbr\u003e \u003cb\u003eNote:\u003c/b\u003e Specifying taxes will affect total payment/authorization amount.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003eshipping\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eArrayList \u003cnobr\u003e[Shipping]\u003c/PaymentItem\u003e \u003c/nobr\u003e\u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eYou can specify shipping details here. By default, there are no shipping details.\u003cbr\u003e \u003cb\u003eNote:\u003c/b\u003e Specifying shipping will affect total payment/authorization amount.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003epostURL\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eString \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eThe URL which will be called by Tap system notifying that payment has either succeed or failed\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003epaymentDescription\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eString \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eDescription of the payment.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003epaymentMetadata\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eString \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eAdditional information you would like to pass along with the transaction.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003epaymentReference\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eReference \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eYou can keep a reference to the transaction using this property\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003epaymentStatementDescriptor\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eString \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eStatement descriptor.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003erequire3DSecure\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eBoolean \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eDefines if 3D secure check is required. If not implemented, treated as \u003ci\u003etrue\u003c/i\u003e.\u003cbr\u003e\u003cb\u003eNote:\u003c/b\u003e If you disable 3D secure check, it still may occure. Final decision is taken by Tap\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003ereceiptSettings\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eReceipt \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=3\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eReceipt recipient details.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003eauthorizeAction\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd colspan=1\u003e\u003csub\u003e\u003cb\u003eAuthorizeAction \u003c/b\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\u003ctd\u003e\u003csub\u003e\u003ci\u003etrue\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\u003ctd\u003e\u003csub\u003e\u003ci\u003efalse\u003c/i\u003e\u003c/sub\u003e\u003c/td\u003e\n    \u003ctd align=\"left\"\u003e\u003csub\u003eAction to perform after authorization succeeds.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/table\u003e\n\n\u003ca name=\"sdk_open_interfaces\"\u003e\u003c/a\u003e\n## SDK Open Interfaces\n SDK open Interfaces available for implementation through Merchant Project:\n\n 1. SessionDelegate\n ```java\n      public interface SessionDelegate {\n      \n                      void paymentSucceed(@NonNull Charge charge);\n                      void paymentFailed(@Nullable Charge charge);\n              \n                      void authorizationSucceed(@NonNull Authorize authorize);\n                      void authorizationFailed(Authorize authorize);\n              \n              \n                      void cardSaved(@NonNull Charge charge);\n                      void cardSavingFailed(@NonNull Charge charge);\n              \n                      void cardTokenizedSuccessfully(@NonNull Token token);\n              \n                      void sdkError(@Nullable GoSellError goSellError);\n              \n                      void sessionIsStarting();\n                      void sessionHasStarted();\n                      void sessionCancelled();\n                      void sessionFailedToStart();\n              \n                      void invalidCardDetails();\n              \n                      void backendUnknownError();\n              \n                      void invalidTransactionMode();\n\n                      void invalidCustomerID();\n\n                      void userEnabledSaveCardOption(boolean saveCardEnabled);\n\n                     void cardTokenizedSuccessfully(@NonNull Token token,boolean saveCardEnabled);\n                     \n                     void asyncPaymentStarted(@NonNull Charge charge);\n\n}\n ```\n 2. PaymentDataSource\n ```java\n      public interface PaymentDataSource {\n      \n          /**\n           * Transaction currency. @return the currency\n           */\n          @NonNull     TapCurrency            getCurrency();\n      \n          /**\n           * Customer. @return the customer\n           */\n          @NonNull     Customer                getCustomer();\n      \n          /**\n           * Amount. Either amount or items should return nonnull value. If both return nonnull, then items is preferred. @return the amount\n           */\n          @Nullable    BigDecimal              getAmount();\n      \n          /**\n           * List of items to pay for. Either amount or items should return nonnull value. If both return nonnull, then items is preferred. @return the items\n           */\n          @Nullable    ArrayList\u003cPaymentItem\u003e  getItems();\n      \n          /**\n           * Transaction mode. If you return null in this method, it will be treated as PURCHASE. @return the transaction mode\n           */\n          @Nullable    TransactionMode         getTransactionMode();\n      \n          /**\n           * List of taxes. Optional. Note: specifying taxes will affect total payment amount. @return the taxes\n           */\n          @Nullable    ArrayList\u003cTax\u003e          getTaxes();\n      \n          /**\n           * Shipping list. Optional. Note: specifying shipping will affect total payment amount. @return the shipping\n           */\n          @Nullable    ArrayList\u003cShipping\u003e     getShipping();\n      \n          /**\n           * Tap will post to this URL after transaction finishes. Optional. @return the post url\n           */\n          @Nullable    String                  getPostURL();\n      \n          /**\n           * Description of the payment. @return the payment description\n           */\n          @Nullable    String                  getPaymentDescription();\n      \n          /**\n           * If you would like to pass additional information with the payment, pass it here. @return the payment metadata\n           */\n          @Nullable    HashMap\u003cString, String\u003e getPaymentMetadata();\n      \n          /**\n           * Payment reference. Implement this property to keep a reference to the transaction on your backend. @return the payment reference\n           */\n          @Nullable    Reference               getPaymentReference();\n      \n          /**\n           * Payment statement descriptor. @return the payment statement descriptor\n           */\n          @Nullable    String                  getPaymentStatementDescriptor();\n      \n          /**\n           * Defines if 3D secure check is required. @return the requires 3 d secure\n           */\n          @Nullable    boolean                 getRequires3DSecure();\n      \n          /**\n           * Receipt dispatch settings. @return the receipt settings\n           */\n          @Nullable    Receipt                 getReceiptSettings();\n      \n          /**\n           * Action to perform after authorization succeeds. Used only if transaction mode is AUTHORIZE_CAPTURE. @return the authorize action\n           */\n          @Nullable    AuthorizeAction         getAuthorizeAction();\n      \n          /**\n           *  The Destination array contains list of Merchant desired destinations accounts to receive money from payment transactions\n           */\n      \n          @Nullable\n          Destinations getDestination();\n          \n          @Nullable\n          Merchant      getMerchant();\n          \n          @Nullable\n          String         getPaymentDataType();\n      \n          /**\n           *  Defines if user wants all cards or specific card types.\n           */\n          @Nullable\n          CardType        getCardType();\n          /**\n           * Defines the default cardHolderName. Optional. @return the default CardHolderName\n           */\n          @Nullable    String                  getDefaultCardHolderName();\n          /**\n           * Defines if user allowed to edit the cardHolderName. @return the enableEditCardHolderName\n           * @return\n           */\n          @NonNull    boolean                 getEnableEditCardHolderName();\n      }\n ```\n \n\u003ca name=\"sdk_open_enums\"\u003e\u003c/a\u003e\n## SDK Open ENUMs\n SDK open Enums available for implementation through Merchant Project:\n\n 1. AppearanceMode \n ```java\n    public enum AppearanceMode {\n    \n        /**\n         * Windowed mode with translucent\n         */\n        @SerializedName(\"WINDOWED_MODE\")            WINDOWED_MODE,\n        /**\n         * Full screen mode\n         */\n        @SerializedName(\"FULLSCREEN_MODE\")          FULLSCREEN_MODE,\n    }\n\n ```\n 2. TransactionMode \n ```java\n    public enum TransactionMode {\n    \n            /**\n             * Purchase transaction mode.\n             */\n            @SerializedName(\"PURCHASE\")                           PURCHASE,\n            /**\n             * Authorize capture transaction mode.\n             */\n            @SerializedName(\"AUTHORIZE_CAPTURE\")                   AUTHORIZE_CAPTURE,\n            /**\n             * Save card transaction mode.\n             */\n            @SerializedName(\"SAVE_CARD\")                           SAVE_CARD,\n            /**\n             * Tokenize card mode.\n             */\n            @SerializedName(\"TOKENIZE_CARD\")                       TOKENIZE_CARD,\n        \n      \n    }\n ```\n 3. Card Type\n ```java\n       public enum CardType {\n\n           /**\n            * Credit card type.\n            */\n           @SerializedName(\"CREDIT\")  CREDIT,\n           /**\n            * Debit card type.\n            */\n           @SerializedName(\"DEBIT\")  DEBIT,\n          /**\n          * All card type.\n          */\n         @SerializedName(\"ALL\")  ALL\n       }\n ```\n\n \u003ca name=\"sdk_open_models\"\u003e\u003c/a\u003e\n ## SDK Open Models\n  SDK open Models available for implementation through Merchant Project: \n  \n  1. Customer \n   ```java\n      public final class Customer implements Serializable {\n      \n        @SerializedName(\"id\")\n        @Expose\n        private String identifier;\n      \n        @SerializedName(\"first_name\")\n        @Expose\n        private String firstName;\n      \n        @SerializedName(\"middle_name\")\n        @Expose\n        private String middleName;\n      \n        @SerializedName(\"last_name\")\n        @Expose\n        private String lastName;\n      \n        @SerializedName(\"email\")\n        @Expose\n        private String email;\n      \n        @SerializedName(\"phone\")\n        @Expose\n        private PhoneNumber phone;\n      \n        /**\n         * The Meta data.\n         */\n        @SerializedName(\"metadata\")\n        String metaData;\n     }\n   ```\n   2. TapCurrency \n   ```java\n      public class TapCurrency {\n      \n        @NonNull\n        private String isoCode;\n      \n          /**\n           * Instantiates a new Tap currency.\n           *\n           * @param isoCode the iso code\n           * @throws CurrencyException the currency exception\n           */\n          public TapCurrency(@NonNull String isoCode) throws CurrencyException {\n          String code = isoCode.toLowerCase();\n          if(!LocaleCurrencies.checkUserCurrency(code)) {\n            throw CurrencyException.getUnknown(code);\n          }\n          this.isoCode = code;\n        }\n      \n      \n          /**\n           * Gets iso code.\n           *\n           * @return the iso code\n           */\n          @NonNull\n        public String getIsoCode() {\n          return isoCode;\n        }\n      \n      }\n   ```\n   3. AuthorizeAction \n      ```java\n         public final class AuthorizeAction {\n         \n             @SerializedName(\"type\")\n             @Expose\n             private AuthorizeActionType type;\n         \n             @SerializedName(\"time\")\n             @Expose\n             private int timeInHours;\n         \n             /**\n              * Gets default.\n              *\n              * @return the default\n              */\n             public static AuthorizeAction getDefault() {\n         \n                 return new AuthorizeAction(AuthorizeActionType.VOID, 168);\n             }\n         \n             /**\n              * Gets type.\n              *\n              * @return the type\n              */\n             public AuthorizeActionType getType() {\n                 return type;\n             }\n         \n             /**\n              * Gets time in hours.\n              *\n              * @return the time in hours\n              */\n             public int getTimeInHours() {\n                 return timeInHours;\n             }\n         \n             /**\n              * Instantiates a new Authorize action.\n              *\n              * @param type        the type\n              * @param timeInHours the time in hours\n              */\n             public AuthorizeAction(AuthorizeActionType type, int timeInHours) {\n         \n                 this.type = type;\n                 this.timeInHours = timeInHours;\n             }\n         }\n      ```\n      4. Destination \n         ```java\n           public class Destination implements Serializable {\n           \n               @SerializedName(\"id\")\n               @Expose\n               private String id;                              // Destination unique identifier (Required)\n           \n               @SerializedName(\"amount\")\n               @Expose\n               private BigDecimal amount;                      // Amount to be transferred to the destination account (Required)\n           \n               @SerializedName(\"currency\")\n               @Expose\n               private String currency;                   // Currency code (three digit ISO format) (Required)\n           \n               @SerializedName(\"description\")\n               @Expose\n               private String description;                    //  Description about the transfer (Optional)\n           \n               @SerializedName(\"reference\")\n               @Expose\n               private String reference;                     //   Merchant reference number to the destination (Optional)\n           \n           \n               /**\n                * Create an instance of destination\n                * @param id\n                * @param amount\n                * @param currency\n                * @param description\n                * @param reference\n                */\n               public Destination(String id, BigDecimal amount, TapCurrency currency, String description, String reference) {\n                   this.id = id;\n                   this.amount = amount;\n                   this.currency = (currency!=null)? currency.getIsoCode().toUpperCase():null;\n                   this.description =description;\n                   this.reference = reference;\n               }\n           \n               /**\n                *\n                * @return Destination unique identifier\n                */\n               public String getId() {\n                   return id;\n               }\n           \n               /**\n                *\n                * @return Amount to be transferred to the destination account\n                */\n               public BigDecimal getAmount() {\n                   return amount;\n               }\n           \n               /**\n                *\n                * @return Currency code (three digit ISO format)\n                */\n               public String getCurrency() {\n                   return currency;\n               }\n           \n               /**\n                *\n                * @return Description about the transfer\n                */\n               public String getDescription() {\n                   return description;\n               }\n           \n               /**\n                *  Merchant reference number to the destination\n                * @return\n                */\n               public String getReference() {\n                   return reference;\n               }\n           }\n\n         ```\n      5. Destinations \n         ```java\n            public class Destinations  implements Serializable {\n                @SerializedName(\"amount\")\n                @Expose\n                private BigDecimal             amount;\n            \n                @SerializedName(\"currency\")\n                @Expose\n                private String                currency;\n            \n                @SerializedName(\"count\")\n                @Expose\n                private int                     count;\n            \n                @SerializedName(\"destination\")\n                @Expose\n                private ArrayList\u003cDestination\u003e  destination;\n            \n                /**\n                 * @param amount\n                 * @param currency\n                 * @param count\n                 * @param destinations\n                 */\n                public Destinations(@NonNull  BigDecimal amount, @NonNull TapCurrency currency, int count, @NonNull ArrayList\u003cDestination\u003e destinations)\n                {\n                    this.amount = amount;\n                    this.currency = (currency!=null)? currency.getIsoCode().toUpperCase():null;\n                    this.count = count;\n                    this.destination = destinations;\n                }\n            \n                /**\n                 * Total amount, transferred to the destination account\n                 * @return\n                 */\n                public BigDecimal getAmount() {\n                    return amount;\n                }\n            \n                /**\n                 * Tap transfer currency code\n                 * @return\n                 */\n                public String getCurrency() {\n                    return currency;\n                }\n            \n                /**\n                 * Total number of destinations transfer involved\n                 * @return\n                 */\n                public int getCount() {\n                    return count;\n                }\n            \n                /**\n                 * List of destinations object\n                 * @return\n                 */\n                public ArrayList\u003cDestination\u003e getDestination() {\n                    return destination;\n                }\n            }\n         ```\n      6. PaymentItem \n         ```java\n            public class PaymentItem {\n            \n              @SerializedName(\"name\")\n              @Expose\n              private String name;\n            \n            \n              @SerializedName(\"description\")\n              @Expose\n              @Nullable private String description;\n            \n              @SerializedName(\"quantity\")\n              @Expose\n              private Quantity quantity;\n            \n              @SerializedName(\"amount_per_unit\")\n              @Expose\n              private BigDecimal amountPerUnit;\n            \n              @SerializedName(\"discount\")\n              @Expose\n              @Nullable private AmountModificator discount;\n            \n              @SerializedName(\"taxes\")\n              @Expose\n              @Nullable private ArrayList\u003cTax\u003e taxes;\n            \n              @SerializedName(\"total_amount\")\n              @Expose\n              private BigDecimal totalAmount;\n            \n            }\n         ```\n      6. Receipt \n           ```java\n              public final class Receipt implements Serializable {\n              \n                  @SerializedName(\"id\")\n                  @Expose\n                  @Nullable private String id;\n              \n                  @SerializedName(\"email\")\n                  @Expose\n                  private boolean email;\n              \n                  @SerializedName(\"sms\")\n                  @Expose\n                  private boolean sms;\n              \n                  /**\n                   * Instantiates a new Receipt.\n                   *\n                   * @param email the email\n                   * @param sms   the sms\n                   */\n                  public Receipt(boolean email, boolean sms) {\n                      this.email = email;\n                      this.sms = sms;\n                  }\n              \n                  /**\n                   * Gets id.\n                   *\n                   * @return the id\n                   */\n                  public String getId() {\n                      return id;\n                  }\n              \n                  /**\n                   * Is email boolean.\n                   *\n                   * @return the boolean\n                   */\n                  public boolean isEmail() {\n                      return email;\n                  }\n              \n                  /**\n                   * Is sms boolean.\n                   *\n                   * @return the boolean\n                   */\n                  public boolean isSms() {\n                      return sms;\n                  }\n              }\n           ```\n       6. Reference \n            ```java\n               public final class Reference implements Serializable {\n               \n                   @SerializedName(\"acquirer\")\n                   @Expose\n                   @Nullable private String acquirer;\n               \n                   @SerializedName(\"gateway\")\n                   @Expose\n                   @Nullable private String gateway;\n               \n                   @SerializedName(\"payment\")\n                   @Expose\n                   @Nullable private String payment;\n               \n                   @SerializedName(\"track\")\n                   @Expose\n                   @Nullable private String track;\n               \n                   @SerializedName(\"transaction\")\n                   @Expose\n                   @Nullable private String transaction;\n               \n                   @SerializedName(\"order\")\n                   @Expose\n                   @Nullable private String order;\n               \n                   /**\n                    * Gets acquirer.\n                    *\n                    * @return the acquirer\n                    */\n                   @Nullable public String getAcquirer() {\n                       return acquirer;\n                   }\n               \n                   /**\n                    * Gets gateway.\n                    *\n                    * @return the gateway\n                    */\n                   @Nullable public String getGateway() {\n                       return gateway;\n                   }\n               \n                   /**\n                    * Gets payment.\n                    *\n                    * @return the payment\n                    */\n                   @Nullable public String getPayment() {\n                       return payment;\n                   }\n               \n                   /**\n                    * Gets track.\n                    *\n                    * @return the track\n                    */\n                   @Nullable public String getTrack() {\n                       return track;\n                   }\n               \n                   /**\n                    * Gets transaction.\n                    *\n                    * @return the transaction\n                    */\n                   @Nullable public String getTransaction() {\n                       return transaction;\n                   }\n               \n                   /**\n                    * Gets order.\n                    *\n                    * @return the order\n                    */\n                   @Nullable public String getOrder() {\n                       return order;\n                   }\n               \n                   /**\n                    * Instantiates a new Reference.\n                    *\n                    * @param acquirer    the acquirer\n                    * @param gateway     the gateway\n                    * @param payment     the payment\n                    * @param track       the track\n                    * @param transaction the transaction\n                    * @param order       the order\n                    */\n                   public Reference(@Nullable String acquirer, @Nullable String gateway, @Nullable String payment, @Nullable String track, @Nullable String transaction, @Nullable String order) {\n               \n                       this.acquirer = acquirer;\n                       this.gateway = gateway;\n                       this.payment = payment;\n                       this.track = track;\n                       this.transaction = transaction;\n                       this.order = order;\n                   }\n               }\n\n            ```\n        6. Shipping \n             ```java\n                public final class Shipping {\n                \n                    @SerializedName(\"name\")\n                    @Expose\n                    private String name;\n                \n                    @SerializedName(\"description\")\n                    @Expose\n                    @Nullable private String description;\n                \n                    @SerializedName(\"amount\")\n                    @Expose\n                    private BigDecimal amount;\n                \n                    /**\n                     * Instantiates a new Shipping.\n                     *\n                     * @param name        the name\n                     * @param description the description\n                     * @param amount      the amount\n                     */\n                    public Shipping(String name, @Nullable String description, BigDecimal amount) {\n                \n                        this.name           = name;\n                        this.description    = description;\n                        this.amount         = amount;\n                    }\n                \n                    /**\n                     * Gets amount.\n                     *\n                     * @return the amount\n                     */\n                    public BigDecimal getAmount() {\n                \n                        return amount;\n                    }\n                }\n             ```                   \n      6. Tax \n           ```java\n             public final class Tax {\n             \n                 @SerializedName(\"name\")\n                 @Expose\n                 private String name;\n             \n                 @SerializedName(\"description\")\n                 @Expose\n                 @Nullable private String description;\n             \n                 @SerializedName(\"amount\")\n                 @Expose\n                 private AmountModificator amount;\n             \n                 /**\n                  * Instantiates a new Tax.\n                  *\n                  * @param name        the name\n                  * @param description the description\n                  * @param amount      the amount\n                  */\n                 public Tax(String name, @Nullable String description, AmountModificator amount) {\n                     this.name = name;\n                     this.description = description;\n                     this.amount = amount;\n                 }\n             \n                 /**\n                  * Gets name.\n                  *\n                  * @return the name\n                  */\n                 public String getName() {\n                     return name;\n                 }\n             \n                 /**\n                  * Gets description.\n                  *\n                  * @return the description\n                  */\n                 @Nullable public String getDescription() {\n                     return description;\n                 }\n             \n                 /**\n                  * Gets amount.\n                  *\n                  * @return the amount\n                  */\n                 public AmountModificator getAmount() {\n                     return amount;\n                 }\n             }\n           ```\n      7. CardsList\n           ```java\n            public class CardsList {\n            \n                private int responseCode;\n                private String object;\n                private boolean has_more;\n                private ArrayList\u003cSavedCard\u003e cards;\n            \n            \n                public CardsList( int responseCode,String object,boolean has_more,ArrayList\u003cSavedCard\u003e data){\n                    this.responseCode = responseCode;\n                    this.object  = object;\n                    this.has_more = has_more;\n                    this.cards = data;\n                }\n            \n                /**\n                 * Gets Response Code\n                  * @return responseCode\n                 */\n                public int getResponseCode(){\n                    return responseCode;\n                }\n            \n                /**\n                 *  Gets Object type\n                 * @return object\n                 */\n                public String getObject() {\n                    return object;\n                }\n            \n                /**\n                 *  Check if customer has more cards\n                 * @return has_more\n                 */\n                public boolean isHas_more() {\n                    return has_more;\n                }\n            \n                /**\n                 * Gets cards.\n                 *\n                 * @return the cards\n                 */\n                  public ArrayList\u003cSavedCard\u003e getCards() {\n            \n                    if ( cards == null ) {\n            \n                        cards = new ArrayList\u003c\u003e();\n                    }\n            \n                    return cards;\n                }\n            }\n           ``` \n            ```  \n        8.TopUp\n                 \n\t\t ```java\n                 public final class TopUp implements Serializable {\n                     @SerializedName(\"id\")\n                     @Expose\n                     String Id;\n                     @SerializedName(\"wallet_id\")\n                     @Expose\n                     String walletId;\n                     @SerializedName(\"created\")\n                     @Expose\n                     @Nullable  Long created;\n                     @SerializedName(\"status\")\n                     @Expose\n                     @Nullable String status;\n                     @SerializedName(\"amount\")\n                     @Expose\n                     @Nullable  BigDecimal amount;\n                     @SerializedName(\"currency\")\n                     @Expose\n                     @Nullable  String currency;\n                     @SerializedName(\"charge\")\n                     @Expose\n                     @Nullable  TopchargeModel charge;\n                     @SerializedName(\"customer\")\n                     @Expose\n                     @Nullable  TopCustomerModel customer;\n                     @SerializedName(\"reference\")\n                     @Expose\n                     TopUpReference topUpReference;\n                     @SerializedName(\"application\")\n                     @Expose\n                     TopUpApplication application;\n                     @SerializedName(\"response\")\n                     @Expose\n                     @Nullable\n                     Response response;\n                     @SerializedName(\"post\")\n                     @Expose\n                     @Nullable TopupPost post;\n                 \n                     public String getId() {\n                         return Id;\n                     }\n                 \n                     public String getWalletId() {\n                         return walletId;\n                     }\n                 \n                     @Nullable\n                     public Long getCreated() {\n                         return created;\n                     }\n                 \n                     @Nullable\n                     public BigDecimal getAmount() {\n                         return amount;\n                     }\n                 \n                     @Nullable\n                     public String getCurrency() {\n                         return currency;\n                     }\n                 \n                     @Nullable\n                     public TopchargeModel getCharge() {\n                         return charge;\n                     }\n                 \n                     @Nullable\n                     public TopCustomerModel getCustomer() {\n                         return customer;\n                     }\n                 \n                     public TopUpReference getTopUpReference() {\n                         return topUpReference;\n                     }\n                 \n                     public TopUpApplication getApplication() {\n                         return application;\n                     }\n                 \n                     public MetaData getMetadata() {\n                         return metadata;\n                     }\n                 \n                     public Response getResponse() {\n                         return response;\n                     }\n                     @Nullable\n                     public TopupPost getPost() {\n                         return post;\n                     }\n                 \n                     @SerializedName(\"metadata\")\n                     @Expose\n                     MetaData metadata;\n                 \n                 \n                     //  Constructor is private to prevent access from client app, it must be through inner Builder class only\n                     public TopUp(@Nullable String Id , String walletId, @Nullable Long created,@Nullable String status,@Nullable  BigDecimal amount , String currency, @Nullable TopchargeModel charge , @Nullable TopCustomerModel customer, @Nullable TopUpReference topUpReference, TopUpApplication topUpApplication, @Nullable Response response, @Nullable TopupPost post,@Nullable MetaData metaData\n                     ) {\n                 \n                         this.Id = Id;\n                         this.walletId = walletId;\n                         this.created = created;\n                         this.status = status;\n                         this.amount = amount;\n                         this.currency = currency;\n                         this.charge = charge;\n                         this.customer = customer;\n                         this.topUpReference = topUpReference;\n                         this.application = topUpApplication;\n                         this.response = response;\n                         this.post = post;\n                         this.metadata = metaData;\n                     }\n                 }\n                 ```\n       \n\u003ca name=\"sdk_delegate\"\u003e\u003c/a\u003e\n## SDKSession Delegate\n\n**SessionDelegate** is an interface which you may want to implement to receive payment/authorization/card saving status updates and update your user interface accordingly when payment window closes.\n\nBelow are listed down all available callbacks:\n\n\u003ca name=\"payment_success_callback\"\u003e\u003c/a\u003e\n### Payment Success Callback\n\nNotifies the receiver that payment has succeed.\n\n#### Declaration\n\n*Java:*\n```java\n- void paymentSucceed(@NonNull Charge charge);\n```\n*Kotlin:*\n```kotlin\n- fun paymentSucceed(charge: Charge)\n```\n\n#### Arguments\n\n**charge**: Successful charge object.\n\n\u003ca name=\"payment_failure_callback\"\u003e\u003c/a\u003e\n### Payment Failure Callback\n\nNotifies the receiver that payment has failed.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void paymentFailed(@Nullable Charge charge);\n```\n*Kotlin:*\n\n```kotlin\n- fun paymentFailed(charge: Charge?)\n```\n\n#### Arguments\n\n**charge**: Charge object that has failed (if reached the stage of charging).\n\n\u003ca name=\"authorization_success_callback\"\u003e\u003c/a\u003e\n### Authorization Success Callback\n\nNotifies the receiver that authorization has succeed.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void authorizationSucceed(@NonNull Authorize authorize);\n```\n*Kotlin:*\n\n```kotlin\n- fun authorizationSucceed(authorize: Authorize)\n```\n\n#### Arguments\n\n**authorize**: Successful authorize object.\n\n\u003ca name=\"authorization_failure_callback\"\u003e\u003c/a\u003e\n### Authorization Failure Callback\n\nNotifies the receiver that authorization has failed.\n\n#### Declaration\n\n*Java*\n\n```java\n- void authorizationFailed(Authorize authorize);\n```\n*Kotlin*\n\n```kotlin\n- fun authorizationFailed(authorize: Authorize)\n```\n\n#### Arguments\n\n**authorize**: Authorize object that has failed (if reached the stage of authorization).\n\n\u003ca name=\"card_saving_success_callback\"\u003e\u003c/a\u003e\n### Card Saving Success Callback\n\nNotifies the receiver that the customer has successfully saved the card.\n\n#### Declaration\n\n*Java*\n\n```java\n- void cardSaved(@NonNull Charge charge); // you have to cast Charge object to SaveCard object first to get card info \n```\n*Kotlin*\n\n```kotlin\n- fun cardSaved(charge: Charge) // you have to cast Charge object to SaveCard object first to get card info \n```\n\n#### Arguments\n\n**Charge**: Charge object with the details.\n\n\u003ca name=\"card_saving_failure_callback\"\u003e\u003c/a\u003e\n### Card Saving Failure Callback\n\nNotifies the receiver that the customer failed to save the card.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void cardSavingFailed(@NonNull Charge charge);\n```\n*Kotlin:*\n\n```kotlin\n- fun cardSavingFailed(charge: Charge)\n```\n\n#### Arguments\n\n**Charge**: Charge object with the details (if reached the stage of card saving).\n\n\u003ca name=\"card_tokenized_success_callback\"\u003e\u003c/a\u003e\n### Card Tokenized Success Callback\n\nNotifies the receiver that the card has successfully tokenized.\n\n#### Declaration\n\n*Java*\n\n```java\n- void cardTokenizedSuccessfully(@NonNull Token token);\n```\n*Kotlin*\n\n```kotlin\n- fun cardTokenizedSuccessfully(token: Token)\n```\n\n#### Arguments\n\n**token**: card token object.\n\nNotifies the receiver that the card has successfully tokenized and user enabled / disabled save card.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void cardTokenizedSuccessfully(@NonNull Token token,boolean saveCardEnabled);\n```\n*Kotlin:*\n\n```kotlin\n- fun cardTokenizedSuccessfully( token:Token, saveCardEnabled:Boolean)\n```\n\n#### Arguments\n\n**token**: card token object.\n\n**saveCardEnabled**: boolean for user enabled/disabled save card.\n\n\n\u003ca name=\"saved_cards_list_callback\"\u003e\u003c/a\u003e\n### Saved Cards List Callback\n\nNotifies the receiver with list of saved cards for a customer. If customer has no cards then you will receive the same response but with empty cards array. \n\n#### Declaration\n\n*Java:*\n\n```java\n-  void savedCardsList(@NonNull CardsList cardsList);\n```\n*Kotlin:*\n\n```kotlin\n-  fun savedCardsList(cardsList: CardsList)\n```\n\n#### Arguments\n\n**cardsList**: CardsList model that holds the response.\n\n\n\u003ca name=\"session_error_callback\"\u003e\u003c/a\u003e\n### Session Other Failure Callback\n\nNotifies the receiver if any other error occurred.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void sdkError(@Nullable GoSellError goSellError);\n```\n*Kotlin:*\n\n```kotlin\n- fun sdkError(goSellError: GoSellError?)\n```\n\n#### Arguments\n\n**GoSellError**: GoSellError object with details of error.\n\n\n\u003ca name=\"invalid_card_details\"\u003e\u003c/a\u003e\n### Invalid Card details\n\nNotifies the client that card data passed are invalid\n\n#### Declaration\n\n*Java:*\n\n```java\n- void invalidCardDetails();\n```\n*Kotlin:*\n\n```kotlin\n- fun invalidCardDetails()\n```\n\n\n\u003ca name=\"backecnd_unknow_error\"\u003e\u003c/a\u003e\n### Backend Unknown Error\n\nNotifies the client that an unknown error has occurred in the backend\n\n#### Declaration\n\n*Java:*\n\n```java\n-  void backendUnknownError();\n```\n\n*Kotlin:*\n\n```kotlin\n-  fun backendUnknownError()\n```\n\n\u003ca name=\"invalid_transaction_mode\"\u003e\u003c/a\u003e\n### Invalid Transaction Mode\n\nNotifies the client that Transaction Mode not configured.\n\n#### Declaration\n\n*Java:*\n\n```java\n-  void invalidTransactionMode();\n```\n*Kotlin:*\n\n```kotlin\n-  fun invalidTransactionMode()\n```\n\n\u003ca name=\"user_enabled_save_card_option\"\u003e\u003c/a\u003e\n### User Enabled Save Card call back\n\nNotifies the receiver (Merchant Activity) that the user wants to save his card.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void userEnabledSaveCardOption(boolean saveCardEnabled);\n```\n*Kotlin:*\n\n```kotlin\n- fun userEnabledSaveCardOption(saveCardEnabled: Boolean)\n```\n\n\u003ca name=\"session_is_starting_callback\"\u003e\u003c/a\u003e\n### Session Is Starting Callback\n\nNotifies the receiver that session is about to start, but hasn't yet shown the SDK UI. You might want to use this method if you are not using `PayButton` in your application and want to show a loader before SDK UI appears on the screen.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void sessionIsStarting();\n```\n*Kotlin:*\n\n```kotlin\n- fun sessionIsStarting()\n```\n\n\u003ca name=\"session_has_started_callback\"\u003e\u003c/a\u003e\n### Session Has Started Callback\n\nNotifies the receiver that session has successfully started and shown the SDK UI on the screen. You might want to use this method if you are not using `PayButton` in your application and want to hide a loader after SDK UI has appeared on the screen.\n\n#### Declaration\n\n*Java:*\n\n```java\n-  void sessionHasStarted();\n```\n\n*Kotlin:*\n\n```kotlin\n-  fun sessionHasStarted()\n```\n\n\u003ca name=\"session_failed_to_start_callback\"\u003e\u003c/a\u003e\n### Session Failed To Start Callback\n\nNotifies the receiver that session has failed to start.\n\n#### Declaration\n\n*Java:*\n\n```java\n-  void sessionFailedToStart();\n```\n*Kotlin:*\n\n```kotlin\n-  fun sessionFailedToStart()\n```\n\n\u003ca name=\"session_cancel_callback\"\u003e\u003c/a\u003e\n### Session Cancel Callback\n\nNotifies the receiver (Merchant Activity) that the user cancelled payment process, clicked on soft back button, clicked hard back button or clicked Header cancel button. \n\n#### Declaration\n\n*Java:*\n\n```java\n- void sessionCancelled();\n```\n*Kotlin:*\n\n```kotlin\n- fun sessionCancelled()\n```\n\u003ca name=\"asyncPaymentStarted_callback\"\u003e\u003c/a\u003e\n### AsynchPaymentStarted  Callback\n\nNotifies the receiver (Merchant Activity) that the asynchronous payment has started.\n\n#### Declaration\n\n*Java:*\n\n```java\n- void asyncPaymentStarted(@NonNull Charge charge);\n```\n*Java:*\n\n```kotlin\n- fun asyncPaymentStarted(charge:Charge)\n```\n\n\u003ca name=\"paymentInitiated_callback\"\u003e\u003c/a\u003e\n### PaymentInitiated  Callback\n\nNotifies the receiver (Merchant Activity) that the payment of charge has started.\n\n#### Declaration\n\n*Java:*\n\n```java\n-  void paymentInitiated(@Nullable Charge charge);\n```\n*Java:*\n\n```kotlin\n- fun paymentInitiated(charge:Charge)\n```\n-----\n\u003ca name=\"docs\"\u003e\u003c/a\u003e\n# Documentation\nDocumentation is available at [github-pages][2].\u003cbr\u003e\nAlso documented sources are attached to the library.\n\n[1]:https://www.tap.company/developers/\n[2]:https://tap-payments.github.io/goSellSDK-Android/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftap-payments%2Fgosellsdk-android","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftap-payments%2Fgosellsdk-android","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftap-payments%2Fgosellsdk-android/lists"}