Solved

Help with Perl CGI script

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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

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 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 strings in Python: declaration, operations, indices, and slicing. Strings are declared with quotations; for example: s = "string": Strings are immutable.: Strings may be concatenated or multiplied using the addition and multiplic…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …

895 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

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now