经过对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";
我很感激有关如何解决这些集成问题的任何指导。
答案 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沙箱中使用。