#!/usr/bin/perl use LWP::UserAgent; print "Content-type: text/plain\n\n"; # read post from PayPal system and add 'cmd' read (STDIN, $query, $ENV{'CONTENT_LENGTH'}); $query .= '&cmd=_notify-validate'; # post back to PayPal system to validate $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 }); # when testing change sandbox url here $req = HTTP::Request->new('POST', 'https://www.paypal.com/cgi-bin/webscr'); $req->content_type('application/x-www-form-urlencoded'); # and here $req->header(Host => 'www.paypal.com'); $req->content($query); $res = $ua->request($req); # split posted variables into pairs @pairs = split(/&/, $query); $count = 0; foreach $pair (@pairs) { ($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 $item_name = $variable{'item_name'}; $item_number = $variable{'item_number'}; $payment_status = $variable{'payment_status'}; $payment_amount = $variable{'mc_gross'}; $payment_currency = $variable{'mc_currency'}; $txn_id = $variable{'txn_id'}; $receiver_email = $variable{'receiver_email'}; $payer_email = $variable{'payer_email'}; $custom = $variable{'custom'}; if ($res->is_error) { # HTTP error # do whatever necessary print "ERROR: http_error! (Not sure what this is)\n"; $ipnerror = "http_error"; &error1; } elsif ($res->content eq 'VERIFIED') { print "PayPal responded VERIFIED.\n"; # check the $payment_status=Completed if ($payment_status ne "Completed") { # do whatever necessary print "Payment status was not Completed.\n"; $ipnerror = "Payment status was not completed."; &error1; } # check that $receiver_email is your Primary PayPal email elsif ($receiver_email ne "info\@email.com") { # do whatever necessary print "Receiver email was incorrect.\n"; $ipnerror = "Receiver email was incorrect"; &error1; } # process payment else { # everything ok, update your database # split 4 passthrough variables in "custom", separated by comma (',') # change separator char if necessary print "Everything should be ok.\n"; my ($user1, $user2, $user3) = split(/,/, $custom, 3); my $response = $ua->post('http://www.mydomain.com/cgi-bin/add-listing.pl', { 'USER1' => $user1, 'USER2' => $user2, 'USER3' => $user3, 'RESULT' => '0' } ); unless ($response->is_success) { print "Posting to add-listing.pl failed.\n"; $ipnerror = "Posting to add-listing.pl failed."; &error1; # request failed } # parse server response my $resdec = $response->decoded_content; } } elsif ($res->content eq 'INVALID') { # log for manual investigation # do whatever necessary print "PayPal responded INVALID. (Probably means it didn't get called from Paypal.)\n"; $ipnerror = "PayPal responded INVALID. (Probably means it didn't get called from Paypal.)"; &error1; } else { # error # do whatever necessary print "Unexpected response from PayPal.\n"; $ipnerror = "Unexpected response from PayPal."; &error1; } sub error1 { $notify_admin2 = "1"; #1=yes, 0=no $mailprog = "/usr/sbin/sendmail"; if ($notify_admin2 eq "1") { # send mail with activate link to admin open (MAIL, "|$mailprog info\@email.com") || die "Can't open $mailprog!\n"; print MAIL "From: $sitename \n"; print MAIL "Reply-to: $sitename \n"; print MAIL "To: info@email.com\n"; print MAIL "Subject: IPN Handler Error\n"; print MAIL "Content-type: text/plain\n"; print MAIL "There was an IPN Handler error.\n\n"; print MAIL "Error: $ipnerror\n\n"; print MAIL "User1: $user1\n"; print MAIL "User2: $user2\n"; print MAIL "User3: $user3\n"; print MAIL "This email sent by ipn-handler.pl. \n\n"; close (MAIL); } } #end sub print "Done\n";