Solved

Help with Perl CGI script

Posted on 2008-10-09
4
432 Views
Last Modified: 2013-12-25
Greetings,

I am working on a Paypal ipn script. Code attached.

Using strict, I get ta syntax error. What am I overlooking?
Is there an easier way?

Any help or input greatly appreciated.
#!/usr/bin/perl
use strict;
 
 
        # read post from PayPal system and add 'cmd'
        read (STDIN, my $query, $ENV{'CONTENT_LENGTH'});
        $query .= '&cmd=_notify-validate';
 
        # post back to PayPal system to validate
        use LWP::UserAgent;
        my $ua = new LWP::UserAgent;
        my $req = new HTTP::Request 'POST','https://www.paypal.com/cgi-bin/webscr';
        $req->content_type('application/x-www-variable-urlencoded');
        $req->content($query);
        my $res = $ua->request($req);
 
        # split posted variables into pairs
       my @pairs = split(/&/, $query);
       my $count = 0;
        foreach my $pair (@pairs) {
       my ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $variable{$name} = $value;
        $count++;
        }
        # assign posted variables to local variables
        my $payment_status = $variable{'payment_status'};
        my $txn_id = $variable{'txn_id'};
        my $custom = $variable{'custom'};
        my $option_name0= $variable{'option_name0'};
        my $option_name1= $variable{'option_name1'};
        my $payment_date = $variable{'payment_date'};
        my $receiver_email = $variable{'receiver_email'};
        my $payment_gross = $variable{'payment_gross'};
        my $payment_fee = $variable{'payment_fee'};
        my $payment_type = $variable{'payment_type'};
        my $first_name = $variable{'first_name'};
        my $last_name = $variable{'last_name'};
        my $item_number = $variable{'item_number'};
        my $item_name = $variable{'item_name'};
        my $payer_email = $variable{'payer_email'};
        my $payer_status = $variable{'payer_status'};
 
 
 
        if ($res->is_error) {&http_error; }
        elsif ($res->content eq 'VERIFIED') {
        }}
        elsif ($res->content eq 'INVALID') {
        open(LOG,">>$paylog");
         }
 
        else { }

Open in new window

0
Comment
Question by:capper5
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
4 Comments
 
LVL 39

Assisted Solution

by:Adam314
Adam314 earned 50 total points
ID: 22678985
Your line 49 has two } when it should have only 1.

You don't define %variable before it's used.
    add this line before line 20:
    my %variable;

You don't define or set $paylog before it's used.
    add this line before line 51
    my $paylog = '/the/path/to/the/log.file';


You are processing the input data manually, you should be using the CGI module:
http://search.cpan.org/author/LDS/CGI.pm-3.42/CGI.pm
0
 

Author Comment

by:capper5
ID: 22679085
What code do I use to make the CGI module parse the post and assign the values to local?
I have never worked with this module?

Thanks
0
 
LVL 28

Expert Comment

by:FishMonger
ID: 22679802
0
 
LVL 48

Accepted Solution

by:
Tintin earned 75 total points
ID: 22682401
Putting it all together, it would look something like:
#!/usr/bin/perl
use strict;
use CGI::Carp 'fatalsToBrowser';
use CGI;
use LWP::UserAgent;
 
read (STDIN, my $query, $ENV{'CONTENT_LENGTH'});
$query .= '&cmd=_notify-validate';
 
my $q = new CGI;
my %variable = $q->Vars;
 
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request 'POST','https://www.paypal.com/cgi-bin/webscr';
$req->content_type('application/x-www-variable-urlencoded');
$req->content($query);
my $res = $ua->request($req);
 
my $paylog='somelog';
 
my $payment_status = $variable{'payment_status'};
my $txn_id = $variable{'txn_id'};
my $custom = $variable{'custom'};
my $option_name0= $variable{'option_name0'};
my $option_name1= $variable{'option_name1'};
my $payment_date = $variable{'payment_date'};
my $receiver_email = $variable{'receiver_email'};
my $payment_gross = $variable{'payment_gross'};
my $payment_fee = $variable{'payment_fee'};
my $payment_type = $variable{'payment_type'};
my $first_name = $variable{'first_name'};
my $last_name = $variable{'last_name'};
my $item_number = $variable{'item_number'};
my $item_name = $variable{'item_name'};
my $payer_email = $variable{'payer_email'};
my $payer_status = $variable{'payer_status'};
 
 
 
http_error() if ($res->is_error);
 
if ($res->content eq 'VERIFIED') {
   # Do something
}
elsif ($res->content eq 'INVALID') {
   open(LOG,">>$paylog") or die "Can not open $paylog $!\n";
 }
else {
   # do something
}

Open in new window

0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
In the distant past (last year) I hacked together a little toy that would allow a couple of Manager types to query, preview, and extract data from a number of MongoDB instances, to their tool of choice: Excel (http://dilbert.com/strips/comic/2007-08…
Learn the basics of while and for loops in Python.  while loops are used for testing while, or until, a condition is met: The structure of a while loop is as follows:     while <condition>:         do something         repeate: The break statement m…
The viewer will learn how to count occurrences of each item in an array.

636 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question