ActiveMerchant 说有效卡的信用卡无效

Posted

技术标签:

【中文标题】ActiveMerchant 说有效卡的信用卡无效【英文标题】:ActiveMerchant says invalid credit card for a valid card 【发布时间】:2014-12-30 01:25:38 【问题描述】:

我遇到了ActiveMerchant 的一个奇怪问题。 我正在使用activemerchant 来验证信用卡号,并且它工作正常。但是,我发现它似乎无法验证此卡号3088023605344101,当我输入JCB 类型的卡号时,也会出现大多数验证问题。这是我的代码的样子

cc = CreditCard.new(
                    :first_name => client_details[:firstname],
                    :last_name  => client_details[:lastname],
                    :month      => client_details[:month],
                    :year       => client_details[:year],
                    :number     => client_details[:cardnum],
                    :verification_value => client_details[:cvv]
                    )

这是我的控制台中正确验证卡的示例。

2.1.1 :052 > cc = CreditCard.new(:first_name => 'Steve',:last_name => 'Smith', :month   => '9',:year => '2015',:number => '5201457519355638', :verification_value => '123')
=> #<ActiveMerchant::Billing::CreditCard:0x00000109d3acc0 @first_name="Steve", @last_name="Smith", @month="9", @year="2015", @number="5201457519355638", @verification_value="123"> 
2.1.1 :053 > cc.valid?
=> true 
2.1.1 :054 > cc.brand
=> "master" 

虽然这似乎工作正常,但这里有一个引发品牌错误的示例。 起初,我不输入品牌,而是让活跃的商家找到它。

2.1.1 :056 > cc = CreditCard.new(:first_name => 'Steve',:last_name => 'Smith', :month => '9',:year => '2015',:number => '3088023605344101', :verification_value => '123')
=> #<ActiveMerchant::Billing::CreditCard:0x0000010a0d91d8 @first_name="Steve", @last_name="Smith", @month="9", @year="2015", @number="3088023605344101", @verification_value="123"> 
2.1.1 :057 > cc.valid?
=> false 
2.1.1 :058 > cc.errors
=> "brand"=>["is required"], "number"=>[]     

所以我喂品牌

2.1.1 :059 > cc = CreditCard.new(:first_name => 'Steve',:last_name => 'Smith', :month => '9',:year => '2015',:number => '3088023605344101', :verification_value => '123', :brand => 'jcb')
=> #<ActiveMerchant::Billing::CreditCard:0x00000109d886c8 @first_name="Steve", @last_name="Smith", @month="9", @year="2015", @number="3088023605344101", @verification_value="123", @brand="jcb"> 
2.1.1 :060 > cc.valid?
=> false 
2.1.1 :061 > cc.errors
=> "number"=>[], "brand"=>["does not match the card number"] 

我已经验证了来自不同站点的卡号,它们似乎还不错。我验证卡的网站是 freeformatter 和 igo

我不确定问题是什么,但如果有人知道为什么会这样,请告诉我。

【问题讨论】:

【参考方案1】:

我在 active_merchant github 上提出的问题建议他们使用此正则表达式 /^35(28|29|[3-8]\d)\d12$/ 来验证卡是否为 JCB 类型。 所以我只是相应地更改了正则表达式,但问题是为什么我提到的那些网站有30 系列卡,而 IIN 是35。所以我需要澄清这个问题,我现在要针对 SO 提出这个问题。

这是修改后的正则表达式

def type
  if @card =~ /^5[1-5][0-9]14$/
    return SUPPORTED_CARD_BRANDS[:MASTERCARD]
  elsif @card.match(/^4[0-9]12([0-9]3)?$/)
    return SUPPORTED_CARD_BRANDS[:VISA]
  elsif @card.match(/^3[47][0-9]13$/)
    return SUPPORTED_CARD_BRANDS[:AMEX]
  elsif @card =~ /^3(0[0-5]|[68][0-9])[0-9]11$/
    return SUPPORTED_CARD_BRANDS[:DINNERS]
  elsif @card =~ /^6011[0-9]12$/
    return SUPPORTED_CARD_BRANDS[:DISCOVER]
  elsif @card =~ /^(3[0-9]4|2131|1800)[0-9]11$/
    return SUPPORTED_CARD_BRANDS[:JCB]
  elsif @card =~ /^(5[06-8]|6)[0-9]10,17$/
    return SUPPORTED_CARD_BRANDS[:MAESTRO]
  else
    return nil
  end
end

【讨论】:

以上是关于ActiveMerchant 说有效卡的信用卡无效的主要内容,如果未能解决你的问题,请参考以下文章

使用 ActiveMerchant 和 PayPal 在实时网站上接受虚拟信用卡

ActiveMerchant 如何处理 Authorize.net 上的定期付款取消信用卡帐户?

ActiveMerchant - 向用户汇款的最佳方法?贝宝账户或信用卡

贝宝与 ActiveMerchant

如何在 ActiveMerchant 中使用存储的付款来源进行购买?

将 activemerchant 与 PayPal Payments Advanced 结合使用