iOS Swift无SDK集成UPI支付:如何获取交易状态?
在Swift iOS中追踪UPI支付交易状态的解决方案
1. 通过DeepLink回调参数解析交易状态
当UPI应用完成支付后,会通过DeepLink跳转回你的APP,并在URL中附加交易结果参数。你需要在APP的DeepLink处理逻辑中解析这些参数,区分成功、失败或待处理状态。
在SceneDelegate(iOS 13+)或AppDelegate(iOS 13以下)中处理URL跳转:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } handleUPIResponse(url: url) } private func handleUPIResponse(url: URL) { guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false), let queryItems = components.queryItems else { return } // 提取交易状态(兼容不同UPI应用的参数名) let txnStatus = queryItems.first { item in ["txnStatus", "status", "transactionStatus"].contains(item.name) }?.value // 提取响应码(用于精细错误判断) let responseCode = queryItems.first { item in ["responseCode", "respCode", "code"].contains(item.name) }?.value // 提取交易ID(用于后端查询兜底) let txnId = queryItems.first { $0.name == "txnId" }?.value // 根据状态处理业务逻辑 DispatchQueue.main.async { switch txnStatus?.uppercased() { case "SUCCESS": self.OrderPlaced() // 你的成功回调方法 case "FAILURE", "FAILED": self.showPaymentFailureAlert(message: responseCode ?? "支付失败") case "PENDING", "SUBMITTED": self.showPaymentPendingAlert(txnId: txnId) default: self.showUnknownStatusAlert() } } }
2. 兼容不同UPI应用的参数差异
不同UPI应用(Google Pay、PhonePe、PayTM)返回的参数名可能不一致,比如部分应用用status代替txnStatus,用respCode代替responseCode。提取参数时覆盖常见的参数名,避免遗漏状态。
3. 后端异步查询兜底(必须)
DeepLink返回的状态可能存在丢失或被篡改的风险,因此必须通过后端调用NPCI官方的交易查询接口,或支付服务商的查询接口,来最终确认交易状态。
前端获取到txnId后,发起异步请求到后端查询:
private func verifyTransactionStatus(with txnId: String) { guard let url = URL(string: "https://your-backend-domain.com/api/verify-upi-txn?txnId=\(txnId)") else { return } let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in guard let self = self, let data = data, error == nil else { DispatchQueue.main.async { self?.showNetworkErrorAlert() } return } do { let result = try JSONDecoder().decode(UPIStatusResponse.self, from: data) DispatchQueue.main.async { switch result.status { case "success": self.OrderPlaced() case "failed": self.showPaymentFailureAlert(message: result.errorMessage ?? "支付失败") case "pending": self.showPaymentPendingAlert(txnId: txnId) default: self.showUnknownStatusAlert() } } } catch { DispatchQueue.main.async { self?.showParseErrorAlert() } } } task.resume() } // 定义后端返回的模型 struct UPIStatusResponse: Codable { let status: String let txnId: String let errorMessage: String? }
4. 处理用户未返回APP的情况
如果用户在支付后直接关闭UPI应用,没有跳转回你的APP,你需要:
- 当用户再次打开APP时,自动查询未完成订单的交易状态
- 提供手动查询按钮,让用户主动触发状态检查
内容的提问来源于stack exchange,提问作者Kathiravan H
相关产品推荐
相关产品推荐

