怎么从支付应用切回到我的应用?
我在一台集成了NEXO协议和Besteron作为支付方式的SUNMI P2终端上遇到了一个问题。为了处理这笔支付,我的应用向NEXO API发送了一个HTTP请求,随后显示了Besteron的界面,提示用户刷卡。当读取到卡片后,这个Besteron界面仍然保持在前台,而不会将用户带回到我的应用。
Android版本11
我向NEXO协议发送了HTTP请求,当收到响应时,paymentResult.collect会触发。在collect中,我尝试通过Intent.FLAG_ACTIVITY_REORDER_TO_FRONT将应用带回前台,但不起作用。随后我调用doTransactionTickets,它会调用我的API,进而触发transactionResult.collect,它只是跳转到另一个页面。
应用只有一个MainActivity和多个Fragment,以下代码位于CheckoutFragment.kt中
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {
viewModel.paymentResult.collect {
Log.d("paymentTest", "The payment response has been received: $it")
val intent = Intent(requireActivity(), MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
}
requireActivity().startActivity(intent)
viewModel.doTransactionTickets (
binding.noteText.editText?.text.toString(),
args.itemType,
args.itemId,
args.selectedTickets!!.tickets,
totalPrice.formatWithDecimalPlaces(),
args.date,
args.packItems?.result,
args.itemSeats,
client
)
}
}
}
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {
viewModel.transactionResult.collect { item ->
val receipt = viewModel.receiptPdf.value?.let { PdfDocument(it) }
val ticket = viewModel.ticketPdf.value?.let { PdfDocument(it) }
Log.d("paymentTest", "Transaction done")
requireActivity().runOnUiThread {
findNavController().navigate(
R.id.action_checkoutFragment_to_confirmationFragment,
Bundle().apply {
putString("name", args.name)
putFloat("totalPrice", totalPrice.toFloat())
putString(
"ticketsDescription",
binding.summaryTicketBreakdown.text.toString()
)
putString("eventDateTime", args.date)
putString("orderNumber", item.toString())
putInt("itemType", args.itemType)
putBoolean("hasTimetable", args.hasTimetable)
putSerializable("receipt", receipt)
putSerializable("ticket", ticket)
}
)
}
}
}
}
我还能怎么做?欢迎提出想法。
解决方案
如果支付界面以单独的Activity打开,这种情况就可能发生。交易完成后,Android可能会将该Activity保留在前台,因此你的应用不会自动返回前台。与其在Collect中导航到一个Fragment,不如在收到结果时显式地把主Activity带回前台。
你可以使用如下标记重新启动你的Activity,例如
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT或 Intent.FLAG_ACTIVITY_SINGLE_TOP。
这通常会把现有的Activity带到前台,而不是创建一个新的Activity。也值得查看NEXO/Besteron的文档,看看他们在交易后是否提供回调或返回的Intent。很多支付SDK预期你处理该事件以将应用带回到前台,而不是通过手动导航。