ssafronova (ssafronova) wrote in changelog,
ssafronova
ssafronova
changelog

[ljcom] r10133: LJSUP-8014: Credit card payment process ...

Committer: ssafronova
LJSUP-8014: Credit card payment process refactoring - first part
U   trunk/bin/upgrading/en_LJ.dat
U   trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm
U   trunk/cgi-bin/LJ/Widget/CreditCard.pm
U   trunk/ssldocs/manage/account/cc.bml
Modified: trunk/bin/upgrading/en_LJ.dat
===================================================================
--- trunk/bin/upgrading/en_LJ.dat	2011-02-25 11:25:21 UTC (rev 10132)
+++ trunk/bin/upgrading/en_LJ.dat	2011-02-25 12:59:26 UTC (rev 10133)
@@ -4061,6 +4061,8 @@
 
 pay.cc.validate.cardtype=Invalid credit card type, [[cardtype]], selected.
 
+pay.cc.validate.cardtype2=Wrong card type selected.  You have selected [[cardtype]], but entered a [[actual]] number.
+
 pay.cc.validate.country=Please select a valid country.
 
 pay.cc.validate.cvv2=Invalid CVV2 number entered. [[cardtype]] has a [[num]] digit CVV2 number.

Modified: trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm
===================================================================
--- trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm	2011-02-25 11:25:21 UTC (rev 10132)
+++ trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm	2011-02-25 12:59:26 UTC (rev 10133)
@@ -24,7 +24,7 @@
         . LJ::Widget::CreditCard::render(
                  LJ::Pay::RecBill->valid_countries,
                  $err,
-                 {}, # only get method
+                 { LJ::Request->post_params }, # only get method
                  undef,
                  {
                     'cvv2' => 1,

Modified: trunk/cgi-bin/LJ/Widget/CreditCard.pm
===================================================================
--- trunk/cgi-bin/LJ/Widget/CreditCard.pm	2011-02-25 11:25:21 UTC (rev 10132)
+++ trunk/cgi-bin/LJ/Widget/CreditCard.pm	2011-02-25 12:59:26 UTC (rev 10133)
@@ -12,6 +12,8 @@
 sub render {
     my ( $countries, $err, $POST, $card, $opts ) = @_;
 
+    my $remote = LJ::get_remote();
+
 	LJ::need_res(need_res());
     my $ret;
     $ret = '<ul class="b-ccform">';
@@ -114,7 +116,8 @@
     );
     $ret .= '</dd></dl></li>';
 
-    my $countryval = $card ? $card->get_country : $POST->{country};
+    my $profile_country = $remote && $remote->prop('country');
+    my $countryval = ($card ? $card->get_country : $POST->{country}) || $profile_country;
 
     $ret .= "<li><dl><dt><label for='country'>" . LJ::Lang::ml('pay.cc.form.country.label') . "</label></dt><dd>";
     $ret .= LJ::html_select(
@@ -216,7 +219,7 @@
             name      => 'email',
             id        => 'email',
             value     => ( $card ? $card->get_email() : $POST->{email} ) 
-                            || ($LJ::IS_DEV_SERVER && LJ::get_remote() && LJ::get_remote()->email_raw),
+                            || ($remote && $remote->email_raw),
             class     => 'input_field',
             tabindex  => 12,
             style     => 'width:225px',
@@ -260,10 +263,14 @@
 
 # Will also set state to value of state_other if non-US
 sub validate {
-    my ($POST, $err) = @_;
+    my ($POST, $err, $field) = @_;
 
+    my $a_field;
+    $field ||= \$a_field; # id of HTML element
+
     unless ($POST->{type} =~ /^Visa|MasterCard|AmEx|Discover$/) {
         $$err = LJ::Lang::ml('pay.cc.validate.cardtype', {'cardtype' => $POST->{type}});
+        $$field = 'type';
         return undef;
     }
 
@@ -277,11 +284,37 @@
 
     unless ($POST->{cc_num} =~ /^\d{$cc_len}$/) {
         $$err = LJ::Lang::ml('pay.cc.validate.cardnumber', {'cardtype' => $POST->{type}, 'num' => $cc_len});
+        $$field = 'cc_num';
         return undef;
     }
 
+    if ($POST->{type} ne 'Visa' and $POST->{cc_num} =~ /^4/) {
+        $$err = LJ::Lang::ml('pay.cc.validate.cardtype2', { 'cardtype' => $POST->{type}, 'actual' => 'Visa' });
+        $$field = 'type';
+        return undef;
+    }
+
+    if ($POST->{type} ne 'MasterCard' and $POST->{cc_num} =~ /^5/) {
+        $$err = LJ::Lang::ml('pay.cc.validate.cardtype2', { 'cardtype' => $POST->{type}, 'actual' => 'MasterCard' });
+        $$field = 'type';
+        return undef;
+    }
+
+    if ($POST->{type} ne 'Discover' and $POST->{cc_num} =~ /^6/) {
+        $$err = LJ::Lang::ml('pay.cc.validate.cardtype2', { 'cardtype' => $POST->{type}, 'actual' => 'Discover' });
+        $$field = 'type';
+        return undef;
+    }
+
+    if ($POST->{type} ne 'AmEx' and $POST->{cc_num} =~ /^3/) {
+        $$err = LJ::Lang::ml('pay.cc.validate.cardtype2', { 'cardtype' => $POST->{type}, 'actual' => 'American Express' });
+        $$field = 'type';
+        return undef;
+    }
+
     unless ($POST->{cc_cvv2} =~ /^\d{$cv_len}$/) {
         $$err = LJ::Lang::ml('pay.cc.validate.cvv2', {'cardtype' => $POST->{type}, 'num' => $cv_len});
+        $$field = 'cc_cvv2';
         return undef;
     }
 
@@ -292,27 +325,32 @@
 
     if ($POST->{exp_y} < $year || ($POST->{exp_y} == $year && $POST->{exp_m} < $mon)) {
         $$err = LJ::Lang::ml('pay.cc.validate.cardexpires');
+        $$field = 'exp_y';
         return undef;
     }
 
     unless ($POST->{name_full} =~ /\S+\s+\S+/) {
         $$err = LJ::Lang::ml('pay.cc.validate.name');
+        $$field = 'name_full';
         return undef;
     }
 
     unless (length($POST->{addr})) {
         $$err = LJ::Lang::ml('pay.cc.validate.address');
+        $$field = 'addr';
         return undef;
     }
 
     if ($POST->{country} eq 'US') {
         unless ($POST->{postal_code} =~ /^(\d{5})(-\d{4})?$/) {
             $$err = LJ::Lang::ml('pay.cc.validate.postalcode.us.invalid');
+            $$field = 'postal_code';
             return undef;
         }
 
         if (int($1) == 0) {
             $$err = LJ::Lang::ml('pay.cc.validate.postalcode.us.zero');
+            $$field = 'postal_code';
             return undef;
         }
 
@@ -320,12 +358,14 @@
         LJ::load_codes({ "state" => \%states });
         if (! $states{$POST->{state}}) {
             $$err = LJ::Lang::ml('pay.cc.validate.state.us');
+            $$field = 'state';
             return undef
         }
     } else {
         if ( $LJ::POSTALCODE_COUNTRIES{$POST->{country}} &&
             !(length($POST->{postal_code}) > 0 && length($POST->{postal_code}) < 15) ) {
             $$err = LJ::Lang::ml('pay.cc.validate.postalcode.other');
+            $$field = 'postal_code';
             return undef;
         }
 
@@ -339,6 +379,7 @@
     my $countries = LJ::Pay::RecBill->valid_countries;
     unless ($countries->{$POST->{country}}) {
         $$err = LJ::Lang::ml('pay.cc.validate.country');
+        $$field = 'country';
         return undef;
     }
 
@@ -346,6 +387,7 @@
     LJ::check_email($POST->{email}, \@email_errors);
     if ($POST->{email} && @email_errors) {
         $$err = join(", ", @email_errors);
+        $$field = 'email';
         return undef;
     }
 

Modified: trunk/ssldocs/manage/account/cc.bml
===================================================================
--- trunk/ssldocs/manage/account/cc.bml	2011-02-25 11:25:21 UTC (rev 10132)
+++ trunk/ssldocs/manage/account/cc.bml	2011-02-25 12:59:26 UTC (rev 10133)
@@ -77,7 +77,7 @@
 
     my $now = time();
 
-    my ($ret, $err);
+    my ($ret, $err, $err_field, $print_cc_form);
 
     # Sysban checks
     my $uniq = LJ::Request->notes('uniq');
@@ -197,7 +197,8 @@
         FOO: while (1) {  # so we can 'last' out of it
 
             my $err;
-            unless (LJ::Widget::CreditCard::validate(\%POST, \$err)) {
+            unless (LJ::Widget::CreditCard::validate(\%POST, \$err, \$err_field)) {
+                $print_cc_form = 1;
                 $die->($err);
             }
 
@@ -510,7 +511,7 @@
         }
     }
 
-    if ($err) {
+    if ($err and not $print_cc_form) {
         return "<?errorbar $err errorbar?>";
     }
 
@@ -528,6 +529,8 @@
         $ret .= " p?>";
     }
 
+    $ret .= "<?errorbar $err (field: $err_field) errorbar?>" if $print_cc_form;
+
     $ret .= '<form method="POST" id="ccform" onsubmit="return validate_cc_input()">';
     $ret .= LJ::html_hidden('pmtid', $pmtid) if $pmtid;
     $ret .= LJ::Widget::CreditCard::render( $rec->valid_countries(), $err, \%POST, $card, { cvv2 => 1 } );

Tags: bml, dat, ljcom, pm, ssafronova
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments