Stripe 令牌未转移到控制器导轨 4

2024-06-23

问题

我已经测试了 CoffeeScript,表单调用 Stripe,使用正确的响应令牌设置隐藏字段并提交表单。我的问题是,一旦提交,控制器似乎无法正确获取令牌并抛出此错误:Stripe::InvalidRequestError - 您必须提供卡或客户 ID.

接下来,我厌倦了获取生成的令牌并将其硬编码到控制器中,看看这是否有效。我提交了表格,该表格有效,并且在 Stripes 端收到了付款。我对接下来要尝试什么几乎没有想法。我想知道我是否忘记了什么或遗漏了什么,因为付款嵌套在作业下。

宝石版本

  • 红宝石:2.1.0
  • 轨道:4.0.1
  • 条纹:1.9.9

Files

/付款/new.html.erb

<%= form_for([@assignment, @payment]) do |f| %>
  <% if @payment.errors.any? %>
    <div class="error_messages">
      <h2><%= pluralize(@payment.errors.count, "error") %> prohibited this subscription from being saved:</h2>
      <ul>
        <% @payment.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <%= f.hidden_field :stripe_customer_token %>

  <% if @payment.stripe_customer_token.present? %>
    <p>This assignment has already been paid for.</p>
  <% else %>

    <div class="field">
      <%= label_tag :card_number, "Credit Card Number" %>
      <%= text_field_tag :card_number, nil, name: nil, placeholder: "00000000000000" %>
    </div>
    <div class="row">
      <div class="field card__dates">
        <%= label_tag :card_month, "Card Expiration" %>
        <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %>
        <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %>
      </div>
      <div class="field card__cvv">
        <%= label_tag :card_code, "CVV" %>
        <%= text_field_tag :card_code, nil, name: nil, placeholder: "003", required: true, maxlength: 4, minlength: 3 %>
      </div>
    </div>

  <% end %>
  <div id="stripe_error">
    <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript>
  </div>
  <div class="actions">
    <%= f.submit "Pay " + number_to_currency(@assignment.price.to_s), class: 'btn btn__primary btn__large btn--fill' %>
  </div>

支付控制器.rb

class PaymentsController < ApplicationController
  def new
    set_assignment
    @payment = @assignment.build_payment
    @price = @assignment.price
  end

  def create
    set_assignment
    @payment = @assignment.build_payment(payment_params)

    if save_with_payment
      redirect_to assignments_path, :notice => "Payment received, Thank you!"

      # since payment was successful, set assignment paid to true
      Assignment.update(@assignment, assignment_paid: true, project_status: "In Progress")
    else
      render :new
    end
  end

  private

    def save_with_payment

      # Set your secret key: remember to change this to your live secret key in production
      # See your keys here https://manage.stripe.com/account
      Stripe.api_key = Rails.configuration.stripe[:secret_key]

      # Get the credit card details submitted by the form
      token = params[:stripe_customer_token]

      # How much the assignment costs, which must be converted to cents
      @amount = (@price * 100)

      # Create the charge on Stripe's servers - this will charge the user's card
      begin
        charge = Stripe::Charge.create(
          :amount => @amount,
          :currency => "cad",
          :card => token,
          :description => "some description of the product"
        )
      rescue Stripe::CardError => e
        redirect_to @assignment, :notice => "The card has been declined"
      end
    end

    def set_assignment
      @assignment = Assignment.friendly.find(params[:assignment_id])
    end

    def payment_params
      params.require(:payment).permit(
        :stripe_customer_token
      )
    end
end

支付.js.咖啡

$ ->
  Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
  payment.setupForm()

payment =
  setupForm: ->
    $('#new_payment').submit ->
      $('input[type=submit]').attr('disabled', true)
      if $('#card_number').length
        payment.processCard()
        false
      else
        true

  processCard: ->
    card =
      number: $('#card_number').val()
      cvc: $('#card_code').val()
      expMonth: $('#card_month').val()
      expYear: $('#card_year').val()
    Stripe.createToken(card, payment.handleStripeResponse)

  handleStripeResponse: (status, response) ->
    if status == 200
      console.log response
      $('#payment_stripe_customer_token').val(response.id)
      $('#new_payment')[0].submit()
    else
      $('#stripe_error').text(response.error.message)
      $('input[type=submit]').attr('disabled', false)

付款.rb

class Payment < ActiveRecord::Base
  belongs_to :assignment
end

据我所知,至少有两个问题。而且我想进步之后可能还会有更多。

  1. 您无权访问params within #save_with_payment

    问题发生在这一行:

    # Get the credit card details submitted by the form
    token = params[:stripe_customer_token]
    

    params 受 Strong_params 保护,您无权访问它。

    解决方法是允许所有需要的参数payment_params并在此方法中重用它。

  2. 其实你没有@price within #create

    这个问题与问题没有直接关系,但它确实存在。

    这个实例变量@price is in #new. And #create是另一个实例,因此您不能再拥有它。

    修复方法是从payment_params

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stripe 令牌未转移到控制器导轨 4 的相关文章

  • Twitter Bootstrap Modal 无法在 Rails 中工作

    我还很新Rails and to twitter bootstrap 我正在研究模态 但我收到了 NoMethodError 未定义的方法 渲染 当我删除 代码来自my release js erb页面 它消失但没有窗口出现 另外 还有错误
  • 在 Rails 中使用 config.assets.precompile 将资源包含在子目录中

    我有一个在 Heroku 上运行的 Rails 3 1 3 应用程序 通过 S3 进行资产托管asset sync 包含在我的app assets css目录是一个包含两个文件的子目录 main css scss and categorie
  • Rails:has_many:通过还是has_many_and_belongs_to?

    我有一个应用程序 我想通过另一个模型将一个模型的实例链接到同一模型的另一个实例 即 Task1 gt Relationship 基本上 关系模型将具有额外的信息 关系类型 滞后 因此将其作为连接模型是理想的 然而 并没有两个模型可以加入 只
  • 哈米尔评论结束

    我是哈米尔新手 这让我很困惑 我不喜欢删除可以注释掉的代码 但我不知道如何在 haml 中正确结束注释 这是一个代码片段 field f label member id br f text field member id field f l
  • 将用户输入转换为整数

    所以我有一个用户可以输入价格的表格 我正在尝试创建一个 before validation 来规范化数据 如果用户放置 则剪裁它 before validation do unless self price blank then self
  • 为什么这段 Ruby 代码无法写入日志文件?

    一旦脚本被守护 记录器就无法再写入文件 那么我应该如何以及何时初始化日志呢 require rubygems require daemons require logging def create new logger logger Logg
  • 日期时间到时间转换中奇怪的 Ruby 行为

    我的目标是从 DateTime 实例获取 Time 实例 这已经在这里讨论过 但我仍然很困惑 在 Ruby 中与日期时间和时间相互转换 https stackoverflow com questions 279769 convert to
  • gitignore 中的文件

    我在生产服务器中有一个带有 Rails 应用程序的存储库 在存储库中有 gitignore 文件 config database yaml 每个开发客户端都有一个具有不同 config database yaml 的克隆存储库 我的问题是这
  • Rails 4 生产环境中资产出现 404 not found 错误

    我是java环境中的rails新手 我对轨道 3 到轨道 4 的资产管道几乎没有什么困惑 目前我使用的是 Rails 4 2 5 我在本地环境中创建了一个示例应用程序 我从 app assets javascripts 内部创建了一个新的
  • puma 初始化程序不适用于 Rails 4.2

    我之前安装过很多次puma 从来没有出现过这个问题 我逐字遵循heroku 的指示 我创建了一个Procfile里面有这个 web bundle exec puma C config puma rb 这是配置文件 puma rb worke
  • 如何修复 PagesController#home 缺少请求格式模板:text/html

    对于我的 Rails 6 应用程序routes rb I have Rails application routes draw do root pages home end 并在我的pages controller rb I have cl
  • asset_host 和相关协议 URL 更改为 http

    我的应用程序 Rails 4 0 0 的某些元素可通过 http 和 https 连接使用 因此我已将 asset host 配置为使用相对协议 url 这应该允许浏览器进行切换它希望从中获取资产的协议 config action cont
  • 带 Bootstrap 选项卡的 Rails

    我有一个 Rails 4 应用程序 我正在尝试合并 Bootstrap 选项卡 阅读引导文档 它说这样做的一种方法不涉及任何js 我已经尝试了文档中的每种方法 但无法让它们在我的应用程序中工作 我目前的尝试是 ul class nav na
  • 使用 nginx 运行水豚

    是否可以使用 nginx 和乘客来运行水豚 而是 webrick Capybara 与 Cucumber 一起安装在 Rails 应用程序中 这很简单 你唯一要做的就是改变你的想法 水豚和黄瓜都不受本地环境的束缚 你可以测试位于互联网上的应
  • 如何在 js.erb 中使用 Ruby 代码?

    我可以使用以下方式在模态中渲染部分内容escape javascript在js erb文件代码中 body append my modal modal show 但是 我似乎无法获得以下结果 console log ERB 将输出一个纯字符
  • Heroku: PG::ConnectionBad: 无法连接到服务器: 连接被拒绝

    我尝试将新应用程序推送到 heroku 并出现此错误PG ConnectionBad could not connect to server Connection refused 这是我的 gemfile 与此有关系吗 我正在使用 spre
  • Rails:构建涉及多态关联和 STI 的查询

    我正在尝试查找有关照片的 10 条最新评论 以便将它们集成到我的 Rails 3 0 3 应用程序上的活动提要中 我有一个Photo模型 它继承自Upload使用单表继承的模型 class Upload lt ActiveRecord Ba
  • Heroku 上的 Rails 4 应用程序为 500ing,但日志中没有错误消息

    我制作了一个新的 Rails 4 beta 应用程序并将其部署到 Heroku 使用 Ruby 2 0 0 和通过 Procfile 的 Unicorn 它在本地运行良好foreman start 但是当我访问已部署应用程序的主页时 我只收
  • 更改设备消息“电子邮件已被占用”

    我在 ruby on Rails 应用程序中使用 devise gem 用户注册时 如果电子邮件已存在 则会出现默认消息 电子邮件已被占用 我已经在 en yml 中更改了此消息 activerecord errors messages t
  • Ruby on Rails Active Record RANDOM() 在循环内始终相同

    当每次循环迭代应该抓取随机记录时 为什么会重复输出相同的记录 ID count 0 while count lt 20 puts ID SomeModel where assoc id 10 order RANDOM limit 1 fir

随机推荐