1 package Business::OnlinePayment::StGeorge;
4 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6 use Business::OnlinePayment;
8 @ISA = qw(Business::OnlinePayment);
11 use webpayperl; #webpayperl.pm from St.George
12 webpayperl::init_client or croak "St.George initialization failed\n";
17 $self->server('www.gwipg.stgeorge.com.au');
20 $self->build_subs(qw(order_number));
27 my %content = $self->content();
30 my %actions = ('normal authorization' => 'PURCHASE',
31 'authorization only' => 'PREAUTH',
33 'post authorization' => 'COMPLETION',
35 $content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
38 my %types = ('cc' => 'CREDITCARD',
39 'visa' => 'CREDITCARD',
40 'mastercard' => 'CREDITCARD',
41 'american express' => 'CREDITCARD',
42 'discover' => 'CREDITCARD',
44 $content{'type'} = $types{lc($content{'type'})} || $content{'type'};
45 $self->transaction_type($content{'type'});
47 # stuff it back into %content
48 $self->content(%content);
54 #no warnings; #not 5.005
56 eval "sub $_ { my \$self = shift; if(\@_) { \$self->{$_} = shift; } return \$self->{$_}; }";
63 my %content = $self->content();
65 $content{$map{$_}} = $content{$_};
67 $self->content(%content);
72 my %content = $self->content();
74 # warn "$_ = ". ( ref($map{$_})
76 # : $content{$map{$_}} ). "\n";
77 $content{$_} = ref($map{$_})
81 $self->content(%content);
85 my($self,@fields) = @_;
87 my %content = $self->content();
89 foreach( grep defined $content{$_}, @fields) { $new{$_} = $content{$_}; }
98 my %content = $self->content;
101 unless ( $content{action} eq 'STATUS' ) {
103 $content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
104 or croak "unparsable expiration $content{expiration}";
106 my( $month, $year ) = ( $1, $2 );
107 $month = '0'. $month if $month =~ /^\d$/;
108 $exp = "$month$year";
112 if ( $self->test_transaction) {
116 my $terminal_type = 0;
117 $terminal_type = 4 if $content{'recurring_billing'};
119 $self->revmap_fields(
121 TRANSACTIONTYPE => 'action',
122 TOTALAMOUNT => 'amount',
124 CARDDATA => 'card_number',
125 CARDEXPIRYDATE => \$exp,
129 CLIENTREF => 'customer_id',
130 COMMENT => 'invoice_number',
131 TERMINALTYPE => \$terminal_type,
135 my $action = $content{action};
137 if ( $action eq 'PURCHASE' || $action eq 'PREAUTH' ) {
138 $self->required_fields(qw/
140 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
142 } elsif ( $action eq 'REFUND' ) {
143 $self->required_fields(qw/
145 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
148 } elsif ( $action eq 'COMPLETION' ) {
149 $self->required_fields(qw/
151 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
154 } elsif ( $action eq 'STATUS' ) {
155 $self->required_fields(qw/
161 my %post = $self->get_fields(qw/
163 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
166 # if ( $DEBUG ) { warn "$_ => $post{$_}\n" foreach keys %post; }
168 my $webpayRef = webpayperl::newBundle;
169 webpayperl::addVersionInfo($webpayRef);
170 webpayperl::put($webpayRef, "DEBUG", "OFF");
171 #webpayperl::put($webpayRef, "LOGFILE", "webpay.log");
172 webpayperl::put_ClientID ( $webpayRef, delete $post{'login'} );
173 webpayperl::put_CertificatePath ( $webpayRef, $self->cert_path );
174 webpayperl::put_CertificatePassword( $webpayRef, delete $post{'password'} );
175 webpayperl::setPort ( $webpayRef, $self->port );
176 webpayperl::setServers ( $webpayRef, $self->server );
178 foreach my $key ( keys %post ) {
179 warn "$key undefined" unless defined($post{$key});
180 webpayperl::put($webpayRef, $key, $post{$key} );
183 my $tranProcessed = webpayperl::execute( $webpayRef );
184 unless ( $tranProcessed ) {
185 #St.George error handling is bunk
186 $self->is_success(0);
187 $self->error_message( webpayperl::get( $webpayRef, "ERROR").
188 ' (transaction reference: '.
189 webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
193 webpayperl::cleanup( $webpayRef );
197 my $responseCode = webpayperl::get( $webpayRef, "RESPONSECODE");
198 $self->result_code($responseCode);
200 if ( grep { $responseCode eq $_ } qw( 00 08 77 ) ) {
201 $self->is_success(1);
202 $self->authorization(webpayperl::get( $webpayRef, "AUTHCODE"));
203 $self->order_number(webpayperl::get( $webpayRef, "TXNREFERENCE"));
205 $self->is_success(0);
206 $self->error_message( webpayperl::get( $webpayRef, "RESPONSETEXT"). ' - '.
207 webpayperl::get( $webpayRef, "ERROR").
208 ' (transaction reference: '.
209 webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
214 webpayperl::cleanup( $webpayRef );
219 webpayperl::free_client();
227 Business::OnlinePayment::StGeorge - St.George Bank backend for Business::OnlinePayment
231 use Business::OnlinePayment;
233 my $tx = new Business::OnlinePayment( 'StGeorge',
234 'cert_path' => '/home/StGeorge/client.cert',
238 login => '10000000', #The Client ID issued to you
239 password => 'w0rd', #The password protecting your certificate file
241 action => 'Normal Authorization',
242 description => 'Business::OnlinePayment test',
244 invoice_number => '100100',
245 customer_id => 'jsk',
246 name => 'Jason Kohles',
247 address => '123 Anystreet',
251 email => 'ivan-stgeorge@420.am',
252 card_number => '4007000000027',
253 expiration => '09/99',
257 if($tx->is_success()) {
258 print "Card processed successfully: ".$tx->authorization."\n";
260 print "Card was rejected: ".$tx->error_message."\n";
263 =head1 SUPPORTED TRANSCTION TYPES
265 =head2 CC, Visa, MasterCard, American Express, Discover
269 For detailed information see L<Business::OnlinePayment>.
273 This module implements an interface to the St. George Bank Internet Payment
276 https://www.ipg.stgeorge.com.au/
278 This module has been developed against webpayPerl version 2.8
284 Ivan Kohler <ivan-stgeorge@420.am>
286 Based on Busienss::OnlinePayment::AuthorizeNet written by Jason Kohles.
290 perl(1), L<Business::OnlinePayment>.