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 在浏览器中打开链接并返回到应用程序 的相关文章

随机推荐

  • 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并显示成