0

在对有关 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";

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

4

2 回答 2

3

是的,PayPal IPN Perl 示例脚本没有正确声明其变量,因此不会在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 。

于 2013-03-28T17:44:18.240 回答
2

您可以使用Business::PayPal::IPN而不是尝试使用 PayPal 的示例代码。

前段时间,我开始写一个替代的Business::PayPal::IPN::Modern,但我从未完成它,而且代码很糟糕。此外,它甚至在 PayPal 沙箱中也不起作用。

于 2013-03-28T15:42:34.050 回答