PayTM All-In-One SDK 支付卡在处理中,委托人未被调用

PayTM All-In-One SDK payment stuck on processing and delegates are not getting called

我正在尝试使用他们提供的一体化 SDK 集成 Paytm 支付 sdk。我正在使用 SDK based integration 。但是付款完成后,它会卡在带有“正在处理付款”文本的页面上。即使支付完成,也不是在调用 didFinish 委托函数。只有在使用 openPaymentWebVC 完成支付时才会出现此问题,如果我们直接使用 paytm 应用程序一切正常。

self.handler.openPaytm(merchantId: PayTmKeys.mId, orderId: payTmOrderId, txnToken: payTmTxnToken, amount:strPayment, callbackUrl: PayTmKeys.verifyUrl+self.payTmOrderId, delegate: self, environment: .production)

委托函数如下

extension CAPaymentGatewayViewController: AIDelegate {
    
    func openPaymentWebVC(_ controller: UIViewController?) {

        if let vc = controller {                
            DispatchQueue.main.async {[weak self] in
                self?.present(vc, animated: true, completion: nil)
            }
        }
    }
    
    
    
    
    func didFinish(with status: AIPaymentStatus, response: [String : Any]) {
        print("Response: \(response)")
    }
}

使用的回调URL是

https://securegw.paytm.in/theia/paytmCallback?ORDER_ID=payTmOrderId

请确保您在生成 txn 令牌时在发起交易 API 中发送回调 url。

我已经尝试了很多来为此找到合适的解决方案,但没有得到任何解决方案。但是我找到了解决方法。

首先我遍历了 paytm viewcontroller 的子视图以获取 WKWebview 并添加了一个观察者以了解 webview 中的 url 变化。

func openPaymentWebVC(_ controller: UIViewController?) {
        if let vc = controller {
            paytmPaymentController = vc
            DispatchQueue.main.async {[weak self] in
                self?.present(vc, animated: true, completion: {
                    print(" super view type: \(type(of: vc.view))")
                    vc.view.loopViewHierarchy { (view, stop) in
                        if view is WKWebView {
                            /// use the view
                            print("This view is WKWebview")
                            if let wkview = view as? WKWebView {
                                print("Entered in column")
                                
                                wkview.addObserver(self!, forKeyPath: "URL", options: .new, context: nil)
                            }
                            stop = true
                        }
                    }
                })
            }
        }
    }

只要 paytm webview 中的 url 发生变化,它就会被调用。当我收到回调 url(处理屏幕)时,我关闭了 paytm viewcontroller。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if let key = change?[NSKeyValueChangeKey.newKey] as? NSURL {
            print(type(of: key))
            print("observeValue \(key)") // url value
            if key.absoluteString == "https://merchant.com/callback" {
                paytmPaymentController?.dismiss(animated: true, completion: nil)
            }
        }
    }

下一步是使用 api 从后端使用 this api

验证付款状态