我在使用 3ds 卡处理付款时遇到以下问题。 我的应用程序使用 Jetpack 撰写 我有一个付款屏幕。因此,我使用新卡或保存的卡创建付款意向。然后我检查是否需要 3ds 并按以下方式启动 3ds 处理:
@Composable
fun ThreeDSScreen(
publishableKey: String,
secret: String,
onSuccess: () -> Unit,
onCancel: () -> Unit,
onFail: () -> Unit
) {
val paymentLauncher = rememberPaymentLauncher(
publishableKey = publishableKey,
stripeAccountId = null,
callback = PaymentResultCallback(
onSuccess = onSuccess,
onCancel = onCancel,
onFail = onFail
)
)
val needLaunch = remember { mutableStateOf(true) }
LaunchedEffect(secret) {
if (needLaunch.value) {
needLaunch.value = false
delay(200)
paymentLauncher.confirm(
ConfirmPaymentIntentParams.create(
clientSecret = secret,
paymentMethodType = PaymentMethod.Type.CardPresent
)
)
}
}
}
class PaymentResultCallback(
private val onSuccess: () -> Unit,
private val onCancel: () -> Unit,
private val onFail: () -> Unit
) : PaymentLauncher.PaymentResultCallback {
override fun onPaymentResult(paymentResult: PaymentResult) {
when (paymentResult) {
is PaymentResult.Completed -> { onSuccess() }
is PaymentResult.Canceled -> { onCancel() }
is PaymentResult.Failed -> { onFail() }
}
}
}
我还将客户端密钥保存在加密的共享首选项中。 无论用户失败、取消或确认,它都可以正常工作。 但让我们想象一下我停止了应用程序。我想在我的应用程序中开始检查是否存在挂起的意图。所以我检查一下。 如果我看到一个待定的意图,我会尝试以同样的方式确认它。将客户端密钥传递给此可组合项。 我使用带有 3ds 的 Stripe 测试 VISA 卡来进行检查。 因此,我启动此函数并看到 Stripe 3ds 测试屏幕正在启动,之后 Stripe 的行为就好像用户按下了失败键一样。 我做错了什么?我检查了我的密钥没问题。
听起来您遇到了一个问题,即当您在应用程序重新启动后尝试确认付款意图时,3D 安全 (3DS) 流程过早失败,即使 clientSecret 和设置看起来正确。该问题可能与应用程序重新启动后如何触发付款确认流程以及重新初始化期间应用程序中如何处理付款状态有关。
代码如下: 代码的第一张图片: [1]:https://i.sstatic.net/nzkDItPN.png