支付场景
H5发起微信支付->支付成功、支付取消->返回app
主要核心的思路
iOS返回的自己的App主要利用的是URL Schemes,不说了上干货
核心代码
app中是利用WKWebView为例:
// 本界面的全局变量
// 这里要和你自己的URL Schemes统一
var wxpaySchemesss = "ios.aa.com://"
var needChangeStr = ""
/// WKWebVewdelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
let actionPoilicy = WKNavigationResponsePolicy.allow
decisionHandler(actionPoilicy)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let wxpayScheme = "ios.aa.com://"
let curUrl = navigationAction.request.url!;
if curUrl.absoluteString.hasPrefix(wxpayScheme) {
let urlarr = curUrl.absoluteString.components(separatedBy: wxpayScheme)
let urlOrdersuccess = "https://" + urlarr[1]
let req = URLRequest(url: URL(string: urlOrdersuccess)!)
decisionHandler(WKNavigationActionPolicy.cancel)
webView.load(req)
return
}
// 去除原有的URL回调地址,换成自己的配置
if curUrl.absoluteString.hasPrefix("https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb") {
if var comps = URLComponents(string: curUrl.absoluteString) {
var needChange = false
for (idx, item) in (comps.queryItems ?? []).enumerated() {
if item.name == "redirect_url" && item.value != wxpaySchemesss {
needChangeStr = item.value!.components(separatedBy: "https://")[1]
needChange = true
comps.queryItems?.remove(at: idx)
break
}
}
if needChange {
comps.queryItems?.append(URLQueryItem(name: "redirect_url", value: wxpayScheme + needChangeStr))
wxpaySchemesss += needChangeStr
if let finalUrl = comps.url {
// 给请求头加上Referer字段
let mRequest = NSMutableURLRequest(url: finalUrl)
mRequest.setValue(wxpayScheme, forHTTPHeaderField: "Referer")
decisionHandler(WKNavigationActionPolicy.cancel)
webView.load(mRequest as URLRequest)
return
}
}
}
}
let dds = navigationAction.request
let url = navigationAction.request.url
let scheme = url?.scheme
if scheme == "iosamap" {
jumpAliPay(url: url!)
}else if scheme == "weixin"{
jumpAliPay(url: url!)
}
let actionPoilicy = WKNavigationActionPolicy.allow
if navigationAction.navigationType == WKNavigationType.backForward{
//self.navigationItem.leftBarButtonItems = [self.backBtn,self.closeBtn]
}
decisionHandler(actionPoilicy)
}