X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=InternetSecure.pm;h=61e210b69a4aa5d1fe0fa0dbcb43ec527388eb76;hb=aee9564f2cae2cd7b63aba4d52105dbf24422bae;hp=f3eacc892d2b5a2a9ff3d909c88ab536ae653695;hpb=f30cb431188e85c2b03dd16a3f9b3cc8c901d2ed;p=Business-OnlinePayment-InternetSecure.git diff --git a/InternetSecure.pm b/InternetSecure.pm index f3eacc8..61e210b 100755 --- a/InternetSecure.pm +++ b/InternetSecure.pm @@ -18,11 +18,11 @@ our $VERSION = '0.01'; use constant SUCCESS_CODES => qw(2000 90000 900P1); use constant CARD_TYPES => { - VI => 'Visa', + AM => 'American Express', + JB => 'JCB', MC => 'MasterCard', - AX => 'American Express', # FIXME: AM? NN => 'Discover', - # JB? + VI => 'Visa', }; @@ -42,12 +42,12 @@ sub set_defaults { receipt_number sales_number uuid guid date card_type cardholder - total_amount taxes + total_amount tax_amounts avs_response cvv2_response )); - # Just in case someone tries to call taxes() *before* submit() - $self->taxes( {} ); + # Just in case someone tries to call tax_amounts() *before* submit() + $self->tax_amounts( {} ); } # OnlinePayment's get_fields now filters out undefs in 3.x. :( @@ -62,6 +62,18 @@ sub get_fields { return %new; } +# OnlinePayment's remap_fields is buggy in 2.x; this is copied from 3.x +# +sub remap_fields { + my ($self, %map) = @_; + + my %content = $self->content(); + foreach (keys %map) { + $content{$map{$_}} = delete $content{$_}; + } + $self->content(%content); +} + # Combine get_fields and remap_fields for convenience # sub get_remap_fields { @@ -142,9 +154,10 @@ sub to_xml { $self->required_fields(qw(action card_number exp_date)); - croak 'Unsupported transaction type' - if $content{type} && $content{type} !~ - /^(Visa|MasterCard|American Express|Discover)$/i; + croak "Unsupported transaction type: $content{type}" + if $content{type} && + ! grep lc($content{type}) eq lc($_), + values %{+CARD_TYPES}; croak 'Unsupported action' unless $content{action} =~ /^Normal Authori[zs]ation$/i; @@ -210,13 +223,14 @@ sub to_xml { ); } - xml_out(\%data, + # The encode() makes sure to a) strip off non-Latin-1 characters, and + # b) turn off the utf8 flag, which confuses XML::Simple + encode('ISO-8859-1', xml_out(\%data, NoAttr => 1, - NumericEscape => 2, RootName => 'TranxRequest', SuppressEmpty => undef, XMLDecl => '', - ); + )); } # Map the various fields from the response, and put their values into our @@ -231,10 +245,10 @@ sub infuse { } } -sub extract_taxes { +sub extract_tax_amounts { my ($self, $response) = @_; - my %taxes; + my %tax_amounts; my $products = $response->{Products}; return unless $products; @@ -245,11 +259,11 @@ sub extract_taxes { grep($_ eq '{TAX}', @$flags) && grep($_ eq '{CALCULATED}', @$flags)) { - $taxes{ $node->{code} } = $node->{subtotal}; + $tax_amounts{ $node->{code} } = $node->{subtotal}; } } - return %taxes; + return %tax_amounts; } # Parse the server's response and set various fields @@ -296,7 +310,7 @@ sub parse_response { $self->card_type(CARD_TYPES->{$self->card_type}); - $self->taxes( { $self->extract_taxes($response) } ); + $self->tax_amounts( { $self->extract_tax_amounts($response) } ); return $self; } @@ -424,6 +438,8 @@ Transaction type, being one of the following: =item - Discover +=item - JCB + =back (This is actually ignored for the moment, and can be left blank or undefined.) @@ -544,10 +560,11 @@ Date and time of the transaction. Format is C. Total amount billed for this order, including taxes. -=item taxes() +=item tax_amounts() -Returns a I to a hash that maps tax names (such as C) to the -amount that was billed for each. +Returns a I to a hash that maps taxes, which were listed under the +B argument to B(), to the amount that was calculated by +InternetSecure. =item cardholder() @@ -569,6 +586,8 @@ following: =item - Discover +=item - JCB + =back @@ -586,7 +605,7 @@ the following fields: =over 4 -=item amount +=item amount (required) Unit price of this product. @@ -615,15 +634,13 @@ be left undefined. =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.) +When using non-ASCII characters, all data provided to B() should +have been decoded beforehand via the C module, unless your data is in +ISO-8859-1 and you haven't meddled with the C pragma. (Please +don't.) -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. +InternetSecure currently does not handle characters outside of ISO-8859-1, so +these will be replaced with C before being transmitted. =head1 EXPORT