BEX Full SDK — Entegrasyon Kılavuzu
Bu doküman, Android uygulamanıza BEX Full SDK’nın entegrasyonu için hazırlanmıştır.
Gereksinimler
- Min SDK: 24 (Android 7.0)
- Compile SDK: 36+
- Java / JVM target: 11
- Kotlin: 1.9+
Hızlı Başlangıç
val initParams = SdkInitParams(
token = "your_initial_token",
merchantId = "MERCHANT_123",
transactionId = "TX_123",
gsmNo = "5551234567",
merchantUserId = "user_456",
paymentInfo = SdkPaymentInfo(
amount = 100.0,
orderId = "ORDER_123",
transactionDate = "2026-04-01T12:00:00Z",
paymentSecurity = PaymentSecurity.TDS,
currency = "TRY",
installmentCount = 1
),
environment = BexEnvironment.DEV
)
BexFullSdk.init(context, initParams, callback)
BexFullSdk.start()
Otomatik işlemler:
- SDK, başlangıç token’ınızı oturum token’ı ile değiştirir.
- Kullanıcı cüzdan durumunu kontrol eder (bağlı / bağlı değil / yeni kullanıcı).
- Kayıtlı kart varsa listeler.
- Uygun ödeme akışını gösterir.
Kurulum
SDK Bağımlılığının Eklenmesi
Seçenek 1: Modül bağımlılığı (geliştirme ve test için)
// settings.gradle.kts
include(":sdk")
// app/build.gradle.kts
dependencies {
implementation(project(":sdk"))
}
Seçenek 2: AAR bağımlılığı (yayınlandığında)
// app/build.gradle.kts
dependencies {
implementation("com.bkm.mobil:payment-sdk:1.0.0")
}
İzinler
SDK internet erişimi gerektirmektedir. AndroidManifest.xml dosyanıza eklenmelidir:
<manifest>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
...>
<!-- aktiviteleriniz -->
</application></manifest>
Temel Entegrasyon
Adım 1: SDK sınıflarının import edilmesi
import com.bkm.mobil.sdk.api.BexFullSdk
import com.bkm.mobil.sdk.api.BexEnvironment
import com.bkm.mobil.sdk.api.PaymentCallback
import com.bkm.mobil.sdk.api.PaymentResult
import com.bkm.mobil.sdk.api.BexSdkError
import com.bkm.mobil.sdk.api.PaymentSecurity
import com.bkm.mobil.sdk.api.SdkPaymentInfo
Adım 2: SDK başlatma
SDK, kimlik doğrulama token’ı, satıcı bilgileri ve sonuç geri çağrısı ile başlatılmalıdır:
BexFullSdk.init(
context = this,
initParams = SdkInitParams(
token = "your_initial_auth_token",
merchantId = "your_merchant_id",
transactionId = "your_transaction_id",
gsmNo = "5551234567",
merchantUserId = "your_user_id",
paymentInfo = SdkPaymentInfo(
amount = 100.0,
orderId = "your_order_id",
transactionDate = "2026-04-01T12:00:00Z",
paymentSecurity = PaymentSecurity.TDS,
currency = "TRY",
installmentCount = 1
),
environment = BexEnvironment.DEV
),
callback = object : PaymentCallback {
override fun onPaymentSuccess(result: PaymentResult) {
val transactionId = result.transactionId
val amount = result.amount
Log.d("Payment", "Başarılı. İşlem ID: $transactionId")
}
override fun onError(error: BexSdkError) {
when (error) {
is BexSdkError.Network -> {
Log.e("Payment", "Ağ hatası: ${error.message}")
}
is BexSdkError.Cancelled -> {
Log.d("Payment", "Ödeme iptal edildi")
}
is BexSdkError.Unauthorized -> {
Log.e("Payment", "Yetkisiz: ${error.message}")
}
is BexSdkError.Api -> {
Log.e("Payment", "API hatası: ${error.message}")
}
is BexSdkError.Unknown -> {
Log.e("Payment", "Hata: ${error.message}")
}
}
}
},
theme = null
)
Adım 3: Ödeme akışını başlatma
Seçenek 1: Tam ekran Activity (varsayılan)
BexFullSdk.start()
Seçenek 2: Alt sayfa (Bottom Sheet)
BexFullSdk.showAsBottomSheet(activity = this)
showAsBottomSheet, Activity türüne göre uyumlu çalışır; Activity, AppCompatActivity,
ComponentActivity ve FragmentActivity desteklenir.
Örnek Kullanım
Activity örneği
class CheckoutActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
CheckoutScreen(
onPaymentClick = { startPayment() }
)
}
}
}
private fun startPayment() {
val token = getAuthToken()
val merchantId = getMerchantId()
val merchantUserId = getUserId()
BexFullSdk.init(
context = this,
initParams = SdkInitParams(
token = token,
merchantId = merchantId,
transactionId = "TX_123",
gsmNo = "5551234567",
merchantUserId = merchantUserId,
paymentInfo = SdkPaymentInfo(
amount = 100.0,
orderId = "ORDER_123",
transactionDate = "2026-04-01T12:00:00Z",
paymentSecurity = PaymentSecurity.TDS,
currency = "TRY",
installmentCount = 1
),
environment = BexEnvironment.DEV
),
callback = object : PaymentCallback {
override fun onPaymentSuccess(result: PaymentResult) {
Toast.makeText(
this@CheckoutActivity,
"Ödeme başarılı. TX: ${result.transactionId}",
Toast.LENGTH_LONG
).show()
navigateToOrderConfirmation(result.transactionId)
}
override fun onError(error: BexSdkError) {
val message = when (error) {
is BexSdkError.Network -> "Ağ hatası. Tekrar denenmelidir."
is BexSdkError.Cancelled -> "Ödeme iptal edildi."
is BexSdkError.Api -> error.displayMessage
is BexSdkError.Unknown -> "Bir hata oluştu. Tekrar denenmelidir."
else -> error.displayMessage
}
Toast.makeText(this@CheckoutActivity, message, Toast.LENGTH_SHORT).show()
}
}
)
BexFullSdk.start()
}
private fun getAuthToken(): String {
return "your_auth_token"
}
}
Compose UI örneği
@Composable
fun CheckoutScreen(onPaymentClick: () -> Unit) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.Center
) {
Button(
onClick = onPaymentClick,
modifier = Modifier.fillMaxWidth()
) {
Text("Öde")
}
}
}
API Referansı
BexFullSdk
Başlatma ve ödeme akışı için ana SDK nesnesidir.
init()
Kullanımdan önce SDK’yı başlatır.
BexFullSdk.init(
context: Context,
initParams: SdkInitParams,
callback: PaymentCallback,
theme: BexFullSdkTheme? = null,
config: BexFullSdkConfig = BexFullSdkConfig()
)
Parametreler:
context: Uygulama veya Activity context (uygulama context olarak saklanır).initParams: Token, GSM numarası (gsmNo), ödeme tutarı vb. başlatma parametreleri.callback: Ödeme sonucu (başarı / hata) için geri çağrı;CARD_SELECTION_ONLYmodunda ayrıcaonCardSelectedkullanılır (aşağıdaki SdkMode bölümüne bakılmalıdır).theme(isteğe bağlı): Uygulama görünümünüze uyum için özel tema.config(isteğe bağlı):BexFullSdkConfig— Troy Sonic sesi (troySonicSoundEnabled) ve çalışma modu (mode/SdkMode). Ayrıntılar için BexFullSdkConfig bölümüne bakılmalıdır.
start()
Ödeme ekranını tam ekran açar.
BexFullSdk.start()
Önce init() çağrılmamışsa IllegalStateException fırlatılır.
showAsBottomSheet()
Ödeme ekranını alt sayfa (bottom sheet) olarak açar.
BexFullSdk.showAsBottomSheet(activity: Activity)
Tüm Activity türleriyle uyumludur. Modal alt sayfa, kaydırarak veya geri tuşu ile kapatıldığında iptal geri çağrısı tetiklenir.
BexFullSdkConfig
init() çağrısında SDK davranışını (ses ve çalışma modu) özelleştirmek için kullanılır.
data class BexFullSdkConfig(
val troySonicSoundEnabled: Boolean = true,
val mode: SdkMode = SdkMode.PAYMENT
)
troySonicSoundEnabled: Troy Sonic ile ilişkili ses geri bildirimlerinin açık (true) veya kapalı (false) olması. Varsayılan:true.mode: SDK’nın ödeme mi yoksa yalnızca kart seçimi mi yapacağını belirler. Ayrıntılar için SdkMode.
Örnek — kart seçim modu:
import com.bkm.mobil.sdk.api.BexFullSdkConfig
import com.bkm.mobil.sdk.api.SdkMode
BexFullSdk.init(
context = this,
initParams = initParams,
callback = callback,
theme = null,
config = BexFullSdkConfig(
troySonicSoundEnabled = true,
mode = SdkMode.CARD_SELECTION_ONLY
)
)
SdkMode
SDK’nın kart listesi ekranındaki birincil aksiyonu ve ödeme başlatılıp başlatılmayacağını belirler.
enum class SdkMode {
PAYMENT,
CARD_SELECTION_ONLY
}
PAYMENT (varsayılan)
Standart ödeme akışı: kullanıcı kartı seçer, SDK ödeme işlemini (3DS, OTP vb. paymentSecurity değerine göre) başlatır ve tamamlandığında onPaymentSuccess(PaymentResult) çağrılır. Kart seçim ekranındaki birincil buton tutar ve para birimini gösterir (ör. «… Öde»). SdkInitParams.paymentInfo dolu olmalıdır; aksi halde ödeme başlatılamaz ve kullanıcı aksiyonu sırasında BexSdkError.Unknown("Ödeme bilgisi eksik. [PAYMENT_MODE_PAYMENT_INFO_NULL]") hatası alınır.
CARD_SELECTION_ONLY
Yalnızca kart seçimi: kullanıcı kayıtlı kartlardan birini seçer; SDK ödeme başlatmaz. Sonuç PaymentCallback.onCardSelected(CardSelectionResult) ile döner; CardSelectionResult.selectedCard içinde seçilen kartın BexCardInfo bilgisi yer alır. Birincil buton metni tutar göstermez; «Kartı Seç» benzeri bir ifade kullanılır. Entegrasyonda bu mod için onCardSelected metodunun override edilmesi gerekmektedir (arayüzde varsayılan implementasyon boştur, geriye dönük uyumluluk içindir).
Not: CARD_SELECTION_ONLY kullanırken ödeme API’leri çağrılmadığı için paymentInfo zorunlu değildir; yine de initParams (token, merchantId, transactionId, gsmNo, merchantUserId vb.) cüzdan ve kart listesi için gerektiği gibi sağlanmalıdır.
SdkInitParams
SDK başlatma parametreleri.
data class SdkInitParams(
val token: String, // Backend'den alınan başlangıç token'ı
val merchantId: String, // Satıcı tanımlayıcı
val transactionId: String, // Satıcı tarafındaki işlem/transaction tanımlayıcı
val gsmNo: String, // Kullanıcı GSM numarası (5XXXXXXXXX)
val merchantUserId: String, // Satıcı tarafındaki kullanıcı tanımlayıcı
val paymentInfo: SdkPaymentInfo? = null,
val environment: BexEnvironment = BexEnvironment.DEV
)
Token akışı: SDK iki aşamalı token kullanır. Sizin verdiğiniz başlangıç token’ı ile /sdk/init
çağrılır; backend oturum token’ı döner ve SDK bunu güvenli saklar. Sonraki tüm API çağrıları
otomatik olarak bu oturum token’ı ile yapılır.
SdkPaymentInfo
İşlem başlatma sırasında kullanılabilen ödeme bilgileri.
data class SdkPaymentInfo(
val amount: Double,
val orderId: String,
val transactionDate: String,
val paymentSecurity: PaymentSecurity,
val currency: String,
val installmentCount: Int
)
paymentSecurity: İşlemin 3DS (TDS) veya Non-3D + OTP isteği (OTP/NONE) ile başlatılmasını belirtir. Bu yalnızca istemci tarafı bir tercihtir; OTP dönüşü her zaman yanıt gövdesine göre ele alınmalıdır. Non-3D isteklerde API gövdesinewithOtpalanı eklenir (OTP→true,NONE→false).
PaymentSecurity
enum class PaymentSecurity {
TDS,
OTP,
NONE
}
TDS: 3-D Secure; 3D init uçları kullanılır.OTP: Non-3D init, istek gövdesindewithOtp = true.NONE: Non-3D init, istek gövdesindewithOtp = false.
BexEnvironment
SDK’nın bağlanacağı API ortamını belirler.
enum class BexEnvironment { DEV, TEST, PREPROD, PROD }
PaymentCallback
Ödeme sonuçlarını almak için arayüz.
interface PaymentCallback {
fun onPaymentSuccess(result: PaymentResult)
fun onError(error: BexSdkError)
fun onCardSelected(result: CardSelectionResult) { }
}
onPaymentSuccess(result: PaymentResult): Ödeme başarıyla tamamlandığında çağrılır (SdkMode.PAYMENT).onError(error: BexSdkError): Ödeme başarısız veya iptal edildiğinde çağrılır.onCardSelected(result: CardSelectionResult): YalnızcaSdkMode.CARD_SELECTION_ONLYmodunda, kullanıcı kartı seçtiğinde çağrılır. Varsayılan gövde boştur; bu modu kullanırken seçilen kart burada işlenmelidir. Yapı için CardSelectionResult bölümüne bakılmalıdır.
PaymentResult
Başarılı ödeme sonucu.
data class PaymentResult(
val transactionId: String,
val amount: Double,
val cardNumber: String?
)
SdkMode.CARD_SELECTION_ONLY modunda ödeme yapılmadığı için onPaymentSuccess bu akışta tetiklenmez; bunun yerine onCardSelected kullanılır.
CardSelectionResult
Yalnızca kart seçim modunda (SdkMode.CARD_SELECTION_ONLY) onCardSelected ile dönen sonuç.
data class CardSelectionResult(
val selectedCard: BexCardInfo
)
BexCardInfo
Kart seçim modu yanıtında CardSelectionResult.selectedCard alanı içinde dönen kart bilgisi.
Dönen alanlar:
cardId: Kartın benzersiz kimliğimaskCardNumber: Maskelenmiş kart numarasıcardAlias: Kartın takma adıbinValue: Kart BIN değeriimageUrl: Kart görseli URL’ibankInformation: Banka/kart bilgilericardType: Kart tipi (ör.CreditCard)cardBrandType: Kart marka tipicardBrand: Kart markası (ör.Troy)bankShortName: Banka kısa adı (ör.TESTBANK)
active: Kartın aktiflik durumu
Yanıt örneği:
{
"cardId": "019d2dad-34bc-7b00-959d-0bef3009afa5",
"maskCardNumber": "123456******1234",
"cardAlias": "Maaş Kartım",
"binValue": "12345678",
"imageUrl": "https://...default_card.png",
"bankInformation": {
"cardType": "CreditCard",
"cardBrandType": "Marka Yok",
"cardBrand": "Troy",
"bankShortName": "TESTBANK"
},
"active": true
}
BexSdkError
Hata türleri (mühürlü sınıf).
sealed class BexSdkError {
data class Network(val message: String) : BexSdkError()
data class Cancelled(val message: String) : BexSdkError()
data class Unauthorized(val message: String) : BexSdkError()
data class Unknown(val message: String) : BexSdkError()
data class Api(val message: String, val title: String? = null, val code: Int? = null) :
BexSdkError()
}
- Network: Ağ veya API iletişim hatası.
- Cancelled: Kullanıcı ödemeyi iptal etti.
- Unauthorized: Token geçersiz veya süresi dolmuş.
- Unknown: Beklenmeyen hata.
- Api: Sunucudan dönen iş kuralı hatası;
displayMessagekullanıcıya gösterilebilir.
Sunum Modları
1. Tam ekran Activity (varsayılan)
BexFullSdk.init(context, initParams, callback)
BexFullSdk.start()
2. Alt sayfa (Bottom Sheet)
BexFullSdk.init(context, initParams, callback)
BexFullSdk.showAsBottomSheet(this)
Alt sayfa modu: yuvarlatılmış üst köşe, sürükleyerek kapatma, geri tuşu ile iptal. Tam ekran modu ile aynı işlevsellik ve geri çağrılar kullanılır.
Tema Özelleştirme
SDK renk, tipografi, boşluk ve şekil özelleştirmesini destekler. Tüm alanlar isteğe bağlıdır; verilmezse varsayılan değerler kullanılır.
Temel kullanım
Tema API’si hem XML hem Compose uygulamalarla uyumludur; Compose import’u zorunlu değildir.
Compose örneği:
import com.bkm.mobil.sdk.api.BexFullSdkTheme
import androidx.compose.ui.graphics.toArgb
val customTheme = BexFullSdkTheme(
colors = BexFullSdkTheme.Colors(
primary = androidx.compose.ui.graphics.Color(0xFF6200EE).toArgb(),
textPrimary = 0xFF000000
),
shape = BexFullSdkTheme.Shape(
buttonCornerRadius = 8f
)
)
BexFullSdk.init(
context = this,
initParams = initParams,
callback = callback,
theme = customTheme
)
XML örneği (Compose olmadan):
import com.bkm.mobil.sdk.api.BexFullSdkTheme
val customTheme = BexFullSdkTheme(
colors = BexFullSdkTheme.Colors(
primary = getColor(R.color.brand_primary),
buttonPrimary = getColor(R.color.brand_primary),
textPrimary = getColor(R.color.text_primary)
),
shape = BexFullSdkTheme.Shape(
buttonCornerRadius = BexFullSdkTheme.DP_8,
buttonBorderWidth = BexFullSdkTheme.DP_2
)
)
Renk formatı
Android renk tamsayıları (0xAARRGGBB) kullanılır. Örn: 0xFF6200EE, getColor(R.color.xxx),
Compose’da Color(...).toArgb().
Kısmi özelleştirme
Yalnızca değiştirmek istediğiniz alanlar verilmelidir; diğerleri SDK varsayılanı kalır.
Sorun Giderme
“SDK başlatılmadı” hatası: start() veya showAsBottomSheet() öncesinde mutlaka init()
çağrılmalıdır.
Ağ hataları: Manifest’te internet izni, cihaz bağlantısı ve token geçerliliği kontrol edilmelidir.
Derleme hataları: SDK bağımlılığının eklendiğinden ve Gradle senkronizasyonunun yapıldığından emin olunmalıdır.
Ödeme ekranı açılmıyor: Logcat’te hata mesajları kontrol edilmelidir; init() çağrıldığından ve
context ile token’ın geçerli olduğundan emin olunmalıdır.
Ödeme bilgisi eksik: SdkMode.PAYMENT kullanılırken SdkInitParams.paymentInfo boş bırakılmamalıdır; aksi halde kullanıcı aksiyonu sırasında Ödeme bilgisi eksik. [PAYMENT_MODE_PAYMENT_INFO_NULL] hatası alınır.