Android SDK
Overview
The Geidea Payment SDK delivers a seamless and secure payment experience for mobile applications. Built with flexibility and ease of use in mind, our SDK empowers developers to integrate payment functionality with just a few lines of code and maximum UI customization with various presentation modes.
Key Features
Dynamic Payment Methods
Flexible UI & Presentation Options
Native 3D Secure Authentication
Fast Card Scanning
Security & Compliance
Optimized Performance
Multi-language & Localization Support
Smart Error Handling
How it works

Mobile SDK Workflow
Getting Started
This guide will walk you through the integration process for the Geidea Android SDK
- Set up and initialize the Geidea Android SDK in your application.
- The SDK will display available payment methods and gather customer payment information.
- The SDK will process and transmit the payment request to Geidea's payment gateway.
- Receive the payment processing response through the Android SDK plugin.
- Display the transaction outcome to your customer within your Android application.
Prerequisites
| Requirements | Version / Details |
|---|---|
| Minimum Android Version | Android 6.0 (API level 23) |
| Kotlin Version | 1.9.25+ with JVM target 11 |
| Java Version | Java 11 (minimum and target) |
| Gradle | 8.0+ |
| Compose BOM | 2024.02.00+ (if using Jetpack Compose) |
| Android Gradle Plugin (AGP) | 8.0.0+ |
Gradle Setup
- Geidea will send the Android SDK to the merchant as a zip file
Extract the zip file in the home directory of your local machine
/Users/AME/.m2/repository- Proceed to update your build.gradle files to access the local maven repository.
buildscript {
repositories {
// ...
mavenLocal()
}
}
allprojects {
repositories {
// ...
mavenLocal()
}
}- Add the extracted SDK as a dependency in your app-level build.gradle
implementation 'net.geidea:PGW-SDK:<LATEST VERSION>'Integration Guide
Step 1: Create a Payment Session (Server-Side)
You can view the entire API reference here.
Before launching the SDK, you need to create a payment session by calling the Geidea API.
In order to create session, you’ll need to generate a signature as demonstrated below
Create Signature
- Concatenate the string of MerchantPublicKey, OrderAmount, OrderCurrency, MerchantReferenceId, timeStamp.
- Amount must be formatted with 2 decimals.
- Hash (SHA-256) the above concatenated string by Merchant API Password.
- Convert Hashed Value to Base64Str
- API Endpoint
POST https://api.merchant.geidea.net/payment-intent/api/v2/direct/sessionhttps://api.ksamerchant.geidea.net/payment-intent/api/v2/direct/sessionhttps://api.geidea.ae/payment-intent/api/v2/direct/session- Authentication
-
- Include the following header with your request:
Authorization: Basic <BASE64_ENCODED_CREDENTIALS>
Where <BASE64_ENCODED_CREDENTIALS> is your merchant key and password encoded in base64 format:
base64encode("MERCHANT_KEY:MERCHANT_PASSWORD")- Request Body
{
"amount": 8.0,
"appearance": {
"showAddress": true,
"showEmail": true
},
"currency": "EGP",
"order": {
"orderItems": [
{
"count": 1,
"icon": "",
"name": "test",
"price": 2.0
}
],
"summary": {
"shipping": 2.0,
"subTotal": 5.0,
"vat": 1.0
}
},
"signature": "J5sBLvid9k9NZ+94NG5jkdEVySxe73ZpLK1ujYD7Zy8\u003d",
"timeStamp": "2025-09-29 11:32:50"
}- Payment Session Response
{
"session": {
"id": "b90e8b08-178e-4a8e-0b6c-08dde9fbe245",
// ...
},
"responseMessage": "Success",
"detailedResponseMessage": "The operation was successful",
// ...
}We will use this session ID to initiate the payment SDK on the client-side.
Payment Parameters Reference
Parameter | Type | Required/Optional | Description |
|---|---|---|---|
Amount | Number | Required | Total payment amount |
Currency | String | Required | Currency code (e.g., "EGP") |
Signature | String | Optional | Security signature (generated with generateSignature public function in SDK) |
timeStamp | String | Optional | Timestamp in format "YYYY-MM-DD HH:MM:SS" |
appearance | Object | Optional | Display settings for the payment form |
appearance.showAddress | Boolean | Optional | Whether to show the address field |
appearance.showEmail | Boolean | Optional | Whether to show the email field |
order | Object | Optional | Order details |
order.orderItems | Array | Optional | List of items in the order |
order.orderItems[ ].count | Number | Required | Quantity of the item |
order.orderItems[ ].name | String | Required | Name of the item |
order.orderItems[].price | Number | Required | Price of the item |
order.orderItems[].icon | String | Optional | Icon URL for the item |
order.summary | Object | Optional | Order summary totals |
order.summary.subTotal | Number | Required | Subtotal amount (excluding any taxes) |
order.summary.shipping | Number | Optional | Shipping cost |
order.summary.vat | Number | Optional | VAT/tax amount |
Step 2: SDK Configuration (Client-Side)
import net.geidea.sdk.GDPaymentSDK
import net.geidea.sdk.sdk.*
class PaymentActivity : AppCompatActivity() {
private lateinit var paymentSDK: GDPaymentSDK
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_payment)
// Create SDK configuration
val configuration = GDPaymentSDKConfiguration(
sessionId = "your_session_id", // From Step 1
region = REGION.EGY, // or UAE, KSA
language = SDKLanguage.ENGLISH, // or ARABIC
theme = SDKTheme( // optional
primaryColor = "#667eea",
secondaryColor = "#764ba2",
merchantLogo = ContextCompat.getDrawable(this, R.drawable.logo)
)
)
// Initialize SDK
paymentSDK = GDPaymentSDK.sharedInstance()
paymentSDK.start(configuration, this@PaymentActivity)
}
}import net.geidea.sdk.GDPaymentSDK
import net.geidea.sdk.sdk.*
@Composable
fun PaymentScreen() {
val context = LocalContext.current
// Initialize SDK
val configuration = remember {
GDPaymentSDKConfiguration(
sessionId = "your_session_id", // From Step 1
region = REGION.EGY, // or UAE, KSA
isSandbox = true, // for pre-production
language = SDKLanguage.ENGLISH, // or ARABIC
theme = SDKTheme(
primaryColor = "#667eea",
secondaryColor = "#764ba2",
merchantLogo = ContextCompat.getDrawable(context, R.drawable.logo)
)
)
}
Button(
onClick = {
GDPaymentSDK.sharedInstance().apply {
start(configuration, context)
}
}
) {
Text("Pay Now")
}
}Presentation Styles (Upcoming) The SDK offers multiple presentation options to match your app’s UX requirements:
- Push Activity (Full Screen)
- Best for: Dedicated payment flow with maximum screen real estate
GDPaymentSDK.sharedInstance().start(
configuration,
context = this@MainActivity,
presentationStyle = SDKPresentationStyle.Push(),
)- Fragment Integration
- Best for: Inline payment forms within existing screens
GDPaymentSDK.sharedInstance().start(
configuration,
context = this@MainActivity,
presentationStyle = SDKPresentationStyle.Present(
presentationType = SDKPresentationStyle.Present.PresentationType.Fragment(
fragmentManager = supportFragmentManager,
containerId = R.id.payment_container
)
),
)
Layout Example:
<FrameLayout
android:id="@+id/payment_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
- Bottom Sheet Modal
- Best for: Quick checkout without leaving the current screen
GDPaymentSDK.sharedInstance().start(
configuration,
context = this@MainActivity,
presentationStyle = SDKPresentationStyle.BottomSheet(
bottomSheetType = SDKPresentationStyle.BottomSheet.BottomSheetType.Fragment,
maxHeightDp = 600f
),
)
- Handling Payment Results
- Implement the SDK callback to handle payment outcomes
import net.geidea.paymentsdk.model.*
class MainActivity : AppCompatActivity(), GDPaymentResultListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Set callback
GDPaymentSDK.sharedInstance().setPaymentCallback(this)
}
override fun onPaymentCompleted(result: GDPaymentResult) {
// Payment successful
Log.d("Payment", "Payment completed: ${result.orderId}")
}
override fun onPaymentFailed(error: GDPaymentError) {
// Payment failed
Log.e("Payment", "Payment failed: ${error.message}")
}
override fun onPaymentCanceled() {
// User canceled payment
Log.d("Payment", "Payment canceled by user")
}
}
- Theme Customization
- Customize the SDK appearance to match your brand
val customTheme = SDKTheme(
primaryColor = Color.parseColor("#FF6B35"),
secondaryColor = Color.parseColor("#F7F7F7"),
merchantLogo = R.drawable.logo
)
val configuration = GDPaymentSDKConfiguration(
val theme: SDKTheme = SDKTheme(),
val sessionId: String,
val language: SDKLanguage = SDKLanguage.ENGLISH,
val region: REGION = REGION.EGY,
val isSandbox: Boolean = false
)
- Payment Testing
- Use a Sandbox environment in the SDK configuration to test the different payment scenarios using the test cards here
API Reference
GDPaymentSDKConfiguration
data class GDPaymentSDKConfiguration(
val theme: SDKTheme = SDKTheme(),
val sessionId: String,
val language: SDKLanguage = SDKLanguage.ENGLISH,
val region: REGION = REGION.EGY,
val isSandbox: Boolean = false
)
SDKTheme
data class SDKTheme(
val primaryColor: String? = null,
val secondaryColor: String? = null,
val merchantLogo: Drawable? = null
)
GDPaymentResult
data class GDPaymentResult(
val orderId: String? = null,
val tokenId: String? = null,
val agreementId: String? = null,
val paymentMethod: PaymentMethodResult? = null,
)
data class PaymentMethodResult(
val type: String? = null,
val brand: String? = null,
val cardholderName: String? = null,
val maskedCardNumber: String? = null,
val wallet: String? = null,
val expiryDate: ExpiryDateResult? = null
)
data class ExpiryDateResult(
val month: Int? = null,
val year: Int? = null
)
GDPaymentError
data class GDPaymentError(
val code: String,
val message: String,
val details: String?
)
Updated 1 day ago