Android Kotlin实现支付完成后自动关闭Clover Sales App返回自研应用
实现Clover Sales App交易完成后自动返回自研应用的方案
要实现交易完成后从Clover Sales App自动返回自研应用,核心是利用Android的Activity回调机制,并遵循Clover的Intent交互规范,具体步骤如下:
1. 替换startActivity为Activity Result API
由于startActivityForResult已被废弃,推荐使用Activity Result API来接收Clover的返回结果,确保交易状态变更时能触发回调。
注册Activity Result回调
在你的主Activity中注册回调处理器:
private val cloverPaymentResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> when (result.resultCode) { Activity.RESULT_OK -> { // 交易成功完成,可在此处理后续逻辑(如更新订单状态) // 此时Clover会自动关闭,自研应用回到前台 } Activity.RESULT_CANCELED -> { // 用户取消交易,处理取消逻辑 } else -> { // 处理其他异常状态 Log.e("CloverSales", "交易返回未知状态:${result.resultCode}") } } }
2. 重构Clover支付Intent的构造逻辑
不要直接启动Clover的主Activity,而是使用Clover官方定义的支付Action(Intents.ACTION_PAY),并明确指定回调目标,确保Clover能正确返回你的应用:
private fun openCloverSalesApp(amountInCents: Long) { val packageManager: PackageManager = packageManager val payIntent = Intent(Intents.ACTION_PAY).apply { // 指定Clover Sales App的包名,避免Intent被其他应用拦截 setPackage(CLOVER_SALES_PACKAGE) // 传递支付参数 putExtra(Intents.EXTRA_AMOUNT, amountInCents) putExtra("CustomerId", customerId.toString()) // 指定回调的自研应用Activity,确保返回目标正确 component = ComponentName(packageName, YourMainActivity::class.java.name) // 设置Flags,避免创建重复的Activity实例 flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP } if (payIntent.resolveActivity(packageManager) != null) { cloverPaymentResultLauncher.launch(payIntent) } else { Log.e("CloverSales", "未安装Clover Sales App") } }
3. 配置Manifest文件,允许Clover回调
在自研应用的AndroidManifest.xml中,给接收回调的Activity添加Intent Filter,并设置android:exported="true",确保Clover能启动该Activity:
<activity android:name=".YourMainActivity" android:exported="true"> <!-- 其他已有的intent-filter --> <intent-filter> <action android:name="com.clover.intent.action.PAY_COMPLETED" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
关键注意事项
- 确认Clover版本兼容性:部分旧版Clover可能需要调整Intent参数,需匹配官方规范使用。
- 处理返回数据:可通过
result.data?.getStringExtra(Intents.EXTRA_TRANSACTION_ID)获取交易ID等详情,用于后续业务逻辑。 - 避免多实例:通过
FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP确保回到自研应用时使用已存在的Activity实例,避免栈混乱。
内容的提问来源于stack exchange,提问作者Priya Pandey
相关产品推荐
相关产品推荐

