在Perl IPN示例代码中首次使用$ query会导致“未定义”错误

时间:2013-03-28 15:30:56

标签: perl paypal-ipn

经过对Perl的书籍和文章的大量研究后,我无法将Perl IPN示例代码集成到我的网站的Perl脚本中。许多麻烦似乎来自于如何引入和使用某些变量。例如,样本的第一个活动行是:

read (STDIN, $query, $ENV{'CONTENT_LENGTH'});

编译这一行时,$ query被标记为未定义,所以我尝试在该行前面加上:

my $query = "";

这导致了未初始化的错误。我不确定我的脚本的上下文(大约是十几个其他代码行)是否导致了问题,或者我是否不理解Perl变量。虽然我用十几种语言编写了代码,但这是我的第一个Perl脚本,所以这当然是可能的。

我用这些行开始我的脚本,我不确定他们是否有助于解决这个问题:

#!/usr/bin/perl

# This is the Buck A View package.
package BuckAViewMovie;

use strict;
use warnings;
use diagnostics;
use LWP::UserAgent;

print "Content-type: text/html;\n\n";

我很感激有关如何解决这些集成问题的任何指导。

2 个答案:

答案 0 :(得分:3)

是的,PayPal IPN Perl sample script没有正确声明其变量,因此不会在use strict下编译。这是一个应该起作用的清理版本:

#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI ();
use LWP::UserAgent;

use constant PAYPAL_URL => 'https://www.paypal.com/cgi-bin/webscr';

# read post from PayPal system and add 'cmd'
my $q = CGI->new();
$q->param( cmd => '_notify-validate' );

# post back to PayPal system to validate
my $ua = LWP::UserAgent->new();
my $res = $ua->post( PAYPAL_URL, scalar $q->Vars );

# assign posted variables to local variables
my $item_name        = $q->param('item_name');
my $item_number      = $q->param('item_number');
my $payment_status   = $q->param('payment_status');
my $payment_amount   = $q->param('mc_gross');
my $payment_currency = $q->param('mc_currency');
my $txn_id           = $q->param('txn_id');
my $receiver_email   = $q->param('receiver_email');
my $payer_email      = $q->param('payer_email');

if ($res->is_error) {
    # HTTP error
}
elsif ($res->content eq 'VERIFIED') {
    # check that $payment_status is 'Completed'
    # check that $txn_id has not been previously processed
    # check that $receiver_email is your Primary PayPal email
    # check that $payment_amount/$payment_currency are correct
    # process payment
}
elsif ($res->content eq 'INVALID') {
    # log for manual investigation
}
else {
    # error
}

# print result page
print "Content-type: text/html\n\n";
warningsToBrowser( 1 );
# ...

或者你可以像SinanÜnür建议的那样使用Business::PayPal::IPN

答案 1 :(得分:2)

您可以使用 Business::PayPal::IPN

,而不是尝试使用PayPal的示例代码

前段时间,我开始编写替换Business::PayPal::IPN::Modern,但我从未完成它,代码很糟糕。此外,它甚至不能在PayPal沙箱中使用。