RazorPay Android集成问题:使用callback_url时卡在支付成功页
解决RazorPay Android SDK测试模式下支付成功后卡在页面的问题
我来帮你梳理下这个问题的原因和解决方案,你遇到的测试模式下支付成功后停留在RazorPay页面、无法触发APP内回调的情况,核心问题是你的callback_url返回的响应格式不符合RazorPay的要求,和你启动支付的代码逻辑关系不大。
为什么会卡住?
RazorPay的Webview在测试模式下,并不会直接识别你返回的JSON响应,它需要从callback_url获取一段带有自动跳转逻辑的HTML内容。如果返回纯JSON,Webview无法执行关闭/跳转操作,就会一直停留在成功页面,同时因为栈里多了一个回调页面,按返回键会出现两个选项。
具体修正步骤
修改回调接口的返回格式
把你的${ApiConstant.BASE_URL}orders/payment接口返回的内容,从JSON{"payment": "success"}改成以下HTML代码:<html> <body> <script type="text/javascript"> // 关闭RazorPay的Webview并触发APP内成功回调 window.close(); window.location.href = 'razorpay://payment/success'; </script> </body> </html>这段脚本会自动关闭Webview,并通过深度链接通知APP支付成功,触发你APP内的回调逻辑。
确保APP内的回调逻辑正确实现
你需要在对应的Activity/Fragment中实现RazorpayPaymentResultListener接口,来接收支付结果:class YourPaymentActivity : AppCompatActivity(), RazorpayPaymentResultListener { // ... 你的startPayment方法保持不变 ... override fun onPaymentSuccess(paymentId: String) { // 这里处理支付成功后的逻辑,比如更新订单状态、跳转页面等 Toast.makeText(this, "支付成功!支付ID: $paymentId", Toast.LENGTH_LONG).show() } override fun onPaymentError(errorCode: Int, response: String?) { // 处理支付失败的逻辑 Toast.makeText(this, "支付失败: $response", Toast.LENGTH_LONG).show() } }另外,如果你使用的是新版SDK,记得在初始化Checkout时绑定这个监听:
co.setRazorpayPaymentResultListener(this)
额外说明
当你修改完回调接口的返回格式后,测试模式下支付成功后,Webview会自动关闭并回到你的APP,同时触发onPaymentSuccess方法,也就不会再出现返回键的两个选项了。
内容的提问来源于stack exchange,提问作者Aanal Shah
相关产品推荐
相关产品推荐

