Android SDK (Kotlin)

Full contract reference: see clients/CONTRACT.md in the backend repo.

Installation

// build.gradle.kts (app module)
dependencies {
    implementation("io.onemyposmate:sdk:1.0.0")
}

Quick Start

val client = OneMyPosMateClient.Builder(
    baseUrl = "https://payus.co.nz",
    system = "pos"
).build()

val resp = client.payments.payNow(
    PayNowRequest(
        grandTotal = "10.00",
        referenceId = "REF-001",
        branchId = 17,
        configId = 123,
        channel = "WECHAT"
    )
)

Authentication Flow

// 1. Activate (one-time)
client.auth.activate("ABC123")

// 2. Token is cached + auto-refreshed
// Every subsequent call uses the cached JWT
val token = client.auth.currentToken()

// 3. Token refreshes automatically 60s before expiry
// Single-flight lock prevents concurrent refreshes

Error Handling

try {
    client.payments.payNow(request)
} catch (e: OneMyPosMateException) {
    when (e.errorCode) {
        ErrorCode.ERR_GATEWAY_NOT_FOUND -> // Terminal not configured
        ErrorCode.ERR_DUPLICATE_TRANSACTION -> // referenceId reused
        ErrorCode.ERR_UNAUTHORIZED -> // Token expired, SDK auto-retried
        else -> // Other errors
    }
}

Common Error Codes

CodeHTTPMeaning
ERR_GATEWAY_NOT_FOUND422Terminal gateway not configured
ERR_DUPLICATE_TRANSACTION409referenceId already used
ERR_REFUND_EXCEEDED400Refund amount > remaining balance
ERR_UNAUTHORIZED401Token expired (SDK auto-retries once)
ERR_FORBIDDEN403Tenant isolation violation
ERR_RATE_LIMITED429Too many requests
ERR_SYSTEM_ERROR500Server error (SDK retries 3x)