Revision history for Perl extension Business::OnlinePayment::TransactionCentral.
+0.03 Sat May 19 15:03:43 PDT 2007
+ - add/finish ECHECK support (google of TCInterfaceGuide indicated
+ s/processcheck.asp/processcheckonline.asp/)
+ - fix another problem with transactions going through but coming back
+ denied: Returned "Auth" field can have trailing whitespace, wtf!
+ - trim "<html><body> </body></html>" tags off of return info. This
+ was preventing TransID (B:OP order_number) from being returned.
+ - add tests: order_number, check, bad_check
+
0.02 Thu Apr 19 17:48:09 PDT 2007
- updated example in manpage s/Capstone/TransactionCentral/
- add debugging methods response_page, response_code, response_headers
use vars qw($VERSION @ISA $DEBUG);
@ISA = qw(Business::OnlinePayment::HTTPS);
-$VERSION = '0.02';
+$VERSION = '0.03';
$DEBUG = 0;
sub set_defaults {
$content{'CCMonth'} = $month;
$content{'CCYear'} = $year;
- #push @required_fields, qw( amount card_numb
+ push @required_fields, qw( amount card_number expiration
+ name address zip
+ );
+
} elsif ( $action =~ /^\s*authorization\s*only\s*$/i ) {
croak "Authorizaiton Only is not supported by Transaction Central";
} elsif ( $action =~ /^\s*post\s*authorization\s*$/i ) {
croak "Unknown action $action";
}
- } elsif ( $content{'type'} =~ /^check$/i ) {
+ } elsif ( $content{'type'} =~ /^e?check$/i ) {
if ( $action =~ /^\s*normal\s*authorization\s*$/i ) {
- $url .= 'processcheck.asp';
+ $url .= 'processcheckonline.asp';
$content{'AccountNo'} = $content{'account_number'};
- $content{'TRANSTYPE'} = $content{'account_type'} =~ /^s/i ? 'SA' : 'CK';
+ $content{'TRANSTYPE'} =
+ ( exists($content{account_type}) && $content{account_type} =~ /^s/i )
+ ? 'SA'
+ : 'CK';
+
+ push @required_fields, qw( amount account_number routing_code
+ name
+ );
} elsif ( $action =~ /^\s*authorization\s*only\s*$/i ) {
croak "Authorizaiton Only is not supported by Transaction Central";
$self->path($url);
$self->content(%content);
+ $self->required_fields(@required_fields);
+
my @fields = qw(
MerchantID RegKey Amount REFID AccountNo CCMonth CCYear NameonAccount
AVSADDR AVSZIP CCRURL CVV2 USER1 USER2 USER3 USER4 TrackData
$self->response_page( $page );
$self->response_headers( \%reply_headers );
- warn "\n" if $DEBUG > 1;
- if ( $DEBUG > 2 ) {
- warn "response: $response\n";
- # warn "reply headers: ".
- # join(', ', map "$_ => $reply_headers{$_}", keys %reply_headers ). "\n";
- }
- warn "raw response: $page\n" if $DEBUG > 1;
+ #trim off <html><body> </body></html> around the response we want
+ $page =~ s/^[\s\n]*<html>[\s\n]*<body>[\s\n]*//;
+ $page =~ s/[\s\n]*<\/body>[\s\n]*<\/html>[\s\n]*$//;
my %return = map { /^(\w+)=(.*)$/ ? ( $1 => $2 ) : () } split(/&/, $page);
$self->avs_code( $return{'AVSCode'} );
$self->cvv2_response( $return{'CVV2ResponseMsg'} );
- if ( $return{'Auth'} =~ /^(\w+)$/ ) {
+ if ( $return{'Auth'} =~ /^\s*(\w+)\s*$/ ) {
$self->is_success(1);
$self->authorization( $return{'Auth'} );
=head1 SYNOPSIS
- use Business::OnlinePayment::TransactionCentral;
- blah blah blah
-
-=head1 DESCRIPTION
-
use Business::OnlinePayment;
####
} else {
print "Card was rejected: ".$tx->error_message."\n";
}
+=head1 DESCRIPTION
+
+This is a Business::OnlinePayment backend module for the Transaction Central
+(MerchantAnywhere, PRIMerchants) gateway. It is only useful if you have a
+merchant account with MerchantAnywhere / PRIMerchants:
+
+http://www.merchantanywhere.com/
+http://www.merchantanywhere.com/ecshop/TC_elink.htm
+
+http://www.primerchants.com/
+http://www.primerchants.com/info/transactioncentral.asp
=head1 SUPPORTED TRANSACTION TYPES
=head2 CC, Visa, MasterCard, American Express, Discover
-Content required: type, login, password, action, amount, card_number, expiration.
+Content required: type, login, password, action, amount, card_number, expiration, name, address, zip.
+
+=head2 ECHECK
+
+Content required: type, login, password, action, amount, account_number, routing_code, name
=head1 PREREQUISITES
URI::Escape
- #Tie::IxHash
Net::SSLeay _or_ ( Crypt::SSLeay and LWP )
=head1 NOTE
+The newest publicly available documentation is available at:
+
+http://www.merchantanywhere.com/ecshop/TC%20Interface%20NEW.pdf
+
+It is somewhat out-of-date and contains a few discrepancies. Google
+"TCInterfaceGuide" for current documentation.
+
=head1 AUTHOR
Ivan Kohler <ivan-transactioncentral@420.am>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2006 by Ivan Kohler
+Copyright (C) 2007 Freeside Internet Services, Inc.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
--- /dev/null
+BEGIN { $| = 1; print "1..1\n"; }
+
+#print "ok 1 # Skipped: testing account won't accept ACH transactions\n"; exit;
+
+#eval "use Net::SSLeay;";
+#if ( $@ ) {
+# print "ok 1 # Skipped: Net::SSLeay is not installed\n"; exit;
+#}
+
+use Business::OnlinePayment;
+
+my $ctx = new Business::OnlinePayment("TransactionCentral");
+
+$ctx->content(
+ type => 'ECHECK',
+ login => '10011',
+ password => 'KK48NPYEJHMAH6DK', #regkey
+ action => 'Normal Authorization',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ name => 'Tofu Beast',
+ account_number => '12345',
+ #routing_code => '026009593',
+ routing_code => 'bad_routing_code',
+ bank_name => 'First National Test Bank',
+ phone => '420-420-5454',
+ #payee => 'Tofu Heavy Enterprises, GmbH',
+ check_number => '420',
+);
+$ctx->test_transaction(1); # test, dont really charge
+$ctx->submit();
+
+#print $ctx->is_success()."\n";
+
+if($ctx->is_success()) {
+ #warn $ctx->error_message();
+ print "not ok 1 (".$ctx->error_message().")\n";
+} else {
+ print "ok 1\n";
+}
--- /dev/null
+BEGIN { $| = 1; print "1..1\n"; }
+
+use Business::OnlinePayment;
+
+my $ctx = Business::OnlinePayment->new("TransactionCentral");
+
+#$Business::OnlinePayment::TransactionCentral::DEBUG = 1;
+#$Business::OnlinePayment::TransactionCentral::DEBUG = 1;
+
+$ctx->content(
+ type => 'CHECK',
+ login => '10011',
+ password => 'KK48NPYEJHMAH6DK', #regkey
+ action => 'Normal Authorization',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ name => 'Tofu Beast',
+ account_number => '12345',
+ routing_code => '111000025', # BoA in Texas taken from Wikipedia
+ bank_name => 'First National Test Bank',
+ account_type => 'Checking',
+ license_num => '12345678',
+ license_state => 'OR',
+ license_dob => '1975-05-21',
+);
+$ctx->test_transaction(1); # test, dont really charge
+$ctx->submit();
+
+if($ctx->is_success()) {
+ print "ok 1\n";
+} else {
+ warn "error message : ". $ctx->error_message(). "\n";
+ warn "response code : ". $ctx->response_code(). "\n";
+ warn "response page : ". $ctx->response_page(). "\n";
+
+ print "not ok 1 (".$ctx->error_message().")\n";
+}
--- /dev/null
+BEGIN { $| = 1; print "1..1\n"; }
+
+eval "use Net::SSLeay;";
+if ( $@ ) {
+ print "ok 1 # Skipped: Net::SSLeay is not installed\n"; exit;
+}
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("TransactionCentral");
+
+#$Business::OnlinePayment::HTTPS::DEBUG = 1;
+#$Business::OnlinePayment::HTTPS::DEBUG = 1;
+#$Business::OnlinePayment::TransactionCentral::DEBUG = 1;
+#$Business::OnlinePayment::TransactionCentral::DEBUG = 1;
+
+$tx->content(
+ type => 'VISA',
+ login => '10011',
+ password => 'KK48NPYEJHMAH6DK', #regkey
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment::TransactionCentral test',
+ amount => '32',
+ card_number => '4012000000001',
+ expiration => '01/06',
+ cvv2 => '420',
+ name => 'Tofu Beast',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ country => 'US',
+ email => 'ivan-transactioncentral-test@420.am',
+);
+$tx->test_transaction(1); # test, dont really charge
+$tx->submit();
+
+if($tx->is_success() && $tx->order_number =~ /^(\w+)$/ ) {
+ print "ok 1\n";
+} else {
+ warn "order number: ". $tx->order_number."\n";
+ #warn $tx->error_message. "\n";
+ print "not ok 1\n";
+}
+