forked from thijooree/android
49 lines
1.4 KiB
Kotlin
49 lines
1.4 KiB
Kotlin
package sh.sar.basedbank.util
|
|
|
|
data class PaymvQrData(
|
|
val accountNumber: String?,
|
|
val amount: String?,
|
|
val purpose: String?,
|
|
val merchantName: String?
|
|
)
|
|
|
|
object PaymvQrParser {
|
|
|
|
fun parse(raw: String): PaymvQrData? {
|
|
return try {
|
|
val root = parseTlv(raw)
|
|
|
|
// ID 26: Favara/PayMV merchant account info
|
|
val merchantInfo = root["26"]?.let { parseTlv(it) }
|
|
|
|
// ID 54: transaction amount
|
|
// ID 59: merchant/recipient name
|
|
// ID 62: additional data (sub-ID 08 = purpose)
|
|
val additionalData = root["62"]?.let { parseTlv(it) }
|
|
|
|
PaymvQrData(
|
|
accountNumber = merchantInfo?.get("03"),
|
|
amount = root["54"],
|
|
purpose = additionalData?.get("08"),
|
|
merchantName = root["59"]
|
|
)
|
|
} catch (_: Exception) {
|
|
null
|
|
}
|
|
}
|
|
|
|
private fun parseTlv(data: String): Map<String, String> {
|
|
val result = mutableMapOf<String, String>()
|
|
var pos = 0
|
|
while (pos + 4 <= data.length) {
|
|
val id = data.substring(pos, pos + 2)
|
|
val len = data.substring(pos + 2, pos + 4).toIntOrNull() ?: break
|
|
pos += 4
|
|
if (pos + len > data.length) break
|
|
result[id] = data.substring(pos, pos + len)
|
|
pos += len
|
|
}
|
|
return result
|
|
}
|
|
}
|