0

Perl に関する本や記事をよく調べた結果、Perl IPN サンプル コードを Web サイトの Perl スクリプトに統合することができませんでした。問題の多くは、特定の変数の導入方法と使用方法に起因しているようです。たとえば、サンプルの最初のアクティブな行は次のとおりです。

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

この行がコンパイルされると、 $query は未定義としてフラグが立てられるため、その行の前に次の行を追加してみました:

my $query = "";

これにより、初期化されていないエラーが発生しました。私のスクリプトのコンテキスト (他の約 10 行のコード) が問題の原因なのか、それとも Perl 変数を理解していないのかはわかりません。私は約 12 の言語でコーディングしてお金を稼いできましたが、これは私にとって初めての 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

PayPal のサンプル コードを使用する代わりに、 Business::PayPal::IPNを使用できます。

しばらく前に、代わりのBusiness::PayPal::IPN::Modernを書き始めましたが、完成することはなく、コードはひどいものです。さらに、PayPal サンドボックスでも機能しません。

于 2013-03-28T15:42:34.050 に答える