美文网首页
自己的APP内无法H5支付

自己的APP内无法H5支付

作者: 大心脏 | 来源:发表于2020-07-21 11:51 被阅读0次

    参考链接:
    问题:自己的APP里面H5支付无法唤起微信以及回调如何处理
    流程:app -> 微信客户端->支付结果->app
    准备:获取微信的下单链接mweb_url,如:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx0000&package=00000一样的格式

    //实现wkwwebview的代理WKNavigationDelegate
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) ->
            Void) {
            guard let fullPath = navigationAction.request.url?.absoluteString.removingPercentEncoding else {
                decisionHandler(.allow)
                return
            }
    // 需要在URL Types中添加xx.自己的的域名.com,方便从微信返回到自己的应用
    // 自己的域名是微信商户平台设置的H5域名
            let schemeCallback = "xx.自己的的域名.com://wxpaycallback/“    
            if fullPath.contains("wx.tenpay.com"),
                fullPath.hasSuffix(schemeCallback) == false,
                let loc = fullPath.range(of: "&redirect_url=") {
                let redirect = String.init(fullPath.suffix(from: loc.upperBound))
     // 替换以前的支付完成的回调地址,让微信直接返回到自己的APP
                let urlStr = fullPath.replacingOccurrences(of: redirect, with: schemeCallback)   
                if let url = URL.init(string: urlStr) {
    // 保存以前的回调地址,当appdelelgate响应的时候,再通知网页加载这个地址,让用户主动触发订单校验请求
                    redirectURL = redirect
    // 加载修改后的链接,网页会重定向以weixin://开头的路径,为下一步做准备
                    var req = URLRequest.init(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
                    req.allHTTPHeaderFields = navigationAction.request.allHTTPHeaderFields
    // 用于微信校验链接后面的redirect_url的值,实际中此步骤忘记加了,但是也能正常使用,
    //                req.setValue(schemeCallback, forHTTPHeaderField: "Referer")
                    webView.load(req)
                }
                decisionHandler(.cancel)
                return
            }
    // 对weixin://开头的链接打开微信
            if fullPath.hasPrefix("weixin://") {
                decisionHandler(.allow)
                if let URL = navigationAction.request.url {
                    UIApplication.shared.open(URL, options: [:], completionHandler: nil)
                }
                return
            }
            decisionHandler(.allow)
        }
    

    相关文章

      网友评论

          本文标题:自己的APP内无法H5支付

          本文链接:https://www.haomeiwen.com/subject/bshikktx.html