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

