@ISA = qw(Business::OnlinePayment::HTTPS);
$DEBUG = 0;
-$VERSION = '0.02';
+$VERSION = '0.07';
+
+sub _info {
+ 'info_compat' => '0.01',
+ 'gateway_name' => 'vSecure Processing',
+ 'gateway_url' => 'http://www.vsecureprocessing.com/',
+ 'module_version' => $VERSION,
+ 'supported_types' => [qw( CC )],
+ 'token_support' => 0,
+ 'test_transaction' => 1,
+ 'partial_auth' => 1,
+ 'supported_actions' => [
+ 'Normal Authorization',
+ #'Authorization Only',
+ #'Post Authorization',
+ 'Reverse Authorization',
+ 'Void',
+ 'Credit',
+ ],
+}
# mapping out all possible endpoints
# but this version will only be building out "charge", "void", & "credit"
$self->build_subs(qw/
platform tid appid
- action reference_number cvv_response avs_response response_code
- risk_score txn_amount txn_date
+ action reference_number cvv2_response avs_code response_code
+ risk_score txn_amount txn_date partial_auth partial_auth_amount
/);
$DEBUG = exists($options{debug}) ? $options{debug} : $DEBUG;
my @required_fields = qw/ Amount /;
if ($action eq 'charge') {
push @required_fields, $_
- foreach (qw/ AccountNumber Cvv ExpirationMonth ExpirationYear /);
+ foreach (qw/ AccountNumber ExpirationMonth ExpirationYear /);
}elsif ($action eq 'void') {
push @required_fields, $_
foreach (qw/ ReferenceNumber /);
$self->server_response($server_response);
# parse the result page.
$self->parse_response($page);
+
+ if ( $self->is_success && $self->response_code == 10 ) { #partial auth
+
+ if ( $self->partial_auth ) {
+
+ $self->partial_auth_amount( $self->txn_amount );
+
+ } else {
+
+ #XXX reverse auth if i was an auth only...
+ my $void = new Business::OnlinePayment(
+ 'vSecureProcessing',
+ map { $_ -> $self->$_() } qw( platform appid tid )
+ );
+
+ $void->content(
+ 'action' => 'Void',
+ 'amount' => $self->txn_amount,
+ 'test_transaction' => $self->test_transaction,
+ 'authorization' => $self->authorization,
+ map { $_ => $content{$_} } qw( login password card_number expiration )
+ );
+
+ $void->submit;
+
+ if ( !$void->is_success ) {
+ #XXX now what??? at least this is better than return is_success 0 or 1
+ die "Couldn't void partial auth";
+ } else {
+ $self->is_success(0);
+ }
+
+ }
+
+ }
if (!$self->is_success() && !$self->error_message() ) {
if ( $DEBUG ) {
warn "Response:\n".Dumper($response)."\n" if $DEBUG > 2;
$self->result_code($response->{Status}); # 0 /1
$self->response_code($response->{ResponseCode}); # see documentation for translation
- $self->avs_response($response->{AvsResponse}); # Y / N
- $self->cvv_response($response->{CvvResponse}); # P / F
+ $self->avs_code($response->{AvsResponse}); # Y / N
+
+ #weird (missing?) gateway responses turn into a hashref screwing up Card Fortress
+ $self->cvv2_response( $response->{CvvResponse} =~ /^\w$/
+ ? $response->{CvvResponse}
+ : ''
+ );
+
$self->txn_date($response->{TransactionDate}); # MMDDhhmmss
$self->txn_amount($response->{TransactionAmount} / 100); # 00000003500 / 100
$self->reference_number($response->{ReferenceNumber});
$self->is_success($self->result_code() eq '0' ? 1 : 0);
if ($self->is_success()) {
$self->authorization($response->{ReferenceNumber});
- }
- # fill in error_message if there is is an error
- if ( !$self->is_success && exists($response->{AdditionalResponseData})) {
- $self->error_message('Error '.$response->{ResponseCode}.': '.$response->{AdditionalResponseData});
- }elsif ( !$self->is_success && exists($response->{Receipt}) ) {
- $self->error_message('Error '.$response->{ResponseCode}.': '.(exists($response->{Receipt})) ? $response->{Receipt} : '');
+ } else { # fill in error_message if there is is an error
+ $self->error_message( 'Error '.$response->{ResponseCode}.': '.
+ ( $response->{AdditionalResponseData}
+ || $response->{Receipt}
+ || $response->{ResultCode}
+ )
+ );
}
} else {
- die 'Error communicating with vSecureProcessing server';
- return;
+ die 'Error communicating with vSecureProcessing server (server sent response: '. $self->server_response. ')';
}
}