Solved

Help with Perl CGI script

Posted on 2008-10-09
4
354 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
Comment Utility
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
Comment Utility
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
Comment Utility
0
 
LVL 48

Accepted Solution

by:
Tintin earned 75 total points
Comment Utility
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

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

It is a general practice to get rid of old user profiles on a computer  in a LAN environment. As I have been working with a company in a LAN environment where users move from one place to some other place at times. This will make many user profil…
Email validation in proper way is  very important validation required in any web pages. This code is self explainable except that Regular Expression which I used for pattern matching. I originally published as a thread on my website : http://www…
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

771 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

10 Experts available now in Live!

Get 1:1 Help Now