Solved

Help with Perl CGI script

Posted on 2008-10-09
4
409 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

Space-Age Communications Transitions to DevOps

ViaSat, a global provider of satellite and wireless communications, securely connects businesses, governments, and organizations to the Internet. Learn how ViaSat’s Network Solutions Engineer, drove the transition from a traditional network support to a DevOps-centric model.

Question has a verified solution.

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

Suggested Solutions

Recently I have been answering a lot of questions like this in IT forums that I frequent. The question posed is usually something along the lines of "We have software X installed and need to uninstall it for reason Y" or some other variant of the sa…
In this tutorial I will show you how to provide a dynamic RTF document on your website generated with data from your database. For this tutorial you will need Microsoft Word or WordPad, WhizBase and Microsoft Access. In this tutorial I will show …
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

749 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