解决浏览器拦截弹出窗口问题

问题描述:

  当使用新窗口弹出页面时,浏览器有时会默认拦截弹出,并不友好。

  比如使用第三方支付宝api做支付的时候如果浏览器拦截支付弹窗,可能会导致用户不去付款。

解决方案:

  方案一:浏览器拦截的机制就是认为是非用户触发的,所以会去拦截,那么我们的思路就是让他变成用户触发的,去避免浏览器进行拦截。

  1、在组件加载时就去请求支付宝三方接口拿到返回的form表单数据

复制代码
mounted(){
    let _params = {
      orderId:this.order.orderId,
      amount:this.order.totalPrice,
      serviceName:this.pkl.serviceChn[this.order.serviceId]
    }
    paymentAlipayApi(_params).then(res => {
      if(res.status === 200){
        this.alipayData = res.data
      }
    })
}
复制代码

  2、然后当点击立即支付的时候,就触发form的submit方法,规避浏览器拦截机制。

复制代码
//确认付款
submitPay(){
  if(this.paymentMethod === 0){//微信付款
    this.wxData = {
      orderId:this.order.orderId,
      amount:this.order.totalPrice,
      serviceName:this.pkl.serviceChn[this.order.serviceId]
    }
    this.wxShow = true
  }else if(this.paymentMethod === 1){//支付宝付款
    this.paymentAlipay()
  }
},
//支付宝付款
paymentAlipay(){
  document.querySelector('form[name="punchout_form"]').submit()
},
复制代码

  此种方案的缺点是就算用户选择微信付款,也还是去请求的支付宝的三方接口,似乎并不是最好的解决方式。

  那么看第二种:

  方案二:我们点击的时候先打开一个空白的新窗口,这种浏览器也会认为是用户点击行为而不会拦截。网上很多例子是直接给新窗口的location.href设置为新url,但是在我们这种需要表单form提交的情况下不行。那么我的思路就是获取新窗口,然后给空白的新窗口innerHTML设置为支付宝返回的表单内容,然后在空白新窗口自身打开新页面,这样也可以解决此问题。因为支付宝三方接口返回的form表单默认就是从自身页面打开的,所以该方法可以规避方案一的问题。

复制代码
//支付宝付款
paymentAlipay () {
    let params = {
        orderId: this.orderInfo.orderId,
        amount: this.orderInfo.totalPrice,
        serviceName: '2018嘉年华' + this.ticket.name
    }
    const newWin = window.open();
    paymentAlipayApi(params).then(res => {
        if (res.status === 200) {
            newWin.document.body.innerHTML = res.data
            this.$nextTick(()=>{
                newWin.document.querySelector('form[name="punchout_form"]').submit()
            })
        }
    })
},
复制代码

 

posted @   古兰精  阅读(3121)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2017-09-28 浅析order by中如何处理null以及order by null的作用
2017-09-28 详解java中的数据结构
点击右上角即可分享
微信分享提示