从iframe重定向回Ionic

时间:2016-06-02 04:03:53

标签: cordova iframe ionic-framework

我正在使用离子创建一个商店网站,该网站实用了以标准方式工作的外部支付提供商(以 iframe 运行并将您重定向回原始页面,一旦付款成功)。

当Ionic在本地运行网站时,您无法重定向回URL,因为每个网址都不同。

我想我不是第一个遇到这个问题的人。

如何从我的应用内的iframe内的付款服务提供商重定向回我的某个离子状态?

4 个答案:

答案 0 :(得分:0)

您可以使用此插件为您的应用制作自定义网址方案:https://github.com/EddyVerbruggen/Custom-URL-scheme

祝你好运!

答案 1 :(得分:0)

所以你真的不应该在一个cordova应用程序中使用iframe。他们提供非常糟糕的用户体验。更好的选择是使用应用内浏览器

答案 2 :(得分:0)

就我而言,我在主视图中添加侦听器,等待来自iframe的消息:

window.addEventListener('message', this.receiveMessage, false);

在iframe中,我向父窗口发送消息

parent.postMessage("stateToGo", "*");

然后,调用父窗口的回调方法:

 receiveMessage = (state) => {
   this.$state.go(state);
 }

答案 3 :(得分:0)

我使用inAppBrowser在我的一个应用程序中实现了类似的功能。您可以通过以下方式实现此目的:

  1. 实施一个网络应用程序(不是移动网络,只是普通网络使用PHP或其他......),它将负责您的付款处理。
  2. 在您的应用程序的初始页面上,放置一个将使用JavaScript提交到支付网关的表单。您可以使用GET URL参数或使用" executeScript"填写此表单中的值。 inAppBrowser的方法。
  3. 付款处理完成后,支付网关会调用重定向网址并向其发送一些数据,这将再次成为您的网络应用程序的网址。只需将数据作为JSON字符串回显(因为在应用程序中处理起来会更容易)。
  4. 将inAppBrowser完全重定向到您的付款重定向网址后,使用脚本" document.body.innerHTML"来读取inAppBrowser中的JSON字符串。
  5. 以下代码段可以帮助您了解该方法:

        var ref = $window.open(order.payment_url, '_blank', 'location=no,hardwareback=no'),
     processed = false;
    
                ref.addEventListener('loadstop', function (event) {
    
                    if (event.url === payment_result_url) {
                        ref.executeScript({
                            code: "document.body.innerHTML"
                        }, function (result) {
                            try {
                                var response = JSON.parse(result[0].replace(/\\/g, ""));
                                // Process payment result here
                            } catch (ex) {
                                // JSON parsing error
                            }
                            processed = true;
                            ref.close();
                        });
                    }
                });
    
                ref.addEventListener('loaderror', function () {
                    processed = true;
                    ref.close();
                    // Network error
                });
                ref.addEventListener('exit', function () {
                    if (!processed) {
                        // Payment cancelled
                    }
                });