--- /dev/null
+package Business::OnlinePayment::StGeorge;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+use Carp qw(croak);
+use Business::OnlinePayment;
+
+@ISA = qw(Business::OnlinePayment);
+$VERSION = '0.01';
+
+use webpayperl; #webpayperl.pm from St.George
+
+sub set_defaults {
+ my $self = shift;
+
+ $self->server('www.gwipg.stgeorge.com.au');
+ $self->port('3006');
+
+ $self->build_subs(qw(order_number));
+
+}
+
+sub map_fields {
+ my($self) = @_;
+
+ my %content = $self->content();
+
+ #ACTION MAP
+ my %actions = ('normal authorization' => 'PURCHASE',
+ 'authorization only' => 'PREAUTH',
+ 'credit' => 'REFUND',
+ 'post authorization' => 'COMPLETION',
+ );
+ $content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
+
+ # TYPE MAP
+ my %types = ('cc' => 'CREDITCARD',
+ 'visa' => 'CREDITCARD',
+ 'mastercard' => 'CREDITCARD',
+ 'american express' => 'CREDITCARD',
+ 'discover' => 'CREDITCARD',
+ );
+ $content{'type'} = $types{lc($content{'type'})} || $content{'type'};
+ $self->transaction_type($content{'type'});
+
+ # stuff it back into %content
+ $self->content(%content);
+}
+
+sub build_subs {
+ my $self = shift;
+ foreach(@_) {
+ #no warnings; #not 5.005
+ local($^W)=0;
+ eval "sub $_ { my \$self = shift; if(\@_) { \$self->{$_} = shift; } return \$self->{$_}; }";
+ }
+}
+
+sub remap_fields {
+ my($self,%map) = @_;
+
+ my %content = $self->content();
+ foreach(keys %map) {
+ $content{$map{$_}} = $content{$_};
+ }
+ $self->content(%content);
+}
+
+sub revmap_fields {
+ my($self, %map) = @_;
+ my %content = $self->content();
+ foreach(keys %map) {
+# warn "$_ = ". ( ref($map{$_})
+# ? ${ $map{$_} }
+# : $content{$map{$_}} ). "\n";
+ $content{$_} = ref($map{$_})
+ ? ${ $map{$_} }
+ : $content{$map{$_}};
+ }
+ $self->content(%content);
+}
+
+sub get_fields {
+ my($self,@fields) = @_;
+
+ my %content = $self->content();
+ my %new = ();
+ foreach( grep defined $content{$_}, @fields) { $new{$_} = $content{$_}; }
+ return %new;
+}
+
+sub submit {
+ my($self) = @_;
+
+ $self->map_fields();
+
+ my %content = $self->content;
+
+ my $exp = '';
+ unless ( $content{action} eq 'STATUS' ) {
+
+ $content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
+ or croak "unparsable expiration $content{expiration}";
+
+ my( $month, $year ) = ( $1, $2 );
+ $month = '0'. $month if $month =~ /^\d$/;
+ $exp = "$month$year";
+
+ }
+
+ if ( $self->test_transaction) {
+ $self->port(3007);
+ }
+
+ my $terminal_type = 0;
+ $terminal_type = 4 if $content{'recurring_billing'};
+
+ $self->revmap_fields(
+ INTERFACE => 'type',
+ TRANSACTIONTYPE => 'action',
+ TOTALAMOUNT => 'amount',
+ #TAXAMOUNT
+ CARDDATA => 'card_number',
+ CARDEXPIRYDATE => \$exp,
+ #TXNREFERENCE
+ #ORIGINALTXNREF
+ #AUTHORISATIONNUMBER
+ CLIENTREF => 'customer_id',
+ COMMENT => 'invoice_number',
+ TERMINALTYPE => \$terminal_type,
+ CVC2 => 'cvv2',
+ );
+
+ my $action = $content{action};
+
+ if ( $action eq 'PURCHASE' || $action eq 'PREAUTH' ) {
+ $self->required_fields(qw/
+ login password
+ INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
+ /);
+ } elsif ( $action eq 'REFUND' ) {
+ $self->required_fields(qw/
+ login password
+ INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
+ ORIGINALTXNREF
+ /);
+ } elsif ( $action eq 'COMPLETION' ) {
+ $self->required_fields(qw/
+ login password
+ INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
+ AUTHORISATIONNUMBER
+ /);
+ } elsif ( $action eq 'STATUS' ) {
+ $self->required_fields(qw/
+ login password
+ TXNREFERENCE
+ /);
+ }
+
+ my %post = $self->get_fields(qw/
+ login password
+ INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
+ /);
+
+ # if ( $DEBUG ) { warn "$_ => $post{$_}\n" foreach keys %post; }
+
+ webpayperl::init_client or croak "St.George initialization failed\n";
+ #dd this to all exit places after here
+ #webpayperl::cleanup( $webpayRef );
+
+ my $webpayRef = webpayperl::newBundle;
+ webpayperl::addVersionInfo($webpayRef);
+ webpayperl::put($webpayRef, "DEBUG", "OFF");
+ #webpayperl::put($webpayRef, "LOGFILE", "webpay.log");
+ webpayperl::put_ClientID ( $webpayRef, delete $post{'login'} );
+ webpayperl::put_CertificatePath ( $webpayRef, $self->cert_path );
+ webpayperl::put_CertificatePassword( $webpayRef, delete $post{'password'} );
+ webpayperl::setPort ( $webpayRef, $self->port );
+ webpayperl::setServers ( $webpayRef, $self->server );
+
+ foreach my $key ( keys %post ) {
+ warn "$key undefined" unless defined($post{$key});
+ webpayperl::put($webpayRef, $key, $post{$key} );
+ }
+
+ my $tranProcessed = webpayperl::execute( $webpayRef );
+ unless ( $tranProcessed ) {
+ #St.George error handling is bunk
+ $self->is_success(0);
+ $self->error_message( webpayperl::get( $webpayRef, "ERROR").
+ ' (transaction reference: '.
+ webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
+ ')'
+ );
+
+ webpayperl::cleanup( $webpayRef );
+ webpayperl::free_client();
+ return;
+ }
+
+ my $responseCode = webpayperl::get( $webpayRef, "RESPONSECODE");
+ $self->result_code($responseCode);
+
+ if ( grep { $responseCode eq $_ } qw( 00 08 77 ) ) {
+ $self->is_success(1);
+ $self->authorization(webpayperl::get( $webpayRef, "AUTHCODE"));
+ $self->order_number(webpayperl::get( $webpayRef, "TXNREFERENCE"));
+ } else {
+ $self->is_success(0);
+ $self->error_message( webpayperl::get( $webpayRef, "RESPONSETEXT"). ' - '.
+ webpayperl::get( $webpayRef, "ERROR").
+ ' (transaction reference: '.
+ webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
+ ')'
+ );
+ }
+
+ webpayperl::cleanup( $webpayRef );
+ webpayperl::free_client();
+
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::StGeorge - St.George Bank backend for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment;
+
+ my $tx = new Business::OnlinePayment( 'StGeorge',
+ 'cert_path' => '/home/StGeorge/client.cert',
+ );
+
+ $tx->content(
+ login => '10000000', #The Client ID issued to you
+ password => 'w0rd', #The password protecting your certificate file
+ type => 'VISA',
+ action => 'Normal Authorization',
+ description => 'Business::OnlinePayment test',
+ amount => '49.95',
+ invoice_number => '100100',
+ customer_id => 'jsk',
+ name => 'Jason Kohles',
+ address => '123 Anystreet',
+ city => 'Anywhere',
+ state => 'UT',
+ zip => '84058',
+ email => 'ivan-stgeorge@420.am',
+ card_number => '4007000000027',
+ expiration => '09/99',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->authorization."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+=head1 SUPPORTED TRANSCTION TYPES
+
+=head2 CC, Visa, MasterCard, American Express, Discover
+
+=head1 DESCRIPTION
+
+For detailed information see L<Business::OnlinePayment>.
+
+=head1 COMPATIBILITY
+
+This module implements an interface to the St. George Bank Internet Payment
+Gateway Perl API.
+
+https://www.ipg.stgeorge.com.au/
+
+This module has been developed against webpayPerl version 2.8
+
+=head1 BUGS
+
+=head1 AUTHOR
+
+Ivan Kohler <ivan-stgeorge@420.am>
+
+Based on Busienss::OnlinePayment::AuthorizeNet written by Jason Kohles.
+
+=head1 SEE ALSO
+
+perl(1), L<Business::OnlinePayment>.
+
+=cut
+