iOS Swift中使用URL Scheme调用UPI支付(PhonePe/GPay)报错排查
UPI支付URL Scheme问题排查
以下是你的URL Scheme存在的核心问题及修正方案:
问题1:无效的URL路径结构
你的两个支付URL中都存在upi://pay的错误格式,正确的UPI支付路径应为upi/pay(单斜杠分隔)。双斜杠会导致支付应用无法正确解析请求路径,直接触发错误。
问题2:缺少回调URL参数
要获取支付成功的状态返回,必须在URL中添加url参数,指定你的应用自定义Scheme作为回调地址。这样支付完成后,支付应用会跳转回你的应用并携带支付状态参数。
问题3:重复URL编码的备注参数
tn参数中的Pay%2520to%2520MOFSL是双重编码的结果(%25是%的URL编码,导致%20被二次编码),正确的编码应为Pay%20to%20MOFSL(单次URL编码)。重复编码可能导致支付应用无法正确显示付款备注,甚至解析失败。
修正后的URL示例
PhonePe修正后URL
phonepe://upi/pay?pa=Motilal2005@hdfcbank&pn=MOFSL&mc=6021&tr=uft_2288932c6345a5&tn=Pay%20to%20MOFSL&mode=03&am=100&cu=INR&url=your-app-scheme://upi-callback
GPay修正后URL
tez://upi/pay?pa=Motilal2005@hdfcbank&pn=MOFSL&mc=6021&tr=uft_2288daf8bd45a5&tn=Pay%20to%20MOFSL&mode=03&am=100&cu=INR&url=your-app-scheme://upi-callback
注:将your-app-scheme替换为你在Info.plist中注册的应用自定义URL Scheme
后续回调处理
支付完成后,支付应用会通过你指定的url参数跳转回你的应用,你需要在代码中处理这个回调:
UIKit实现
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { return false } // 获取支付状态 if let status = queryItems.first(where: { $0.name == "status" })?.value { if status == "SUCCESS" { // 处理支付成功逻辑 } else { // 处理支付失败/取消逻辑 } } return true }
SwiftUI实现
@main struct YourApp: App { var body: some Scene { WindowGroup { ContentView() .onOpenURL { url in guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { return } if let status = queryItems.first(where: { $0.name == "status" })?.value { if status == "SUCCESS" { // 处理支付成功逻辑 } } } } } }
内容的提问来源于stack exchange,提问作者shreyas1811
相关产品推荐
相关产品推荐

