Rails 4应用程序的一页上的多个条纹付款按钮



我正在构建一个付款页面,该页面列出了三个不同的订阅选项,并且正在使用Stripe的结帐来管理付款。

该页面的渲染正常,所有3个订阅选项都具有应链接到条纹的"立即购买"按钮。

我的问题是,第一个按钮是唯一正确拉出条纹结帐流的按钮。按钮2和3丢下以下错误:

未知动作对于ChargesController找不到操作"索引"

我付款页面的相关部分是:

  <% @plans.each do |plan| %>
    <li class="col-md-3 plan <%= 'plan-primary' if plan.highlight? %>">
      <div class="img-thumbnail">
        <div class="caption">
          <h3><%= plan.name %></h3>
          <h4><%= plan_price(plan) %></h4>
          <div class="call-to-action">
            <% if @subscription.nil? %>
             <% if plan.highlight? %>
              <%= form_tag main_app.charges_path do %>
                <script src="https://checkout.stripe.com/checkout.js"></script>
                  <button id="customButton" class="btn btn-success">Buy Now</button>
                  <script>
                    var handler = StripeCheckout.configure({
                      key: '<%= 'pk_test_my_pk' %>',
                      image: '/assets/my_logo.png',
                      token: function(response) {
                        var tokenInput = $("<input type=hidden name=stripeToken />").val(response.id);
                        var emailInput = $("<input type=hidden name=stripeEmail />").val(response.email);
                        $("form").append(tokenInput).append(emailInput).submit();
                      }
                    });
                    document.getElementById('customButton').addEventListener('click', function(e) {
                      handler.open({
                        name: 'My Co',
                        description: 'Listing subsctiption ($50.00)',
                        amount: 50*100,
                        shippingAddress: false
                      });
                      e.preventDefault();
                    });
                  </script>
              <% end %>
              <% else %>
               <%= form_tag main_app.charges_path do %>
                <script src="https://checkout.stripe.com/checkout.js"></script>
                  <button id="customButton" class="btn btn-large btn-primary">Buy Now</button>
                  <script>
                    var handler = StripeCheckout.configure({
                      key: '<%= 'pk_test_my_pk' %>',
                      image: '/assets/my_logo.png',
                      token: function(response) {
                        var tokenInput = $("<input type=hidden name=stripeToken />").val(response.id);
                        var emailInput = $("<input type=hidden name=stripeEmail />").val(response.email);
                        $("form").append(tokenInput).append(emailInput).submit();
                      }
                    });
                    document.getElementById('customButton').addEventListener('click', function(e) {
                      // Open Checkout with further options
                      handler.open({
                        name: 'My Co',
                        description: 'Listing subsctiption ($40.00)',
                        amount: 40*100,
                        shippingAddress: false
                      });
                      e.preventDefault();
                    });
                  </script>
              <% end %>

            <% end %>

关于为什么只有三个按钮中的一个工作正常工作的想法?

谢谢!

您可以通过拥有唯一的按钮ID(例如

<button id="<%= dom_id(pricing, 'btn') %>

但是有另一个问题,带有条纹JS。如果您多次执行scripecheckout.configure,它将创建具有相同名称属性的多个iframe。不幸的是,这意味着您的客户试图购买的任何东西,即使Stripe弹出式弹出窗口都在向他们出售其他东西,它们也将始终出售您所插入的最后一件事。

我们使用了此解决方案:一种形式,并动态插入价格和时间:

<%= form_tag charges_path, id: 'stripe-payment-form' do %>
  <%= hidden_field_tag 'amount', nil, id: 'payment_amount' %>
  <%= hidden_field_tag 'name', nil, id: 'payment_name' %>
  <%= hidden_field_tag 'days', nil, id: 'payment_days'  %>
  <% Pricing.all.each do |pricing| %>
    <p>
      <button id="<%= dom_id(pricing, 'btn') %>">
        Buy <%= pricing.name %> for <%= number_to_currency(pricing.pounds, unit: '£') %>
      </button>
    </p>
  <% end %>
  <%= javascript_tag do %>
    var handler = StripeCheckout.configure({
      key: "<%= Rails.configuration.stripe[:publishable_key] %>",
      image: "<%= image_path('/images/apple-icons/apple-touch-icon-144x144-precomposed.png') %>",
      token: function(token, args) {
        var form = $('#stripe-payment-form');
        // Use the token to create the charge with a server-side script.
        // You can access the token ID with `token.id`
        form.append($('<input type="hidden" name="stripeToken" />').val(token.id));
        form.submit();
      }
    });
    <% Pricing.all.each do |pricing| %>
      document.getElementById('<%= dom_id(pricing, 'btn') %>').addEventListener('click', function(e) {
        e.preventDefault();
        var form = $('#stripe-payment-form');
        // set the price etc for the button clicked
        $('#payment_amount').val("<%= pricing.pence %>");
        $('#payment_name').val("<%= pricing.name %>");
        $('#payment_days').val("<%= pricing.days %>");
        // Open Checkout with further options
        handler.open({
          name: 'Company name',
          currency: 'GBP',
          description: '<%= pricing.name %>',
          amount: '<%= pricing.pence %>',
          email: '<%= member.email %>',
        });
      });
    <% end %>
  <% end %>
<% end %>

我最近在自己的应用程序中遇到了同样的问题。

您的所有三个按钮都具有相同的ID。

我知道这是旧的,但是我通过更改处理程序变量的名称(每个名称都具有不同的名称)而不是更改HTML ID来解决此问题。

我最近遇到了这个问题,并想留下替代解决方案。在我们的应用程序中,我们使用Stripe.js在页面上有两个按钮:" Buy Item"或" Pro订阅"。当单击第一个方法时,此方法使用jQuery只需从DOM上删除第二个按钮即可。如果用户取消付款,则将按钮渲染回DOM。这就是处理程序的外观:

$('#firstButton').on('click', function() {
  $('#secondButton').html(""); // Remove the second stripe script from the dom
  handler.open({
    // handler stuff
    closed: function(){
      $('#secondButton').html('<%= j render partial: "second_button" %>'); // Renders button back to the DOM if payment is cancelled. 
      }
  });
});

最新更新