【问题标题】:PayPal Smart Button updated via Ajax通过 Ajax 更新的 PayPal 智能按钮
【发布时间】:2020-09-28 16:29:31
【问题描述】:

我有一个通过 Ajax 更新的购物车(数量、删除产品)。如何更新智能按钮 iframe 中的值?当我刷新页面时,它显然可以工作,但是如何在后台使用 Ajax 来做到这一点?我尝试使用绕过相同来源策略的黑客重新加载 PayPal iframe,但它没有用,智能按钮消失了。 这就是我所说的 hack:

const iframe = document.querySelector("iframe");
iframe.src = iframe.src

这是我的智能按钮代码:

<script>   
  paypal.Buttons({
    style: {
      shape: "rect",
      color: "gold",
      layout: "horizontal",
      label: "checkout",
      size: "responsive",
      tagline: "false"
  },
    createOrder: function(data, actions) {
      return actions.order.create({
        purchase_units: [{
          amount: {
            currency_code: "GBP",
            value: <?php echo number_format($total, 2); ?>
          },
        }]
      });
    },
    onApprove: function(data, actions) {
      return actions.order.capture().then(function(details) {
        alert("Dear " + details.payer.name.given_name + ", Thank you for your payment!");
      });
    },
    onShippingChange: function(data, actions) {
      if (data.shipping_address.country_code !== "GB") {
        return actions.reject();
      }
      return actions.resolve();
    }
  }).render("#paypal-button-container");
}
</script>

【问题讨论】:

  • 发布更多关于您的实际 PayPal 按钮代码及其 createOrder 函数的信息,以便我们给出最佳答案

标签: javascript iframe paypal


【解决方案1】:

改变这一行:

value: <?php echo number_format($total, 2); ?>

要调用 JavaScript 函数,您需要编写该函数并将其用作页面的一部分

value: getCartTotal()

在某个地方,也许在&lt;script&gt; 的顶部,你会看到类似的东西:

window.myCartTotal = '<?php echo number_format($total, 2); ?>';
function getCartTotal() {
  return window.myCartTotal;
}

然后让你的 AJAX 也更新 window.myCartTotal

有很多更优雅的编码方式,但这应该会让你继续前进。


正确的服务器端解决方案

为了获得最佳结果,您不应在客户端的 createOrder 上设置金额,甚至更重要的是不要在客户端进行捕获。在客户端做这些事情会给你带来一系列的问题和问题。相反,让客户端在您的服务器上调用两条路由,一条用于“创建事务”,另一个用于“设置事务”,此处记录:https://developer.paypal.com/docs/checkout/reference/server-integration/

然后,在按钮批准代码的 ajax/fetch 调用之后使用这两个新路由:https://developer.paypal.com/demo/checkout/#/pattern/server

【讨论】:

  • 非常感谢。这看起来不错。我只是不确定如何使用 Ajax 更新 window.myCartTotal。例如,当我使用 Ajax 从购物篮中删除产品时,我将 total price 的“旧”html 替换为来自服务器的新响应,例如:$(".total-amount").html($(".total-amount", res).html()); 我不确定这是否应该使用 window.myCartTotal。顺便说一句,在上面的代码中&lt;?php echo number_format($total, 2); ?&gt;变成了一个全局变量,不是吗?
  • 您仍然希望按原样更新页面的 HTML。如果 res 是数字,window.myCartTotal = res;,或者根据需要获取/提取数字
  • 还更新了答案,提供了有关正确的服务器端集成的信息,因此您知道应该如何做
  • 终于明白了。我的window.myCartTotal 的 AJAX 更新:window.myCartTotal = Math.round(parseInt($(".total-amount", res).html().replace("£", ""))); 我得到了更新的值,但格式错误(带有小数和英镑符号)。出于某种原因,智能按钮中的value 会在 PHP 代码存在时接受十进制数字,但在通过调用 getCartTotal() 插入数字时不接受。
  • 我认为使用 PHP 代码获取智能按钮中的值就足够了,因为它是从服务器获取的,而不是从客户端获取的。
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2020-06-28
  • 2022-01-04
  • 2021-04-16
  • 2020-10-10
  • 2020-06-20
  • 2020-09-19
  • 2020-06-23
相关资源
最近更新 更多