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
验证付款状态
我正在尝试使用他们提供的一体化 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
验证付款状态