我遇到了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
我不确定问题是什么,但如果有人知道为什么会这样,那么请告诉我。
答案 0 :(得分:0)
我在active_merchant github上提出的问题建议他们使用此正则表达式/^35(28|29|[3-8]\d)\d{12}$/
来验证该卡是否为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