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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:37:44