You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Revolut Pay SDK在WebView支付重定向后因格式错误的返回URI崩溃

Revolut Pay SDK在WebView支付重定向后因格式错误的返回URI崩溃

我之前在集成Revolut Pay SDK的时候,碰到过几乎一模一样的生产环境崩溃问题!沙箱环境一切正常,但用WebView fallback完成支付后,APP直接炸掉,错误栈和你贴的完全一致——都是java.lang.UnsupportedOperationException: This isn't a hierarchical URI。

问题根源分析

从错误栈能看出来,崩溃发生在Revolut SDK内部调用Uri.getQueryParameterNames()的时候,这个方法要求URI必须是分层结构(也就是符合scheme://host/path?query的标准格式)。而生产环境WebView支付完成后重定向回来的URI,大概率不符合分层要求,或者SDK在生产环境的重定向逻辑存在bug(毕竟沙箱环境完全正常)。更麻烦的是,SDK会在你手动处理Intent之前自动尝试解析URI,所以哪怕你注释掉自己的handleDeepLink代码,崩溃依然会发生。

我试过的有效解决方案

1. 先确认实际返回的URI格式

首先得搞清楚生产环境WebView到底返回了什么URI——在handleDeepLink里先把完整URI打日志输出:

private fun handleDeepLink(intent: Intent?) {
    intent?.data?.let { uri ->
        Log.d("RevolutDeepLink", "Received raw URI: $uri") // 先打印实际收到的URI
        // 后续处理逻辑
    }
}

我当时发现生产环境返回的URI居然是myapp:revolut-pay(缺少//,属于非分层URI),而沙箱环境返回的是正常的myapp://revolut-pay?xxx=yyy。

2. 修改ReturnUri为带路径的分层格式

沙箱环境对URI格式的容忍度更高,但生产环境可能要求更严格。我把ReturnUri改成带路径的格式后,问题直接解决了:

  • SDK初始化时更新ReturnUri:
    RevolutPayments.revolutPay.init(
        environment = RevolutPayEnvironment.MAIN,
        returnUri = Uri.parse("myapp://revolut-pay/callback"), // 新增/callback路径
        merchantPublicKey = "...",
        // 其他参数保持不变
    )
    
  • 同步更新AndroidManifest里的Intent Filter:
    <data 
        android:scheme="myapp" 
        android:host="revolut-pay" 
        android:path="/callback" /> <!-- 新增路径匹配规则 -->
    

3. 给冷启动场景补充Intent处理

如果支付过程中APP被后台杀死,冷启动时不会触发onNewIntent,需要在onCreate里也处理启动Intent:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 其他初始化代码...
    handleDeepLink(intent) // 冷启动时处理启动用的Intent
}

4. 临时拦截修复非分层URI

如果上面的方法都不管用,可以在传给SDK之前,手动把非分层URI转换成标准分层格式:

private fun handleDeepLink(intent: Intent?) {
    intent?.data?.let { originalUri ->
        var fixedUri = originalUri
        // 检查是否为非分层URI
        if (!fixedUri.isHierarchical) {
            val scheme = fixedUri.scheme
            val ssp = fixedUri.schemeSpecificPart
            if (scheme != null && ssp.isNotEmpty()) {
                // 手动构造符合要求的分层URI
                fixedUri = Uri.parse("$scheme://$ssp")
            }
        }
        try {
            RevolutPayments.revolutPay.handle(fixedUri)
        } catch (e: Exception) {
            Log.e("RevolutDeepLink", "Error handling URI", e)
        }
    }
}

终极方案:联系Revolut技术支持

因为这个问题只出现在生产环境,沙箱完全正常,很大概率是Revolut SDK在生产环境的WebView重定向逻辑存在bug。我当时在修改ReturnUri解决问题后,也给他们提了工单,后来他们的SDK更新后这个问题就彻底消失了。所以如果你的项目时间允许,最好同时联系他们的技术支持反馈这个问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:18:03