add support for PayMV QR scan
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user