使用Stripe创建订阅

4
我将尝试使用Stripe创建订阅包。以下是我目前的内容:
我的控制器方法。
     def subscription_one
        session[:tab] = "$1.99/Month"
        @subscription = Subscription.where(user_id:current_user.id)
      end
     def create
      @subscription = Subscription.new(params[:subscription])
      if @subscription.save_with_payment
        redirect_to @subscription, :notice => "Thank you for subscribing!"
      else
        render :new
      end
    end

subscription_one.html.erb

<% if @subscription.present? %>
    CREDIT CARD DETAILS PRESENT
<% else %>
    <form action="/membership/apply" method="POST" id="payment-form">
        <article>
            <label class="amount"> <span>Amount: $5.00</span> </label>
        </article>

        <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
        data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
        data-description="A month's subscription"
        data-amount="500"></script>

<% end %>

当我填写所有字段中的值,提交时出现错误

ActionController::InvalidAuthenticityToken in MembershipController#create

有什么想法吗?

1
手动创建表单是不好的实践,因为没有在头部添加 csrf-token 的表单会引发 InvalidAuthenticityToken 错误。 - Roman Kiselenko
2个回答

4

几个问题:

--

表单

你包含的form是硬编码的。

你面临的问题是,正如Philidor Green所述,这个表单不会有Rails提供的正确的authenticity token。通常情况下,Rails为大多数HTML元素提供帮助程序,允许您为应用程序创建一致的代码:

<%= form_tag path do %>
<% end %>

您应该使用form_tag来完成此操作。

--

订阅

Subscription.new(params[:subscription])

应该是:

def subscribed_one
    Subscription.new(subscription_params)
end

private

def subscription_params
    params.require(:subscription).permit(:params, :attributes)
end

--

更新

要处理这个问题,我会这样做:

#view
<% if @subscription.present? %>
    Credit Card Details Present
<% else %>
   <%= form_tag membership_apply_path, id: "payment-form" do %>
        <%= content_tag :article do %>
            <%= label_tag class: "amount" %>
            <%= content_tag :span, "Amount: $5.00" %>
        <% end %>
        <% submit_tag "Susbcribe" %>
   <% end %>
<% end %>

#app/views/layouts/application.html.erb
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
        data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
        data-description="A month's subscription"
        data-amount="500">
</script>

#app/controllers/subscriptions_controller.rb
 def subscription_one
      session[:tab] = "$1.99/Month"
      @subscription = Subscription.where(user_id:current_user.id)
 end

 def create
    @subscription = Subscription.new(params[:subscription])
    if @subscription.save_with_payment
      redirect_to @subscription, :notice => "Thank you for subscribing!"
    else
      render :new
    end
end

2

我找到了一个解决方法,可能太简单了,就是使用标准的stripe结账,将标准表单元素替换为for_path。看起来这个方法有效:

 <%= form_tag stripe_user_standart_charge_checkout_path do %>
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="..."
    data-amount="999"
    data-name="Grégoire Mulliez"
    data-description="Timee"
    data-zip-code="true"
    data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
    data-locale="auto"
    data-currency="eur">
  </script>
<% end %>

stripe_user_standart_charge_checkout_path是你想要的任何路由,不要忘记在routes.rb中将其定义为POST(而不是get)

编辑:您可以使用此方法检索每小时交易令牌,同时我添加了一些HTML隐藏字段来检索我的交易详细信息,它像魅力一样工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接