条纹“invalid_request_error” - 卡号未从表单传递到模型方法

Posted

技术标签:

【中文标题】条纹“invalid_request_error” - 卡号未从表单传递到模型方法【英文标题】:Stripe "invalid_request_error" - Card number not being passed from form to model method 【发布时间】:2014-06-23 06:05:24 【问题描述】:

我正在将带有 Stripe 的活跃商家集成到我的 rails 应用程序中,当我检查 Stripe 日志时,我看到以下内容:

type: "invalid_request_error" message: "You must supply either a card or a customer id"

卡号没有从我的视图中的表单传递到我的模型中的方法。

我必须在我的控制器中进行修改才能使其正常工作,但我不确定是什么。

型号

class Order < ActiveRecord::Base

has_many :order_products
has_many :products, through: :order_products

attr_accessor :card_number, :security_code, :card_expires_on

def credit_card

    @credit_card ||= ActiveMerchant::Billing::CreditCard.new(
        :number                 => card_number,
        :first_name             => first_name,
        :last_name              => last_name,
        :verification_value     => security_code,
        :month                  => card_expires_onmonth,
        :year                   => card_expires_onyear
        )
end

    def purchase(basket)

    response = GATEWAY.purchase(Product.total_basket_price(basket)*100, credit_card)

end
end

控制器

class OrdersController < ApplicationController

def create

    @order = Order.new

    basket.each do |item_id|
        @order.order_products.build(product: Product.find(item_id))
    end

    if @order.save!
        if @order.purchase(basket)
            render "show"
        else
            render "new"
        end
    else
        render "new"
    end



end
end

查看

<%= simple_form_for @order do |f| %>

  <%= f.input :card_number %>
  <%= f.input :security_code, label: "Security code (CVC)" %>
  <%= f.input :card_expires_on, as: :date, discard_day: true, add_month_numbers: true, start_year: Date.today.year, end_year: Date.today.year + 10, order: [:month, :year], label: "Card expiration date"  %>
  <%= f.button :submit, "Confirm and pay" %>

<% end %>

谁能提出解决方案?

非常感谢

【问题讨论】:

你的 Rails 版本是多少? 嘿@Kirti 这是 4.0.3 【参考方案1】:

您没有使用从表单传递的值创建 order 对象,这就是您收到错误的原因。

注意: @order = Order.newcreate 操作中。这将简单地创建一个没有属性集的Order 模型实例。

使用 Rails 4,您需要将希望保存的属性(甚至是虚拟属性)列入白名单。

因此,更新create 操作中的@order 实例化如下:

@order = Order.new(order_params)

在你的控制器的order_params 方法中,确保你允许这些属性。

更新:

如下更改您的order_params

def order_params
  if params[:order]["card_expires_on(1i)"] && params[:order]["card_expires_on(2i)"] && params[:order]["card_expires_on(3i)"]
    ## Set "card_expires_on" to a "Date" object created using the three values
    ## passed from the form "card_expires_on(1i)" and "card_expires_on(2i)", "card_expires_on(3i)" 
    params[:order][:card_expires_on] = Date.new(params[:order].delete("card_expires_on(1i)").to_i, params[:order].delete("card_expires_on(2i)").to_i , params[:order].delete("card_expires_on(3i)").to_i)
  end
  params.require(:order).permit(:card_number, :security_code, :card_expires_on )
end

更新Order模型中的credit_card方法如下所示:

def credit_card
    @credit_card ||= ActiveMerchant::Billing::CreditCard.new(
        :number                 => card_number,
        :first_name             => first_name,
        :last_name              => last_name,
        :verification_value     => security_code,
        :month                  => card_expires_on.month,  ## Get "month" from date object
        :year                   => card_expires_on.year    ## Get "year" from date object
        )
end

注意:

card_expires_on.month 而不是card_expires_onmonth

card_expires_on.year 而不是card_expires_onyear

如您在表单提交时生成的参数中所见(突出显示):

"utf8"=>"✓", "authenticity_token"=>"ZWlCaOUPbignlnoULIMpfMCcD9NXQ2Czb0hcQyq9ad4=", "order"=>"first_name"=>"", "last_name"=>"", "email"=>"", "address_1"=>"", "address_2"=>"", "city"=>"", "postal_code"=>"", "country_code"=>"英国", "card_number"=>"4242424242424242", "security_code"=>"123", "card_expires_on(3i)"=>"1", "card_expires_on(2i)"=>"5", "card_expires_on(1i)"=>"2016", "commit"=>"确认并付款"

对于日期字段card_expires_on,您会收到三个不同的键名

card_expires_on(1i) => 指向“年”

card_expires_on(2i) => 指向“月”

card_expires_on(3i) => 指向“日期”的默认设置为 1 并带有一个隐藏字段,因为您不允许它输入它

【讨论】:

嗨@Kirti,所以我之前尝试过这样的白名单,但由于某种原因它没有用。我现在遇到了 :card_expires_on 属性的错误,这是我期待的,因为正如您在 Order 模型中看到的那样,我已经说过 :month =&gt; card_expires_onmonth:year =&gt; card_expires_onyear。 Ryan Bates 的 railscast 使用 card_expires_on.month 但这对我不起作用。我得到的错误是multiparameter assignment error 分享表单提交时生成的参数哈希。所以我可以看到你到底是如何传递card_expires_on "utf8"=&gt;"✓", "authenticity_token"=&gt;"ZWlCaOUPbignlnoULIMpfMCcD9NXQ2Czb0hcQyq9ad4=", "order"=&gt;"first_name"=&gt;"", "last_name"=&gt;"", "email"=&gt;"", "address_1"=&gt;"", "address_2"=&gt;"", "city"=&gt;"", "postal_code"=&gt;"", "country_code"=&gt;"United Kingdom", "card_number"=&gt;"4242424242424242", "security_code"=&gt;"123", "card_expires_on(3i)"=&gt;"1", "card_expires_on(2i)"=&gt;"5", "card_expires_on(1i)"=&gt;"2016", "commit"=&gt;"Confirm and pay" 这是完整的错误信息:1 error(s) on assignment of multiparameter attributes [error on assignment [1, 5, 2016] to card_expires_on (undefined method "klass" for nil:NilClass)] 好的。知道了。 card_expires_on 需要一点点调整。阅读我的回答中的UPDATE 部分并完全按照它进行操作,您的问题应该会得到解决。

以上是关于条纹“invalid_request_error” - 卡号未从表单传递到模型方法的主要内容,如果未能解决你的问题,请参考以下文章

数字条纹投影技术基础3条纹分析技术的理论基础

数字条纹投影技术基础3条纹分析技术的理论基础

css [条纹]更改条纹表单的样式。

Unity 模型出现 条纹,闪烁的原因

background的水平条纹和斜向条纹

Bootstrap 表条纹:如何更改条纹背景颜色?