+ if ( $self->payby eq 'CARD' && ! $self->is_encrypted($self->payinfo) ) {
+ my $payinfo = $self->payinfo;
+ my $cardtype = cardtype($payinfo);
+ $self->set('cardtype', $cardtype);
+ if ( $ignore_masked_payinfo and $self->mask_payinfo eq $self->payinfo ) {
+ # allow it
+ } else {
+ $payinfo =~ s/\D//g;
+ $self->payinfo($payinfo);
+ if ( $self->payinfo ) {
+ $self->payinfo =~ /^(\d{13,16}|\d{8,9})$/
+ or return "Illegal (mistyped?) credit card number (payinfo)";
+ $self->payinfo($1);
+ validate($self->payinfo) or return "Illegal credit card number";
+ return "Unknown card type" if $self->payinfo !~ /^99\d{14}$/ #token
+ && $cardtype eq "Unknown";
+ } else {
+ $self->payinfo('N/A'); #???
+ }
+ }
+ } else {
+ if ( $self->payby eq 'CARD' and $self->paymask ) {
+ # if we can't decrypt the card, at least detect the cardtype
+ $self->set('cardtype', cardtype($self->paymask));
+ } else {
+ $self->set('cardtype', '');
+ }
+ if ( $self->is_encrypted($self->payinfo) ) {
+ #something better? all it would cause is a decryption error anyway?
+ my $error = $self->ut_anything('payinfo');
+ return $error if $error;
+ } else {
+ my $error = $self->ut_textn('payinfo');
+ return $error if $error;
+ }
+ }