Perl Net::Stripe 信用卡号错误的内部服务器错误
Perl Net::Stripe Internal Server Error with Bad Credit Card Number
我正在使用 Net::Stripe 处理信用卡。如果信用卡号有效,它可以正常工作。但是当我测试一个错误的信用卡号时,我到达了 Stripe.pm:
的第 676 行
676: die $e;
这会产生此错误:
1 at /usr/share/perl/5.14/perl5db.pl line 7799.
这会导致浏览器出现内部服务器错误。
Stripe.pm 中以 die 语句结尾的代码块是这样的:
if ($resp->code == 200) {
return _hash_to_object(decode_json($resp->content));
} elsif ($resp->code == 500) {
die Net::Stripe::Error->new(
type => "HTTP request error",
code => $resp->code,
message => $resp->status_line . " - " . $resp->content,
);
}
my $e = eval {
my $hash = decode_json($resp->content);
Net::Stripe::Error->new($hash->{error})
};
if ($@) {
Net::Stripe::Error->new(
type => "Could not decode HTTP response: $@",
message => $resp->status_line . " - " . $resp->content,
);
};
warn "$e\n" if $self->debug;
die $e;
从 Stripe 返回的响应代码是 402。
我正在尝试使用以下代码处理来自 Stripe 的错误消息:
my $card_token = $stripe->post_token(
card => {
number => $FORM{'Credit Card #'},
exp_month => $FORM{'Expiration Month'},
exp_year => $FORM{'Expiration Year'},
currency => 'usd',
cvc => $FORM{'Credit Card Security Code'},
name => $FORM{'Name on Card'},
address_line1 => $FORM{'Address'},
address_city => $FORM{'City'},
address_state => $FORM{'State'},
address_zip => $FORM{'Zip'}
}
);
if ($card_token->{failure_message}) {
$error = $card_token->{failure_message};
print "Content-type: text/html\n\n";
print "There was an error processing your credit card:<br><br>$error";
}
但是代码在退出尝试检索令牌的代码块之前就快死了。
有没有办法禁止 "die" 声明?
您可以使用eval捕获这个异常,然后继续工作。
my $card_token;
my $ok = eval {
$card_token = $stripe->post_token(
card => {
number => $FORM{'Credit Card #'},
exp_month => $FORM{'Expiration Month'},
exp_year => $FORM{'Expiration Year'},
currency => 'usd',
cvc => $FORM{'Credit Card Security Code'},
name => $FORM{'Name on Card'},
address_line1 => $FORM{'Address'},
address_city => $FORM{'City'},
address_state => $FORM{'State'},
address_zip => $FORM{'Zip'}
}
);
1;
}
if (! $ok) {
# error object is in $@. You'll need to investigate its structure
# before using it
my $error = $@;
...;
}
else {
# do stuff with $card_token
}
我正在使用 Net::Stripe 处理信用卡。如果信用卡号有效,它可以正常工作。但是当我测试一个错误的信用卡号时,我到达了 Stripe.pm:
的第 676 行676: die $e;
这会产生此错误:
1 at /usr/share/perl/5.14/perl5db.pl line 7799.
这会导致浏览器出现内部服务器错误。
Stripe.pm 中以 die 语句结尾的代码块是这样的:
if ($resp->code == 200) {
return _hash_to_object(decode_json($resp->content));
} elsif ($resp->code == 500) {
die Net::Stripe::Error->new(
type => "HTTP request error",
code => $resp->code,
message => $resp->status_line . " - " . $resp->content,
);
}
my $e = eval {
my $hash = decode_json($resp->content);
Net::Stripe::Error->new($hash->{error})
};
if ($@) {
Net::Stripe::Error->new(
type => "Could not decode HTTP response: $@",
message => $resp->status_line . " - " . $resp->content,
);
};
warn "$e\n" if $self->debug;
die $e;
从 Stripe 返回的响应代码是 402。
我正在尝试使用以下代码处理来自 Stripe 的错误消息:
my $card_token = $stripe->post_token(
card => {
number => $FORM{'Credit Card #'},
exp_month => $FORM{'Expiration Month'},
exp_year => $FORM{'Expiration Year'},
currency => 'usd',
cvc => $FORM{'Credit Card Security Code'},
name => $FORM{'Name on Card'},
address_line1 => $FORM{'Address'},
address_city => $FORM{'City'},
address_state => $FORM{'State'},
address_zip => $FORM{'Zip'}
}
);
if ($card_token->{failure_message}) {
$error = $card_token->{failure_message};
print "Content-type: text/html\n\n";
print "There was an error processing your credit card:<br><br>$error";
}
但是代码在退出尝试检索令牌的代码块之前就快死了。
有没有办法禁止 "die" 声明?
您可以使用eval捕获这个异常,然后继续工作。
my $card_token;
my $ok = eval {
$card_token = $stripe->post_token(
card => {
number => $FORM{'Credit Card #'},
exp_month => $FORM{'Expiration Month'},
exp_year => $FORM{'Expiration Year'},
currency => 'usd',
cvc => $FORM{'Credit Card Security Code'},
name => $FORM{'Name on Card'},
address_line1 => $FORM{'Address'},
address_city => $FORM{'City'},
address_state => $FORM{'State'},
address_zip => $FORM{'Zip'}
}
);
1;
}
if (! $ok) {
# error object is in $@. You'll need to investigate its structure
# before using it
my $error = $@;
...;
}
else {
# do stuff with $card_token
}