ActiveMerchant说有效卡的信用卡无效

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

 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] ) 

以下是我的控制台中的示例,该示例正确validation了该卡。

 2.1.1 :052 > cc = CreditCard.new(: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') => # 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') => # 2.1.1 :060 > cc.valid? => false 2.1.1 :061 > cc.errors => {"number"=>[], "brand"=>["does not match the card number"]} 

我已经validation了来自不同网站的卡号,它们似乎很好。 我validation卡的网站是freeformatter和igo

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

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

这是改变的正则表达式

 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