Ruby on rails 为什么Stripe会在没有到期年份的情况下生成卡令牌?

Ruby on rails 为什么Stripe会在没有到期年份的情况下生成卡令牌?,ruby-on-rails,ruby,stripe-payments,Ruby On Rails,Ruby,Stripe Payments,我在user.rb中有以下方法: 即使我给它提供了不正确的卡信息,它也在生成令牌和卡,所以我使用Pry使用了这个方法。我看到的是: > params => {"number"=>"4242424242424242", "cvc"=>"123", "expiry_month"=>"12", "expiry_year"=>""} > token = Stripe::Token.create(:card => { :number => pa

我在user.rb中有以下方法:

即使我给它提供了不正确的卡信息,它也在生成令牌和卡,所以我使用Pry使用了这个方法。我看到的是:

> params
=> {"number"=>"4242424242424242", "cvc"=>"123", "expiry_month"=>"12", "expiry_year"=>""}
> token = Stripe::Token.create(:card => {
    :number => params["number"],
    :exp_month => params["expiry_month"],
    :exp_year => params["expiry_year"],
    :cvc => params["cvc"]})
=> #<Stripe::Token:0x3ffec3d0e9d4 id=test_tok_1> JSON: {
  "id": "test_tok_1",
  "livemode": false,
  "used": false,
  "object": "token",
  "type": "card",
  "card": {"id":"test_cc_2","object":"card","last4":"4242","type":"Visa","brand":"Visa","funding":"credit","exp_month":"12","exp_year":"","fingerprint":"eXWMGVNbMZcworZC","customer":"test_cus_default","country":"US","name":"Johnny App","address_line1":null,"address_line2":null,"address_city":null,"address_state":null,"address_zip":null,"address_country":null,"cvc_check":null,"address_line1_check":null,"address_zip_check":null,"number":"4242424242424242","cvc":"123"}
}
它为什么要生成令牌

当我检查此方法返回的card对象时,我得到:

> card
+----+------------+----------------+--------------+-------------+-------+-------------------------+-------------------------+----------+---------+
| id | card_id    | display_number | expiry_month | expiry_year | brand | created_at              | updated_at              | order_id | user_id |
+----+------------+----------------+--------------+-------------+-------+-------------------------+-------------------------+----------+---------+
| 2  | test_cus_3 | 4242           | 12           |             | Visa  | 2016-03-03 23:46:41 UTC | 2016-03-03 23:46:41 UTC |          | 1       |
+----+------------+----------------+--------------+-------------+-------+-------------------------+-------------------------+----------+---------+
> card.errors
=> #<ActiveModel::Errors:0x007ff13f1cb7d0
 @base=
  #<Card:0x007ff13f1e9d70
   id: 2,
   card_id: "test_cus_3",
   display_number: "4242",
   expiry_month: 12,
   expiry_year: nil,
   brand: "Visa",
   created_at: Thu, 03 Mar 2016 23:46:41 UTC +00:00,
   updated_at: Thu, 03 Mar 2016 23:46:41 UTC +00:00,
   order_id: nil,
   user_id: 1>,
 @messages={}>

看起来您正在提供一个后续卡号参数。所有测试编号均为

无论您是否指定了有效的到期年,此特定数字将始终成功


如果您试图引发过期的卡错误,请尝试使用4000000000000069,这肯定不起作用:

[1] pry(main)> require "stripe"
=> true
[2] pry(main)> Stripe.api_key = "sk_test_..."
=> "sk_test_..."
[3] pry(main)> params = {"number"=>"4242424242424242", "cvc"=>"123", "expiry_month"=>"12", "expiry_year"=>""}
=> {"number"=>"4242424242424242",
 "cvc"=>"123",
 "expiry_month"=>"12",
 "expiry_year"=>""}
[4] pry(main)> token = Stripe::Token.create(:card => {
[4] pry(main)*     :number => params["number"],
[4] pry(main)*     :exp_month => params["expiry_month"],
[4] pry(main)*     :exp_year => params["expiry_year"],
[4] pry(main)* :cvc => params["cvc"]})
Stripe::CardError: Your card's expiration year is invalid.
from /usr/local/lib/ruby/gems/2.3.0/gems/stripe-1.36.0/lib/stripe.rb:310:in `handle_api_error'

我建议您检查仪表板中的,以了解令牌创建请求的实际内容。

您是否使用test_tok_1输入令牌id?我只是通过使用curl直接调用API来测试这个问题,但无法复制它。这是不正确的,生成卡令牌需要一个到期年。传递字符串将返回无效的\u请求\u errorThx-这是StripeMock的问题
[1] pry(main)> require "stripe"
=> true
[2] pry(main)> Stripe.api_key = "sk_test_..."
=> "sk_test_..."
[3] pry(main)> params = {"number"=>"4242424242424242", "cvc"=>"123", "expiry_month"=>"12", "expiry_year"=>""}
=> {"number"=>"4242424242424242",
 "cvc"=>"123",
 "expiry_month"=>"12",
 "expiry_year"=>""}
[4] pry(main)> token = Stripe::Token.create(:card => {
[4] pry(main)*     :number => params["number"],
[4] pry(main)*     :exp_month => params["expiry_month"],
[4] pry(main)*     :exp_year => params["expiry_year"],
[4] pry(main)* :cvc => params["cvc"]})
Stripe::CardError: Your card's expiration year is invalid.
from /usr/local/lib/ruby/gems/2.3.0/gems/stripe-1.36.0/lib/stripe.rb:310:in `handle_api_error'