【问题标题】:Manually handle stripe checkout window with javascript使用 javascript 手动处理条带结帐窗口
【发布时间】:2017-10-25 15:53:15
【问题描述】:

我正在使用条带作为信用卡信息。但我实施了自己的运输信息表。我希望在添加信用卡信息之前使运输信息表无效。我的问题是我不知道如何防止条纹窗口打开。 条纹按钮实现为

<div class="shipping_validation">
     <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" id='stripe-button'
         data-key="{{ key }}" 
         data-zip-code="true" 
         data-billing-address="true" 
         data-shipping-address="false" 
         data-description="benty-shop" 
         data-image="/static/favicon/apple-icon-120x120.png"
         data-amount="{{ orders | sum(attribute='cost')*100 }}" 
         data-locale="auto"
         disabled>
     </script>
 </div>

我将按钮嵌入到一个 div 元素中,并使用该元素的类来触发发货表单的表单验证

$(".shipping_validation").click(function(event) {
    $("#checkout_form").formValidation('validate');
    if(!$('#checkout_form').data('formValidation').isValid()){
       event.preventDefault();
       // do something to prevent the stripe window to open
    }
})

我希望 event.preventDefault();会做的伎俩,但条纹窗口仍然打开。知道如何防止条纹窗口打开吗?

【问题讨论】:

  • 你能提供小提琴吗?

标签: javascript jquery stripe-payments


【解决方案1】:

对于您的情况,您必须为 Stripe 结帐的自定义行为实施自定义集成。详情here

您必须创建一个handler 来控制open()close() 事件。

下面的例子就像你使用自定义集成的情况

<script src="https://checkout.stripe.com/checkout.js"></script>

<button id="customButton">Purchase</button>

<script>
var handler = StripeCheckout.configure({
  key: 'pk_test_key....',
  image: 'https://stripe.com/img/documentation/checkout/marketplace.png',
  locale: 'auto',
  token: function(token) {
    // You can access the token ID with `token.id`.
    // Get the token ID to your server-side code for use.
  }
});

document.getElementById('customButton').addEventListener('click', function(e) {
    $("#checkout_form").formValidation('validate');
    if($('#checkout_form').data('formValidation').isValid()){ //if your form is valid
        popup(); //open the Stripe checkout
    }
});

function popup(){
    // Open Checkout with further options:
      handler.open({
        name: 'you will put the name',
        description: 'your description',
        zipCode: true,
        currency: 'usd',
        amount: 0000
      });
      e.preventDefault();
}

// Close Checkout on page navigation:
window.addEventListener('popstate', function() {
  handler.close();
});
</script>

【讨论】:

    【解决方案2】:

    问题是 Stripe 的窗口打开不是默认操作。默认操作是按下空格键时浏览器向下滚动之类的操作。在这种情况下,div 没有默认的 click 操作,因此 preventDefault() 无法帮助您,因为它无关。

    改为使用stopPropagation() 来防止其他脚本(即 checkout.js)接收到点击事件,从而能够对其采取行动。

    if(!$('#checkout_form').data('formValidation').isValid()){
       event.stopPropagation();
       // do something to prevent the stripe window to open
    }
    

    另一种方法是使用 Checkout 的 Custom mode,它提供了一个 open() 方法,您可以调用该方法来按需触发弹出窗口。只需确保仍然在 click 处理程序中调用它,因为浏览器喜欢阻止不是由用户直接启动的弹出窗口。

    【讨论】:

    • 感谢 Seth,但 stopPropagation() 似乎也不起作用……难道 checkout.js 在我自己的 js 代码之前收到了事件?
    • 是的,这可能会发生。如果 checkout.js 是在注册事件侦听器的脚本之前导入的,该事件侦听器的处理程序执行 stopPropagation()(),那么您的处理程序可能运行得太晚而无法生效,因为处理程序是按注册顺序执行的。所以你需要确保尽快在页面中注册你的事件监听器。
    • 我已经添加了第二个解决方案,以防挑剔的事件排序对您有问题。
    猜你喜欢
    • 2017-12-28
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多