X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=InternetSecure.pm;h=c70b79f89d9c4ebcddb026e98ba438ae6d04fd34;hb=c205128a87a645f3e65be5f58ca04e124d56e9b2;hp=964eb9e2e5a872626e8a5cd07b5547517431d503;hpb=4b7a5ee304316798c4ad690dbadbcf5f0fe125fa;p=Business-OnlinePayment-InternetSecure.git diff --git a/InternetSecure.pm b/InternetSecure.pm index 964eb9e..c70b79f 100755 --- a/InternetSecure.pm +++ b/InternetSecure.pm @@ -18,8 +18,9 @@ our $VERSION = '0.01'; use constant CARD_TYPES => { VI => 'Visa', MC => 'MasterCard', - AX => 'American Express', + AX => 'American Express', # FIXME: AM? NN => 'Discover', + # JB? }; @@ -37,12 +38,24 @@ sub set_defaults { $self->build_subs(qw( receipt_number sales_order_number - cardholder card_type + card_type total_amount avs_response cvv2_response )); } +# OnlinePayment's get_fields now filters out undefs in 3.x. :( +# +sub get_fields { + my ($self, @fields) = @_; + + my %content = $self->content; + + my %new = map +($_ => $content{$_}), @fields; + + return %new; +} + # OnlinePayment's remap_fields is buggy, so we simply rewrite it # sub remap_fields { @@ -63,10 +76,6 @@ sub get_remap_fields { $self->remap_fields(reverse %map); my %data = $self->get_fields(keys %map); - foreach (values %data) { - $_ = '' unless defined; - } - return %data; } @@ -79,13 +88,13 @@ sub parse_expdate { my ($y, $m); - if (/^(\d{4})\W(\d{1,2})$/ || # 2004.07 or 2004-7 - /^(\d\d)\W(\d)$/ || # 04/7 - /^(\d\d)[.-](\d\d)$/) { # 04-07 + if (/^(\d{4})\W(\d{1,2})$/ || # YYYY.MM or YYYY-M + /^(\d\d)\W(\d)$/ || # YY/M or YY-M + /^(\d\d)[.-](\d\d)$/) { # YY-MM ($y, $m) = ($1, $2); - } elsif (/^(\d{1,2})\W(\d{4})$/ || # 07-2004 or 7/2004 - /^(\d)\W(\d\d)$/ || # 7/04 - /^(\d\d)\/?(\d\d)$/) { # 07/04 or 0704 + } elsif (/^(\d{1,2})\W(\d{4})$/ || # MM-YYYY or M/YYYY + /^(\d)\W(\d\d)$/ || # M/YY or M-YY + /^(\d\d)\/?(\d\d)$/) { # MM/YY or MMYY ($y, $m) = ($2, $1); } else { croak "Unable to parse expiration date: $str"; @@ -149,7 +158,7 @@ sub to_xml { $content{taxes} = uc $content{taxes}; my %data = $self->get_remap_fields(qw( - xxxCardNumber card_number + xxxCard_Number card_number xxxName name xxxCompany company @@ -174,7 +183,8 @@ sub to_xml { $data{MerchantNumber} = $self->merchant_id; - $data{xxxCardNumber} =~ tr/ //d; + $data{xxxCard_Number} =~ tr/ //d; + $data{xxxCard_Number} =~ s/^[0-36-9]/4/ if $self->test_transaction; my ($y, $m) = $self->parse_expdate($content{exp_date}); $data{xxxCCYear} = sprintf '%.4u' => $y; @@ -207,6 +217,7 @@ sub to_xml { xml_out(\%data, NoAttr => 1, RootName => 'TranxRequest', + SuppressEmpty => undef, XMLDecl => '', ); } @@ -230,9 +241,6 @@ sub parse_response { $self->server_response($response); - # (It's not quite clear whether there should be some decoding, or if - # the result is already utf8.) - $response = xml_in($response, ForceArray => [qw(product flag)], GroupTags => { qw(Products product flags flag) }, @@ -246,7 +254,6 @@ sub parse_response { $self->infuse($response, qw( ReceiptNumber receipt_number SalesOrderNumber sales_order_number - xxxName cardholder CardType card_type Page result_code ApprovalCode authorization @@ -256,6 +263,9 @@ sub parse_response { CVV2ResponseCode cvv2_response )); + # Completely undocumented field that sometimes override + $self->error_message($response->{Error}) if $response->{Error}; + $self->card_type(CARD_TYPES->{$self->card_type}); $self->{products_raw} = $response->{Products}; @@ -342,7 +352,7 @@ Business::OnlinePayment::InternetSecure - InternetSecure backend for Business::O Business::OnlinePayment::InternetSecure is an implementation of L that allows for processing online credit card -payments through Internet Secure. +payments through InternetSecure. See L for more information about the generic Business::OnlinePayment interface. @@ -351,7 +361,7 @@ Business::OnlinePayment interface. Object creation is done via L; see its manpage for details. The I processor option is required, and corresponds -to the merchant ID assigned to you by Internet Secure. +to the merchant ID assigned to you by InternetSecure. =head1 METHODS @@ -394,23 +404,24 @@ Transaction type, being one of the following: =item card_number (required) -Credit card number. Any spaces will be removed. +Credit card number. Spaces are allowed, and will be automatically removed. =item exp_date (required) -Credit card expiration date. Since L does not -specify any syntax, this module is rather lax in what it will accept. It is -recommended to use either I or I, to avoid any nasty -surprises. +Credit card expiration date. Since L does not specify +any syntax, this module is rather lax regarding what it will accept. The +recommended syntax is I, but forms such as I or I are +allowed as well. =item cvv2 Three- or four-digit verification code printed on the card. This can be left blank or undefined, in which case no check will be performed. Whether or not a -transaction will be declined in case of a mismatch depends on the merchant. +transaction will be declined in case of a mismatch depends on the merchant +account configuration. This number may be called Card Verification Value (CVV2), Card Validation -Code (CVC2) or Card Identification number (CID). +Code (CVC2) or Card Identification number (CID), depending on the card issuer. =item description @@ -427,21 +438,20 @@ L<"Products list syntax">. =item currency Currency of all amounts for this order. This can currently be either -C (default) or C. +C (default) or C. =item taxes Taxes to be added automatically. These should not be included in B; -they will be added by Internet Secure later on. +they will be automatically added by InternetSecure later on. -Available taxes are C, C and C; multiple taxes must be -separated by spaces. +Available taxes are C, C and C. Taxes can be combined by +separating them with spaces, such as C. =item name / company / address / city / state / zip / country / phone / email -Facultative customer information. B should be either a postal -abbreviation or a two-letter code taken from ISO 3166-2, and B should -be a two-letter code taken from in ISO 3166-1. +Customer information. B should be a two-letter code taken from ISO +3166-1. =back @@ -459,11 +469,6 @@ Receipt number and sales order number of submitted order. Total amount billed for this order, including taxes. -=item cardholder() - -Cardholder's name. This is currently a mere copy of the B field passed -to B. - =item card_type() Type of the credit card used for the submitted order, being one of the @@ -483,9 +488,14 @@ following: =item avs_response() / cvv2_response() -Results of the AVS and CVV2 checks. See the Internet Secure documentation for +Results of the AVS and CVV2 checks. See the InternetSecure documentation for the list of possible values. +=item products_raw() + +... + + =back @@ -506,7 +516,7 @@ Unit price of this product. =item quantity -Ordered quantity of this product. This can be a decimal value. +Ordered quantity of this product. =item sku @@ -527,14 +537,17 @@ When using a products list, the B field passed to B should be left undefined. -=head2 Character encodings - -... +=head2 Character encoding +Since communication to/from InternetSecure is encoded with UTF-8, all Unicode +characters are theoretically available when submitting information via +B. (Further restrictions may be imposed by InternetSecure itself.) -=head2 products_raw - -... +When using non-ASCII characters, all data provided to B should either +be in the current native encoding (typically latin-1, unless it was modified +via the C pragma), or be decoded via the C module. +Conversely, all data returned after calling B will be automatically +decoded. =head1 EXPORT @@ -548,11 +561,11 @@ L =head1 AUTHOR -Frederic Briere, Efbriere@fbriere.netE +Frédéric Brière, Efbriere@fbriere.netE =head1 COPYRIGHT AND LICENSE -Copyright (C) 2004 by Frederic Briere +Copyright (C) 2006 by Frédéric Brière This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.4 or,