журнал (shhh) wrote in changelog,
журнал
shhh
changelog

[ljcom] r12879: LJSUP-14234: Implement server part for s...

Committer: nnikulochkina
LJSUP-14234: Implement server part for shop payment pages
U   trunk/bin/upgrading/en_LJ.dat
U   trunk/bin/upgrading/ru.dat
U   trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm
U   trunk/cgi-bin/LJ/Widget/CreditCard.pm
U   trunk/cgi-bin/LJ/Widget/Shop/Cart.pm
Modified: trunk/bin/upgrading/en_LJ.dat
===================================================================
--- trunk/bin/upgrading/en_LJ.dat	2012-11-12 11:24:52 UTC (rev 12878)
+++ trunk/bin/upgrading/en_LJ.dat	2012-11-12 12:45:32 UTC (rev 12879)
@@ -6915,6 +6915,8 @@
 pay.cc.form.cardnumber.bubble-lite|staleness=1
 pay.cc.form.cardnumber.bubble-lite=Enter your card number. %card_type% card numbers are 16 digits long.
 
+pay.cc.form.cardnumber.bubble-lite.new=Enter your card number. [[card_type]] card numbers are 16 digits long.
+
 pay.cc.form.cardnumber.bubble-lite.americanexpress|staleness=1
 pay.cc.form.cardnumber.bubble-lite.americanexpress=Enter your card number. American Express card numbers are 15 digits long.
 
@@ -6954,6 +6956,8 @@
 
 pay.cc.form.cvv2.bubble-lite=Enter the security code from the back of your card. %card_type% has a 3 digit security code. <a [[aopts]] target=_blank>See an example</a>.
 
+pay.cc.form.cvv2.bubble-lite.new=Enter the security code from the back of your card. [[card_type]] has a 3 digit security code. <a [[aopts]] target=_blank>See an example</a>.
+
 pay.cc.form.cvv2.bubble-lite.americanexpress=Enter the security code from the back of your card. American Express has a 4 digit security code. <a [[aopts]] target=_blank>See an example</a>.
 
 pay.cc.form.cvv2.bubble-warning.americanexpress|staleness=1

Modified: trunk/bin/upgrading/ru.dat
===================================================================
--- trunk/bin/upgrading/ru.dat	2012-11-12 11:24:52 UTC (rev 12878)
+++ trunk/bin/upgrading/ru.dat	2012-11-12 12:45:32 UTC (rev 12879)
@@ -27794,6 +27794,8 @@
 
 pay.cc.form.cardnumber.bubble-lite=Введите номер своей банковской карты. Номера карт %card_type% содержат 16 цифр.
 
+pay.cc.form.cardnumber.bubble-lite.new=Введите номер своей банковской карты. Номера карт [[card_type]] содержат 16 цифр.
+
 pay.cc.form.cardnumber.bubble-lite.americanexpress=Введите номер своей банковской карты. Номера карт American Express содержат 15 цифр.
 
 pay.cc.form.cardnumber.bubble-warning.americanexpress=Введен неверный номер карты. Номера карт American Express содержат 15 цифр.
@@ -27824,6 +27826,8 @@
 
 pay.cc.form.cvv2.bubble-lite=Введите код безопасности, указанный на обратной стороне вашей карты. Код безопасности карт %card_type% содержит 3 цифры. <a [[aopts]] target=_blank>Образец</a>.
 
+pay.cc.form.cvv2.bubble-lite.new=Введите код безопасности, указанный на обратной стороне вашей карты. Код безопасности карт [[card_type]] содержит 3 цифры. <a [[aopts]] target=_blank>Образец</a>.
+
 pay.cc.form.cvv2.bubble-lite.americanexpress=Введите код безопасности, указанный на обратной стороне вашей карты. Код безопасности карт American Express содержит 4 цифры. <a [[aopts]] target=_blank>Образец</a>.
 
 pay.cc.form.cvv2.bubble-warning.americanexpress=Введен неверный код безопасности. Код безопасности карт American Express содержит 4 цифры.

Modified: trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm
===================================================================
--- trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm	2012-11-12 11:24:52 UTC (rev 12878)
+++ trunk/cgi-bin/LJ/Pay/Method/CreditCard.pm	2012-11-12 12:45:32 UTC (rev 12879)
@@ -3,6 +3,8 @@
 use strict;
 use base qw(LJ::Pay::Method);
 
+use LJ::DengiOnline;
+
 sub code { 'cc' }
 
 sub group { 'credit_card' }
@@ -13,9 +15,15 @@
         name        => 'Credit Cards',
         code_name   => 'credit_card',
         shop_method => 'cc',
-        img_src     => $LJ::IMGPREFIX.'/shop/payment/visa.png',
+        img_src     => {
+                          Visa       => $LJ::IMGPREFIX.'/shop/payment/visa.png',
+                          MasterCard => $LJ::IMGPREFIX.'/shop/payment/mastercard.png',
+                          AmEx       => $LJ::IMGPREFIX.'/shop/payment/amex.png',
+                          Discover   => $LJ::IMGPREFIX.'/shop/payment/discover.png',
+                       },
         func        => sub { &LJ::DengiOnline::credit_card; },
         id          => 60,
+        types       => [qw(Visa MasterCard AmEx Discover)],
     }
 }
 
@@ -31,22 +39,57 @@
     $amt_total = '1.00' if $amt_total <= 0 and $has_coppa;
     my $amt_charge = sprintf("%0.02f", $amt_total);
 
-    my $err  = '';
-    my $html = 
-        "<form method='post' action='$LJ::SSLROOT/pay/cc.bml?c=$cart_id' id='ccform'>"
-        . LJ::html_hidden("amt_charge", $amt_charge)
-        . LJ::Widget::CreditCard::render(
-                 LJ::Pay::RecBill->valid_countries,
-                 $err,
-                 { LJ::Request->post_params }, # only get method
-                 undef,
-                 {
-                    'cvv2' => 1,
-                    'has_coppa' => $has_coppa,
-                 }
-                )
-        . "</form>";
+    my ($err, $html);
 
+    # TODO: type
+    my $type = LJ::Request->get_param('type');
+
+    # TODO: err
+    #$self->ml_error('error.invalidform')
+    #    unless $type;
+    
+    my @params = ( 
+        LJ::Pay::RecBill->valid_countries,
+        $err,
+        { LJ::Request->post_params }, # only get method
+        undef,
+        {
+            'cvv2'       => 1,
+            'has_coppa'  => $has_coppa,
+            'amt_charge' => $amt_charge,
+            'type'       => $type,
+        }
+    );
+
+    if (LJ::is_enabled('dengionline')) {
+        if ( grep /$type/, @LJ::DENGIONLINE_VALID_CARDS) {
+            my $result = LJ::DengiOnline->create_bill (
+                cart_id         => $cart_id,
+                shop_method     => code(),
+            );
+
+            unless ($result && $result->{status} &&
+                    $result->{status} eq 'OK') {
+                LJ::Request->redirect("$LJ::SITEROOT/shop/cart.bml?pay_err=1&cart=$cart_id");
+                return;  
+            }
+            
+            $html = LJ::Widget::CreditCard::render_iframe('url' => $result->{url});
+
+        } else {
+
+            $html = LJ::Widget::CreditCard::render_form(@params);
+
+        }
+    } else {
+        $err  = '';
+        $html = 
+            "<form method='post' action='$LJ::SSLROOT/pay/cc.bml?c=$cart_id' id='ccform'>"
+            . LJ::html_hidden("amt_charge", $amt_charge)
+            . LJ::Widget::CreditCard::render(@params)
+            . "</form>";
+    }
+
     return { cc_payment_widget => $html };
 }
 

Modified: trunk/cgi-bin/LJ/Widget/CreditCard.pm
===================================================================
--- trunk/cgi-bin/LJ/Widget/CreditCard.pm	2012-11-12 11:24:52 UTC (rev 12878)
+++ trunk/cgi-bin/LJ/Widget/CreditCard.pm	2012-11-12 12:45:32 UTC (rev 12879)
@@ -7,6 +7,8 @@
 
 sub need_res { qw( stc/widgets/widget-layout.css stc/widgets/credit-card.css ) }
 
+use LJ::HTML::Template;
+
 # whatever page loads this should be including
 # pay.css and pay.js
 sub render {
@@ -304,6 +306,102 @@
     return $ret;
 }
 
+
+sub render_form {
+    my ( $countries, $err, $POST, $card, $opts ) = @_;
+
+    $opts ||= {};
+
+    my $remote = LJ::get_remote();
+
+    LJ::need_res(need_res());
+
+    # init some vars
+    my ($name, $exp_m, $exp_y, @exp_yrs);
+    if ( $card ) {
+        $name = $card->get_name_first() . " " . $card->get_name_last();
+        ($exp_y, $exp_m) = $card->get_exp();
+    }
+
+    my $year = (gmtime())[5];
+    $year += 1900;
+    push @exp_yrs, $year + $_ for (0..10);
+
+    # country
+    my $profile_country = $remote && $remote->prop('country');
+    my $countryval = ($card ? $card->get_country : $POST->{country}) || $profile_country;
+
+    # load US and Canadian states
+    my (%states);
+    LJ::load_codes({ state => \%states });
+    $states{''} = LJ::Lang::ml('pay.cc.form.state.uscanadaonly');
+    
+    # find a state value from a stored card or post value, unless
+    # it is a known US state
+    my $stateval = $card ? $card->get_state : $POST->{state_other};
+    $stateval = '' if $countryval =~ /^(US)$/ && $states{$stateval};
+
+    my $ml_cardnumber = $opts->{type} ne 'AmEx' ?
+      LJ::Lang::ml('pay.cc.form.cardnumber.bubble-lite.new', {card_type => $opts->{type}}) : 
+      LJ::Lang::ml('pay.cc.form.cardnumber.bubble-lite.americanexpress');
+
+    my $template = LJ::HTML::Template->new(
+                                           { use_expr => 1 }, # force HTML::Template::Pro with Expr support
+                                           filename => "$ENV{'LJHOME'}/templates/Widgets/shop/credit_card.tmpl",
+                                           die_on_bad_params => 0,
+                                           strict => 0,
+                                           ) or die "Can't open template: $!";
+    $template->param(
+        %$opts,
+        'cc_num'        => $POST->{cc_num} || ($LJ::IS_DEV_SERVER && '4111111111111111'),
+        'show_cvv2'     => $opts->{cvv2},
+        'cc_cvv2'       => $POST->{cc_cvv2} || ($LJ::IS_DEV_SERVER && '123'),
+        'exp_m'         => $POST->{exp_m},
+        'exp_months'    => [map { {month => sprintf("%02d", $_), value => $_} } (1..12)],
+        'exp_y'         => $POST->{exp_y} || ($LJ::IS_DEV_SERVER && 2015),
+        'exp_yrs'       => [map { {year => $_, value => $_} } @exp_yrs],
+        'name_full'     => $name || $POST->{name_full} || ($LJ::IS_DEV_SERVER && 'Name on Card'),
+        'country'       => $countryval || 'US',
+        'countries'     => [ map { { value => $_, name => $countries->{$_} } }  sort { $countries->{$a} cmp $countries->{$b} } keys %$countries],
+        'addr'          => ( $card ? $card->get_addr() : $POST->{addr} ) || ($LJ::IS_DEV_SERVER && 'Billing Address'),
+        'city'          => ( $card ? $card->get_city() : $POST->{city}) || ($LJ::IS_DEV_SERVER && 'City'),
+        'state'         => ( $card ? $card->get_state() : $POST->{state} || ($LJ::IS_DEV_SERVER && "AL") ),
+        'states'        => [ map { {value => $_, name => $states{$_}} } sort { $states{$a} cmp $states{$b} } keys %states],
+        'stateval'      => $stateval,
+        'postal_code'   => ( $card ? $card->get_postal_code() : $POST->{postal_code} ) || ($LJ::IS_DEV_SERVER && '12345'),
+        'email'         => ( $card ? $card->get_email() : $POST->{email} ) || ($remote && $remote->email_raw),
+        'ml_cardnumber' => $ml_cardnumber,
+    );
+
+
+    if ($opts->{cvv2}) {
+        my $ml_var = $opts->{type} eq 'AmEx' ? 
+            'pay.cc.form.cvv2.bubble-lite.americanexpress' :
+            'pay.cc.form.cvv2.bubble-lite.new';
+        my $card_type = $opts->{type};
+        $template->param( 
+            'ml_cc_cvv2' => LJ::Lang::ml($ml_var, {aopts => "href='$LJ::SSLROOT/pay/cvv2.bml'", card_type => $card_type} ) 
+        );
+    }
+
+    return $template->output;
+}
+
+
+sub render_iframe {
+    my %opts = @_;
+
+    my $template = LJ::HTML::Template->new(
+        { use_expr => 1 }, # force HTML::Template::Pro with Expr support
+        filename => "$ENV{'LJHOME'}/templates/Shop/DengiOnline/CreditCard.tmpl",
+        die_on_bad_params => 0,
+        strict => 0,
+    ) or die "Can't open template: $!";
+    $template->param( %opts );
+    return $template->output;
+}
+
+
 # Will also set state to value of state_other if non-US
 sub validate {
     my ($POST) = @_;

Modified: trunk/cgi-bin/LJ/Widget/Shop/Cart.pm
===================================================================
--- trunk/cgi-bin/LJ/Widget/Shop/Cart.pm	2012-11-12 11:24:52 UTC (rev 12878)
+++ trunk/cgi-bin/LJ/Widget/Shop/Cart.pm	2012-11-12 12:45:32 UTC (rev 12879)
@@ -348,8 +348,10 @@
             LJ::Request->delete_cookie('cart');
         }
 
+        # TODO: type
         LJ::Request->redirect("$LJ::SSLROOT/shop/checkout.bml?cart=" .
-            $cart->get_cart_as_string);
+            $cart->get_cart_as_string .
+            "&type=".LJ::Request->post_param('type'));
     }
 
     # repeat order

Tags: dat, ljcom, nikulochkina, nnikulochkina, pm
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