• 问题分析

    正常的H5支付流程如下

    按照上面的支付流程会出现 App -> 微信 -> 支付 -> 点击 完成 -> safari访问redirect_url设置的URL,这种流程其实用户体验是有点糟糕的,我们期望是 App -> 微信 -> 支付 -> 点击 完成 -> App访问redirect_url设置的URL

    问题分析到上面已经非常明了了,无非就是拦截处理,下面讲讲具体的实施。

  • 问题分析

    根据上面的分析解决的思路应该非常的清晰

    拦截请求

    首先在decidePolicyFor 回调里拦截支付的请求拦截的字符串:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb 如果包含了该链接做如下处理,isload变量是控制是否是第一次没有修改redirect_url参数的请求防止重复请求

      if urlString?.range(of: "https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb") != nil && !self.isload{
    if let mUrlStr = urlString{
    let array : Array = mUrlStr.components(separatedBy: "redirect_url=")
    self.redirect_url = array[1]
    let rs = "\(WXH5SchemeURL)://".urlEncoded()
    let mNewUrl = array[0] + "redirect_url=\(rs)"
    let newURLS = URL(string: mNewUrl)
    var mRequest = URLRequest.init(url: newURLS!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)
    mRequest.setValue("\(WXH5SchemeURL)://", forHTTPHeaderField: "Referer")
    webView.load(mRequest)
    self.isload = true
    decisionHandler(.cancel)
    return
    }
    }
    self.isload = false
    decisionHandler(.allow)
    }
    复制代码

    拦截weixin://wap/pay? 打开微信

      if urlString?.range(of: "weixin://wap/pay?") != nil{
    if let mUrlStr = urlString{
    let openWX = URL(string: mUrlStr)
    if (UIApplication.shared.canOpenURL(openWX!)){
    if #available(iOS 10.0, *){
    UIApplication.shared.open(openWX!, options: [UIApplicationOpenSettingsURLString:false], completionHandler: nil)
    }else{
    UIApplication.shared.openURL(openWX!)
    }
    }
    decisionHandler(.cancel)
    return
    }
    }
    复制代码

    这一步的话没甚好介绍的就是拦截打开微信支付即可。

    在项目设置Scheme链接用于支付完后返回App

    具体操作如下图

    到这一步已经成功了一大半了,你会发现现在支付成功后能返回App了但是返回的时候webView是白屏。白屏其实就是网页没有任何请求导致的,接下来我们就要使用上步提前记录好后台给的redirect_url的url了。

    在AppDelegate里监听url.scheme的值

    在AppDelegate里监听url.scheme的值是否为我们之前设置好的xxxx.com 如果是xxxx.com 发起通知 通知webview加载提前记录好的redirect_url的url了

      if ([url.scheme rangeOfString:@"quanzidian.net"].length!=0) {
    [NSNotificationCenter defaultCenter] postNotificationName:@"WX_H5_PAY" object:nil];
    return YES;
    }
    复制代码

    在wkWebView接收通知

      NotificationCenter.default.addObserver(self, selector: #selector(goBackWhitWXPay), name: NSNotification.Name(rawValue: "WX_H5_PAY"), object: nil)
    复制代码

    重新刷新WKWebview

      @objc func goBackWhitWXPay(){
    if !self.redirect_url.isEmpty{
    self.request = URLRequest(url: URL(string: self.redirect_url)!)
    redirect_url = ""
    }
    }
    复制代码

    项目使用的oc/Swift 混编有些地方和你使用的语言不一致时请自行模仿做写。

    到这里微信H5支付所有的问题就完美解决了 唯一的坑就是在截取请求时,重写redirect_url时注意一定时授权的URL://的协议。

    更多详情请访问https://siterzzz.github.io

 
 
 
 
作者:Siter
链接:https://juejin.im/post/5b45af6ae51d45198e7217fd

解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转)的更多相关文章

  1. 黄聪:微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

    一.首先先确定H5支付权限已经申请! 二.开发流程 1.用户在商户侧完成下单,使用微信支付进行支付 2.由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB ...

  2. 微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

    服务项目 新手技术咨询 企业技术咨询 定制开发 服务说明 QQ有问必答 QQ.微信.电话 微信开发.php开发,网站开发,系统定制,小程序开发 价格说明 200元/月 1000/月 商议       ...

  3. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  4. “商家参数格式有误”应用切微信H5支付完美解决方案

    一.业务场景发生 最近在跟一些合作公司作业务对接,在对方的APP中接入我们的H5支付,包括微信和支付宝. 那就开搞,进展顺利,貌似一切都在掌握之中,给到对方一个链接即可调起支付.形如: https:/ ...

  5. C#版微信公众号支付|微信H5支付|微信扫码支付问题汇总及解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存.代码在文章结尾处,有需要的 ...

  6. 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付

    在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...

  7. 小程序webview跳转页面后没有返回按钮完美解决方案

    随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...

  8. 微信h5支付出现“商家参数格式有误,请联系商家解决”

    在浏览器进行微信h5支付时出现:

  9. 微信H5支付 遇到坑的一些解决方法

    解决办法 1. 商家参数格式有误,请联系商家解决 a.对于前后端分离的开发模式 前端发起请求 服务端请求微信h5支付统一下单接口 返回参数mweb_url 给前端 然后前端调起微信h5支付 b.注意的 ...

随机推荐

  1. 人脸识别(基于ArcFace)

    我们先来看看效果 上面是根据图片检测出其中的人脸.每个人脸的年龄还有性别,非常强大 第一步: 登录https://ai.arcsoft.com.cn/,注册开发者账号,身份认证,注册应用,得到APPI ...

  2. 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题

    SQL SERVER的联机丛书的解释:“当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔.当 SET QUOTED_IDENTIFIER 为 ...

  3. 超级简单,把PuppyLinux安装到U盘

    先说说使用感受:上网全是乱码!不支持中文 下载最新版puppylinux,从官网下载 现在U盘引导程序制作工具Unetbootin 打开下载的UNetbootin,进行下面的操作: 制作完毕后,修改U ...

  4. vue-loader会缓存node_modules中依赖模块

    问题如下: https://github.com/vuejs/vue-cli/issues/3635 截止到vue cli3还没有解决 手动删除node_modules下的.cache文件夹可以解决这 ...

  5. spring boot连接mysql8.0

    今天spring boot的项目数据库从mysql5.7换到mysql8.0,遇到点问题,特此记录下来 查看mysql的版本 mysql> select version();+--------- ...

  6. Node.js实现PC端类微信聊天软件(三)

    Github StackChat Redux学习回顾 Redux的主要功能就是管理复杂交错的State,比如需要讲state提升到顶层组件的场景中,使用Redux就很合适 Redux主要提供三个东西来 ...

  7. Mysql 索引基础

    [1]什么是索引?为什么要建立索引? 索引,其实就是目录. 索引,用于快速找出在某个列中有某个特定值的行. 不使用索引,MySQL必须从第一条记录开始查找整张表,直到找出相关的行,那么表越大,查询数据 ...

  8. JVM Server与Client运行模式

    JVM Server模式与client模式启动,最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是: 当虚拟机运行在-client模式的时候,使用的 ...

  9. C++自主测试题目

    下面是题目 后面有代码 1.键盘输入3个整数a,b,c值,求一元二次方程a*X∧2+b*X+c=0(a≠0)的根,结果保留两位小树. 2.编写一个口令输入程序,让用户不停输入口令,直到输对为止,假设口 ...

  10. day17——序列化、os、sys、hashlib、collections

    day17 序列化 json 两组4个方法: 1.dumps(序列化) -- loads(反序列) dumps(list):将对象转换成字符串 loads(str):将字符串转换成对象 list--s ...