怎么从支付应用切回到我的应用?

移动开发 2026-07-12

我在一台集成了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预期你处理该事件以将应用带回到前台,而不是通过手动导航。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章