ActiveMerchant сообщает о недействительной кредитной карте для действующей карты

У меня странная проблема с 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

Я не уверен, в чем проблема, но если кто-нибудь знает, почему это происходит, дайте мне знать.


person Pramod Solanky    schedule 03.11.2014    source источник


Ответы (1)


Проблема, которую я поднял на active_merchant github, предполагала, что они используют это регулярное выражение /^35(28|29|[3-8]\d)\d{12}$/ для проверки того, имеет ли карта тип 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
person Pramod Solanky    schedule 14.11.2014