使用单页应用程序(Angular)在上下文结账中使用 PayPal

Posted

技术标签:

【中文标题】使用单页应用程序(Angular)在上下文结账中使用 PayPal【英文标题】:PayPal in context checkout with single page app (Angular) 【发布时间】:2016-11-03 06:59:00 【问题描述】:

我正在尝试在单页应用程序中使用 PayPal 的上下文结帐,但在第二次访问带有 PayPal 按钮的页面时遇到问题。

我刚刚从这里http://plnkr.co/edit/2GGEyNEFUPCZ7jIIGk9X?p=preview 提取了 PayPal 的示例代码并将其放到我的应用程序的一个页面上:

<div>
  <div class="container">
    <div class="row product">
      <div class="col-md-4">
        <h3>Toy Story Jessie T-Shirt</h3>
          <p>
            <a href="http://166.78.8.98/cgi-bin/aries.cgi?live=1&returnurl=http://166.78.8.98/cgi-bin/return.htm&cancelurl=http://166.78.8.98/cgi-bin/cancel.htm" id="t1">
            </a>
          </p>
      </div>
    </div>
    <div class="row product">
      <div class="col-md-4">
        <h3>Toy Story Jessie T-Shirt</h3>
          <p>
            <form id="t2" class="ajaxasync" method="POST" action="http://166.78.8.98/cgi-bin/aries.cgi?live=1&returnurl=http://166.78.8.98/cgi-bin/return.htm&cancelurl=http://166.78.8.98/cgi-bin/cancel.htm">
            </form>
          </p>
      </div>
    </div>
  </div>
  <script>
    window.paypalCheckoutReady = function() 
        paypal.checkout.setup("6XF3MPZBZV6HU", 
            environment: 'sandbox',
            click: function(event) 
                event.preventDefault();

                paypal.checkout.initXO();
                $.support.cors = true;
                $.ajax(
                    url: "http://166.78.8.98/cgi-bin/aries.cgi?sandbox=1&direct=1&returnurl=http://166.78.8.98/cgi-bin/return.htm&cancelurl=http://166.78.8.98/cgi-bin/cancel.htm",
                    type: "GET",
                    data: '&ajax=1&onlytoken=1',
                    async: true,
                    crossDomain: true,

                    //Load the minibrowser with the redirection url in the success handler
                    success: function (token) 
                        var url = paypal.checkout.urlPrefix +token;
                        //Loading Mini browser with redirect url, true for async AJAX calls
                        paypal.checkout.startFlow(url);
                    ,
                    error: function (responseData, textStatus, errorThrown) 
                        alert("Error in ajax post"+responseData.statusText);
                        //Gracefully Close the minibrowser in case of AJAX errors
                        paypal.checkout.closeFlow();
                    
                );
            ,
            buttons: [
               container: 't1' ,  container: 't2' ]
        );
    
  </script>

  <script async src="//www.paypalobjects.com/api/checkout.js"></script>
</div>

这在我第一次访问该页面时效果很好。但是,在随后的访问中(中间没有硬重新加载),我得到了

Uncaught Error: Attempting to load postRobot twice on the same window

这是因为它试图加载checkout.js 脚本两次。因此,如果我设置一个条件,即在随后的网页浏览中不运行 checkout.js 脚本,而是直接跳转到 paypal.checkout.setup,我会得到

Error: You are calling paypal.checkout.setup() more than once. This function can only be called once per page load. Any further calls will be ignored.

并且永远不会生成按钮。

单击按钮时,我需要保持上下文体验(弹出的窗口)。我已经搜索了所有 PayPal 的文档,并在控制台中彻底检查了该对象,但希望我遗漏了一些东西。

如果我已经在之前的页面上加载了checkout.js 并调用了paypal.checkout.setup(),如何在新页面上“重新加载”按钮?

【问题讨论】:

【参考方案1】:

我最终写了一个指令来解决我自己的问题,因为 PayPal 似乎没有任何类型的单页功能。

paypal-checkout directive

该指令运行一次 PayPal 实例化代码,然后后续指令放置将仅在未来页面/状态加载时显示已启动的按钮。

【讨论】:

以上是关于使用单页应用程序(Angular)在上下文结账中使用 PayPal的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wildfly 上使用 Angular 7 单页应用程序避免 404 错误

angular.jsUI-Router之angular路由学习

如果更改单页应用程序以使 2 条路由在拆分视图中都可见,是不是可以使用 Angular 路由?

Angular单页应用&AngularJS内部实现原理

如何在Angular2中使禁用的反应形式可编辑

使用 Angular 的单页应用程序引擎时依赖 socket.io/express.io 中的“断开连接”事件