我们使用的是WKWebView,在下面方法做的一系列的操作

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) 

1、全部代码

/// 准备加载func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {let url = webView.url!.absoluteStringprint("====>\(url)")var valueStr = “m.r***n.com://"if NetworkManager.commonUrl.contains("api.") {valueStr = "api.r***n.com://"}// 从微信回来会自动调用加载redirect_urlif url == valueStr {return}var finalStr = ""if url.hasPrefix("https://wx.tenpay.com/") && redirect_url.length == 0 {let absoluteString = webView.url?.absoluteStringif (absoluteString?.contains("https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?"))! {// 保存并替换redirect_urlif let strArray = absoluteString?.components(separatedBy: "&") {for i in 0..<strArray.count {if !strArray[i].contains("redirect_url") {if finalStr == "" {finalStr = "\(strArray[i])"}else {finalStr = "\(finalStr)&\(strArray[i])"}}}}finalStr += "&redirect_url=\(valueStr)"print("finalStr:", finalStr)redirect_url = (absoluteString?.components(separatedBy: "=").last)!.removingPercentEncoding!}// 设置 Referervar request:URLRequest = NSURLRequest.init(url: URL.init(string: finalStr)!) as URLRequestrequest.httpMethod = "Get"request.setValue(valueStr, forHTTPHeaderField: "Referer")webView.load(request)}if url.hasPrefix("weixin://wap/pay") {print("-------需要打开的url:", url)let urlUrl = URL.init(string: url)let canOpen = UIApplication.shared.canOpenURL(urlUrl!)if canOpen {UIApplication.shared.openURL(urlUrl!)}else {showMessage(msg: "未安装相关应用"}// 刷新当前页面let request: URLRequest = NSURLRequest.init(url: URL.init(string: redirect_url)!) as URLRequestwebView.load(request)redirect_url = ""}}

2、H5吊起微信客户端支付

1>m.r***n.com/api.r***n.com为你们公司在微信后台注册的一级域名,因为我们有正式环境和测试环境,所以对于这个值我做了判断。

2>微信支付,中间会调用两个关键的url

URL1: https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx***&package=***&redirect_url=***
URL2: weixin://wap/pay?prepayid%3D***&package=***&noncestr=***&sign=***

把URL1修改为如下:

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx***&package=***&redirect_url=api.r***n.com://

注意:如果你的url中有redirect_url,需要将值替换成 “一级域名:// ”,如果没有需要添加这个参数,因为微信支付成功会默认调用redirect_url,如果这个值是http...的回调地址,就会打开Safari。

3>拦截到"weixin://wap/pay"",则手动吊起微信APP,判断是否可以吊起,如果掉不起,则提示未安装该应用;

4>需要在改方法前面添加一步判断,如果当前的url是“一级域名:// ”,则直接返回就可以了,因为在吊起微信的时候,我们手动加载了完成页面。

// 从微信回来会自动调用加载redirect_url
if url == valueStr {return
}

5>我们手动加载的完成页面如下图,点击返回,跳转我的订单页面。

3、支付成功/失败,返回Safari的问题解决

1>在request中添加 Referer 参数

// 设置 Referer
var request:URLRequest = NSURLRequest.init(url: URL.init(string: finalStr)!) as URLRequest
request.httpMethod = "Get"
request.setValue(valueStr, forHTTPHeaderField: "Referer")
webView.load(request)

2>替换 redirect_url 的值为 “一级域名:// ”

我们的URL1中有回调地址,我把这个回调地址进行了保存,吊起微信的时候,手动在当前页面加载回调地址,从微信支付成功或者失败都显示回调地址地址页面,如果不进行保存,当前页面也会自动加载回调地址,不过当前的回调地址已被修改为“一级域名:// ”,再次返回到当前页面时,会出现空白页面的情况。这时把回调地址也置空。

// 刷新当前页面let request: URLRequest = NSURLRequest.init(url: URL.init(string: redirect_url)!) as URLRequestwebView.load(request)redirect_url = ""

3>在 URL Types 中添加一级域名,微信回调APP的时候使用

XZ_iOS 之WKWebView H5吊起微信客户端支付并返回APP相关推荐

  1. uniapp中唤醒支付宝,微信进行支付并返回app

    支付分为前端发起支付,和后端发起支付两种方式 1.在前端发起支付,uniapp给我们提供好了,可以使用的api接口. uni.requestPayment({provider: 'alipay',or ...

  2. H5脱离微信通过调起微信客户端支付

    H5脱离微信通过调起微信客户端支付 https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1 目前已上线支付案例,商户可进行实际体验: ◆ ...

  3. iOS H5原生WKWebView调起支付宝客户端支付方案

    iOS H5原生WKWebView调起支付宝客户端支付方案 问题描述: 安卓直接WebView加载上面的URL直接可完成跳转支付宝弹出支付界面: iOS WKWebView加载这个URL,只是单纯加载 ...

  4. ios支付宝支付失败不回调_iOS支付宝H5支付无法返回APP解决方案

    本文只讨论你已经成功实现客户端->支付宝支付流程,仅仅是支付完成后无法返回自己的APP的问题. 如果你的支付流程是客户端->Safari->支付宝不在本文讨论范围之类. iOS支付宝 ...

  5. iOS H5 调用微信、支付宝支付无法返回app 解决方案

    最新项目中遇到H5页面中调用微信.支付宝客户端支付的需求,虽然这并不是推荐的做法,但是需求确实存在...加载h5页面点击支付调起需要支付的客户端(微信或者支付宝). 微信支付解决方案: 1.首先要设置 ...

  6. php h5支付没有返回app中,很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法...

    在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包 ...

  7. 微信境外支付php_PHP实现 APP端微信支付功能

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  8. h5支付不能打开支付宝 ios_iOS WKWebview中无法调起支付宝/微信客户端支付问题的解决方法...

    这两个的解决思路都是要在下面这个方法中先拦截相应的url,再单独处理 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAct ...

  9. h5 微信支付 php,用h5做出微信的支付过程的实现步骤

    这次给大家实现的案例是用户在微信里打开网页的时候,也可以调用微信支付来完成下单功能.当然,微信官网的,开发文档也有很详细的介绍,但是今天我们来教大家怎样手动做出支付接口的开发. 以提交问题流程为例描述 ...

最新文章

  1. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法
  2. 在WIN7系统的笔记本上建立WIFI热点
  3. 从C语言到C++的进阶之一些C基础上的增强用法(篇五)
  4. datagridview列 值提取_Pandas中的缺失值处理
  5. 小学计算机课教学工作总结,小学六年级信息技术教学工作总结
  6. python--图像轮廓findContours
  7. 材料之kube-dns.yaml
  8. apktool+dex2jar+xjad反编译android程序
  9. container-coding-codec
  10. dnf虚拟机安装的解决方法
  11. 《Nature》论文插图复刻第3期—面积图(Part2-100)
  12. python爬取阳光问政
  13. 这就是我不建议去外包公司开发的原因?
  14. 计算机组装拆卸 心得,学习组装电脑的心得体会怎么写?
  15. jwplayer +ffmpeg+red5 实现摄像头的直播
  16. 亚马逊秒杀活动怎么报名?站斧浏览器亚马逊站内促销
  17. 【Linux 驱动】第七章 时间 延迟及延缓操作
  18. Verilog HDL可综合描述(高质量Verilog书写)
  19. 计算机专业本科上线分数,计算机专业对口大学分数线本科
  20. 自然语言处理(NLP) vs 自然语言理解(NLU)

热门文章

  1. Hyperledger Fabric 1.4.6 多机器集群部署
  2. i7-10710U和i7-8665U 哪个好
  3. linux使用wget镜像一个网站
  4. 仿个人税务 app html5_注意,你下载的可能是个假的个税App
  5. 智能车电磁传感器检测原理
  6. [推荐]GOOGLE搜索从入门到精通v3.0
  7. 解决echarts5中国地图只显示南海问题,及china.js china.json下载
  8. Sketch 浅谈(一)
  9. HP Probook 4321s 网卡无法识别问题的解决
  10. 如何快速查找网线-寻线仪