use vars qw($VERSION $DEBUG @ISA);
@ISA = qw(Business::OnlinePayment::HTTPS);
-$VERSION = '0.07';
+$VERSION = '0.08_01';
$DEBUG = 0;
sub set_defaults {
# => 'transaction_type',
#login => 'store_id',
#password => 'api_token',
+
#authorization =>
- #customer_ip =>
#name =>
#first_name =>
#last_name =>
#company =>
- #address =>
+ #address => 'avs_street_number'/'avs_street_name' handled below
#city =>
#state =>
- #zip =>
+ zip => 'avs_zipcode',
#country =>
- phone =>
+ phone => 'avs_custphone',
#fax =>
- email =>
+ email => 'avs_email',
+ customer_ip => 'avs_custip',
+
card_number => 'pan',
- #expiration =>
- # => 'expdate',
+ #expiration => 'expdate', #handled below
+ cvv2 => 'cvd_value',
'amount' => 'amount',
customer_id => 'cust_id',
order_number => 'order_id', # must be unique number
- authorization => 'txn_number' # reference to previous trans
-
- #cvv2 =>
+ authorization => 'txn_number', # reference to previous trans
);
my $action = $self->{_content}{'action'};
$month = '0'. $month if $month =~ /^\d$/;
$self->{_content}{expdate} = $year.$month;
+ #CVD Indicator
+ #0 = CVD value is deliberately bypassed or is not provided by the merchant
+ #1 = CVD value is present.
+ #2 = CVD value is on the card, but is illegible.
+ #9 = Cardholder states that the card has no CVD imprint.
+ $self->{_content}{cvd_indicator} = $self->{_content}{cvd_value} ? 1 : 0;
+
$self->generate_order_id;
$self->{_content}{order_id} .= '-'. ($invoice_number || 0);
}
+ if ( $self->{_content}{address} ) {
+ my $number = '';
+ my $name = $self->{_content}{address};
+ if ( $name =~ s/^\s*(\d+)\w\s+// ) {
+ $number = $1;
+ }
+ $name = substr( $name, 0, 19 - length($number) );
+ $self->{_content}{avs_street_number} = $number;
+ $self->{_content}{avs_street_name} = $name;
+ }
+
+ $self->{_content}{avs_zipcode} =~ s/\W//g
+ if defined $self->{_content}{avs_zipcode};
+
# E-Commerce Indicator (see eSelectPlus docs)
$self->{_content}{'crypt_type'} ||= 7;
'<store_id>'. $self->{_content}{'login'}. '</store_id>'.
'<api_token>'. $self->{_content}{'password'}. '</api_token>'.
"<$action>".
- join('', map "<$_>$fields{$_}</$_>", keys %fields ).
+ join('', map "<$_>$fields{$_}</$_>", keys %fields );
+
+ if ( $action =~ /^(purchase|preauth|ind_refund)$/ ) {
+ tie my %avs_fields, 'Tie::IxHash', $self->get_fields( $self->avs_fields );
+ $post_data .=
+ '<avs_info>'.
+ join('', map "<$_>$avs_fields{$_}</$_>", keys %avs_fields ).
+ '</avs_info>'
+ if grep $_, values %avs_fields;
+
+ tie my %cvd_fields, 'Tie::IxHash', $self->get_fields( $self->cvd_fields );
+ $post_data .=
+ '<cvd_info>'.
+ join('', map "<$_>$cvd_fields{$_}</$_>", keys %cvd_fields ).
+ '</cvd_info>'
+ if grep $_, values %cvd_fields;
+ }
+
+ $post_data .=
"</$action>".
'</request>';
);
}
+sub avs_fields {
+ my $self = shift;
+
+ #order is important to this processor
+ qw(
+ avs_street_number
+ avs_street_name
+ avs_zipcode
+ avs_email
+ avs_hostname
+ avs_browser
+ avs_shiptocountry
+ avs_shipmethod
+ avs_merchprodsku
+ avs_custip
+ avs_custphone
+ );
+}
+
+sub cvd_fields {
+ my $self = shift;
+
+ #order is important to this processor
+ qw(
+ cvd_indicator
+ cvd_value
+ );
+}
+
sub GetXMLProp {
my( $self, $raw, $prop ) = @_;
local $^W=0;