React-native 在浏览器中打开链接并返回到应用程序

2024-03-21

我正在开发一个反应原生应用程序,它应该与支付网关进行通信,在完成支付过程(成功或失败)后,我需要向用户显示警报。为此,我打开了一个链接WebView之后我得到了 return 的 urlonNavigationStateChange并显示成功或失败消息。

但是,这个流程对于security问题必须在默认设备浏览器.

当前代码:

const BASEURL = 'https://gatewayURL/?ID=';
let Token = null;
let paymentAccepted = null;
let paymentFactorId = null;

class Gateway extends PureComponent {
  static propTypes = {
    dispatch: PropTypes.func,
    navigation: PropTypes.any,
  }

  componentWillMount() {
    this.props.dispatch(getPaymentStatus());
  }


  _onLoad(webViewState) {
    let url = webViewState.url.toString();
    let isResponseValid = url.includes('backFromGateway');
    if(isResponseValid){
      if(this.props.checkedPaymentStatus != 'checked' ){
        setTimeout(() => {
          this.props.dispatch(setPaymentStatus('checked'));

          let splitedURL = url.split("/");
          paymentFactorId = splitedURL[splitedURL.length -2];
          if(splitedURL[splitedURL.length - 1] === '0'){
            paymentAccepted = true;
            this.props.dispatch(setGatewayResponse('done', paymentFactorId));
          }
          else {
            paymentAccepted = false;
            this.props.dispatch(setGatewayResponse('rejected', paymentFactorId));
          }


          this.props.navigation.navigate('BackFromGateway', { title: '' })
        }, 1000);
      }
    }
  }


  render() {
    const { addNewOrderGatewayToken, checkedPaymentStatus } = this.props;
    token = addNewOrderGatewayToken;
    let view = null;
    if(checkedPaymentStatus !== 'checked'){
      view =  <WebView onNavigationStateChange={this._onLoad.bind(this)} style={styles.container} source={{ uri: `${BASEURL}${token}`  }}/>
    }
    else{
      view = <View></View>
    }

    return (
      <View style={styles.container}>
        {view}
      </View>      
    );
  }
}

任何想法?
Thanks


如果您可以从网关网站进行回调,那么我建议使用深度链接来处理应用程序和浏览器之间的流量。基本上,您的应用程序将打开网关网站进行支付,并且根据支付结果,网站将使用其深层链接对应用程序进行回调。然后应用程序将侦听该链接,取出必要的信息并继续继续。

你需要做的是:

在您的应用程序中设置深层链接。您应该遵循官方网站的指南(here https://facebook.github.io/react-native/docs/linking.html) 来启用它。让我们在此处选择一个随机 URL 进行链接,例如gatewaylistener

设置从网关到您的应用程序的必要回调。在您的情况下,由于您需要处理支付成功和支付失败,因此您可以添加 2 个回调,例如gatewaylistener://success?id={paymentId} and gatewaylistener://error?id={paymentId}

最后,您需要从应用程序监听网络浏览器。一种方法是在打开网关的组件内部添加侦听器。

// setup
componentDidMount() {
  Linking.getInitialURL().then((url) => {
    if (url) {
      this.handleOpenURL(url)
    }
  }).catch(err => {})
  Linking.addEventListener('url', this.handleOpenURL)
}

componentWillUnmount() {
  Linking.removeEventListener('url', this.handleOpenURL)
}

// open your gateway
async openGateWay = () => {
  const { addNewOrderGatewayToken } = this.props
  const url = `${BASEURL}${addNewOrderGatewayToken}`
  const canOpen = await Linking.canOpenURL(url)
  if (canOpen) {
    this.props.dispatch(setPaymentStatus('checked'))
    Linking.openURL(url)
  }
}

// handle gateway callbacks
handleOpenURL = (url) => {
  if (isSucceedPayment(url)) { // your condition
    // handle success payment
  } else {
    // handle failure
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React-native 在浏览器中打开链接并返回到应用程序 的相关文章

  • javascript:全局变量泄漏

    每当我向 Firefox 提交插件时 我都会收到一封电子邮件 告诉我我的一些变量正在泄漏到全局范围内 一旦他们告诉我我解决了问题 但在那之前有什么方法 程序 来检查变量是否泄漏到全局范围内 Thanks Both JSLint http w
  • HTML 和 标签有什么区别?

    HEAD 标签和 BODY 标签有什么区别 大多数 HTML 书籍仅 简短 提及 and 标签 但它们消失得很快 它们会影响浏览器呈现网页的方式吗 另外 它们会影响 javascript 的运行顺序吗 我的意思是 如果我里面有一个javas
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • Visual Studio 改变 Ctrl-K-D 的工作方式

    In Visual Studio I m using 2012 is there any way of editing the way that Ctrl K D combinations handles its Auto Formatti
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • “require(...)”是常见的 JavaScript 模式还是库函数?

    我通常发现这是 node js 脚本 模块以及 phantomJS casperJS 等中的第一行 我很好奇 这是否是服务器端 javascript SSJS 的常见模式 类似于 include在 C C 中或import在 Java 中
  • 如何设置必须输入特定数字的字段?

    我想知道如何创建一个需要输入特定数字或文本的字段 例如 激活码 以及在输入的确认答案的情况下移动到 网页 并且在未确认的情况下移动到 另一页面 的按钮 使用必需的属性
  • Node.js Express 4.0 中的 res.render 回调参数的用途是什么?

    目的是什么res render回调参数 在什么情况下 由于模板已被指定为第一个参数 因此人们会想要使用这样的回调参数 这是文档中的代码 send the rendered view to the client res render inde
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 自调用函数未定义

    如果我声明一个函数文字 var x function alert hi console log x returns the function code However var x function alert hi console log
  • 冒泡可用于图像加载事件吗?

    我可以用吗 window addEventListner 某种程度上来说 我所有的图像都有一个display none 图像加载后 我想设置display inline 这样我就可以规范下载图像时显示的内容 在这种情况下 我无法预加载图像
  • 使 Bootstrap Popover 在悬停而不是单击时出现/消失

    我正在使用 Bootstrap 构建一个网站Popover http twitter github com bootstrap javascript html popovers我不知道如何使弹出窗口出现在悬停而不是单击时 我想做的就是当有人
  • 在这个反应示例中,bind 做了什么?

    什么是bind在这个声明中做this tick bind 这个 在下面的代码中 export class Counter extends React Component constructor props super props this
  • Vue-Router 抽象父路由

    我正在尝试将当前网站迁移到 vuejs 站点地图必须是 login signup password reset browse search dozens of other routes 由于其中一些路线共享大量 fx 因此我将它们设为父路线
  • 将两个数字相加将它们连接起来而不是计算总和

    我将两个数字相加 但没有得到正确的值 例如 做1 2返回 12 而不是 3 我在这段代码中做错了什么 function myFunction var y document getElementById txt1 value var z do
  • 如何使用 javascript 更改文件扩展名

    有谁知道在 Javascript 中更改文件扩展名的简单方法吗 例如 我有一个带有 first docx 的变量 但我需要将其更改为 first html 这将改变字符串包含文件名 let file first docx file file
  • 将 JSON 属性绑定到表单

    我有一个 JSON 对象和一个
  • 如何获取符号名称(文字)?

    以下情况 var myVehicle brand Tesla var isMoving Symbol var currentStatus Symbol myVehicle isMoving true myVehicle currentSta
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err

随机推荐

  • Symfony2 - 将 /web 目录重定向到 root

    我的 Symfony 项目存在重复内容问题 以下网址提供相同的内容 www mywebsite com web page and www mywebsite com page 这是我的内容 htaccess file
  • 如何列出(或导出)数据库中所有触发器的代码?

    我正在将数据库中的当地时间更改为 UTC 时间 有很多触发器将信息复制到当前使用的历史表GETDATE 我想找到每个使用的触发器GETDATE 代替GETUTCDATE 在数据库中 有什么方法可以自动执行此操作 我已将它们列出select
  • 从 Postgis 获取投影限制

    我收到以纬度 经度坐标对形式对 API 进行的空间查询 我的空间数据是不覆盖整个地球的投影 因此某些查询超出范围 我想用有用的错误消息来回复错误的查询 我不想尝试在 GIS 规范或标准中找出每个投影的边界 并从中获取正确的纬度 经度对 而是
  • 将电报机器人与谷歌应用程序脚本连接

    我在电报机器人上设置了一个机器人 并通过以下应用程序脚本将其与谷歌电子表格连接this https www youtube com watch v mKSXd od4Lg教程 这是代码 var token FILL IN YOUR OWN
  • Node JS - 通过引用其他文件传递 Javascript 对象

    我通过如下要求定义了一个http服务器 var http require http function onRequest request response console log Request request console log Re
  • .NET Core 中的 CORS

    我正在尝试以这种方式在 NET Core 中启用 CORS public IConfigurationRoot Configuration get public void ConfigureServices IServiceCollecti
  • Android:来电自动接听,播放音频文件

    在Android中 当有来电时 我想接听它 然后 从我的应用程序中 在通话期间自动播放音频文件 对方应该听到它 这可能吗 你所说的情况在安卓上是不可能实现的 Android 无法访问通话中的音频流 不过我可以给你一些关于如何去做的想法 首先
  • 无需登录即可启动Raspberry Pi [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想问你是否有任何方法可以启动树莓派 使用Raspbian 而无需登录和密码并直接进入GUI 以 Windows 为例 拉斯布比喘息 以下
  • 在 /OPT:ICF 存在的情况下,Visual Studio 2013 是否可以正确优化?

    我希望下面的程序始终返回 0 但是 对于 Visual Studio 2013 更新 4 程序在发布版本中退出 1 我不确定这是否是一个错误 或者编译器的优化器是否正确并且依赖于某些边缘行为 如果关闭 CONST 宏 则释放 exe 将返回
  • 查找mysql中记录占用的空间

    我想找到数据库中记录占用的空间 我有2000条记录 我需要找到mySQL中的empid 4在数据库中占用了多少空间 请让我知道 mySQL 中的查询 显示表状态是您正在寻找的命令 http dev mysql com doc refman
  • 解决继承委托上不兼容的属性类型的语法

    我继承的一些代码有一个恼人的警告 它声明一个协议 然后使用它来指定委托 protocol MyTextFieldDelegate interface MyTextField UITextField property nonatomic as
  • 在非管理员帐户下运行自托管 OWIN Web API

    自托管 OWIN Web API 是否可以在非管理员帐户下运行 我已经尝试了几十个网址预订 但没有任何效果 服务无法启动 并显示 访问被拒绝 当帐户被添加到管理员角色时它会起作用 但我不希望这样 下面的代码在Win 7框架4 5 2上运行
  • python selenium 示例不起作用,说没有名为 Keys 的模块

    我在 Windows 机器上通过 pip 安装了 selenium 只需试用网站上的示例即可 http pypi python org pypi selenium from selenium import webdriver from se
  • 在 Firebase 中增加数据点的最简单方法?

    我在增加 Firebase 中的数据时遇到问题 Firebase clickedCounter 0 这是我的代码 IBAction func plus sender UIButton FIRDatabase database referen
  • Twisted:为什么将延迟回调传递给延迟线程会使线程突然阻塞?

    我尝试使用 txredis redis 的非阻塞扭曲 api 作为持久消息队列 但没有成功 我正在尝试使用我正在开发的 scrapy 项目进行设置 我发现虽然客户端没有阻塞 但它变得比本来应该的要慢得多 因为反应堆循环中本应是一个事件的事件
  • OpenCV:如何使用 HOGDescriptor::Detect 方法?

    I have succeeded in tracking moving objects in a video 然而我想决定一个物体是否是人 我已经尝试过HOGDescriptor在 OpenCV 中 HOGDescriptor 有两种检测人
  • django.db.utils.DataError:除以零

    我在以下代码行中收到错误 context stock margin context top stock annotate Avg purchase ExpressionWrapper F total puchase F quantity p
  • 第一个缩放事件删除中心变换

    我有一个像这样的 径向整齐树 https bl ocks org mbostock 4063550 https bl ocks org mbostock 4063550 我正在尝试添加缩放和平移 但我无法使缩放和平移正常工作 我的代码看起来
  • 在 JTree 上过滤[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Problem 对 a 应用过滤JTree以避免某些节点 叶子出现在渲染版本中JTree 理想情况下 我正在寻找一种允许动态过滤器的解决方案 但
  • React-native 在浏览器中打开链接并返回到应用程序

    我正在开发一个反应原生应用程序 它应该与支付网关进行通信 在完成支付过程 成功或失败 后 我需要向用户显示警报 为此 我打开了一个链接WebView之后我得到了 return 的 urlonNavigationStateChange并显示成