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 refreshesError 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
| Code | HTTP | Meaning |
|---|---|---|
| ERR_GATEWAY_NOT_FOUND | 422 | Terminal gateway not configured |
| ERR_DUPLICATE_TRANSACTION | 409 | referenceId already used |
| ERR_REFUND_EXCEEDED | 400 | Refund amount > remaining balance |
| ERR_UNAUTHORIZED | 401 | Token expired (SDK auto-retries once) |
| ERR_FORBIDDEN | 403 | Tenant isolation violation |
| ERR_RATE_LIMITED | 429 | Too many requests |
| ERR_SYSTEM_ERROR | 500 | Server error (SDK retries 3x) |