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
16 $self->server('www.gwipg.stgeorge.com.au');
19 $self->build_subs(qw(order_number));
26 my %content = $self->content();
29 my %actions = ('normal authorization' => 'PURCHASE',
30 'authorization only' => 'PREAUTH',
32 'post authorization' => 'COMPLETION',
34 $content{'action'} = $actions{lc($content{'action'})} || $content{'action'};
37 my %types = ('cc' => 'CREDITCARD',
38 'visa' => 'CREDITCARD',
39 'mastercard' => 'CREDITCARD',
40 'american express' => 'CREDITCARD',
41 'discover' => 'CREDITCARD',
43 $content{'type'} = $types{lc($content{'type'})} || $content{'type'};
44 $self->transaction_type($content{'type'});
46 # stuff it back into %content
47 $self->content(%content);
53 #no warnings; #not 5.005
55 eval "sub $_ { my \$self = shift; if(\@_) { \$self->{$_} = shift; } return \$self->{$_}; }";
62 my %content = $self->content();
64 $content{$map{$_}} = $content{$_};
66 $self->content(%content);
71 my %content = $self->content();
73 # warn "$_ = ". ( ref($map{$_})
75 # : $content{$map{$_}} ). "\n";
76 $content{$_} = ref($map{$_})
80 $self->content(%content);
84 my($self,@fields) = @_;
86 my %content = $self->content();
88 foreach( grep defined $content{$_}, @fields) { $new{$_} = $content{$_}; }
97 my %content = $self->content;
100 unless ( $content{action} eq 'STATUS' ) {
102 $content{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
103 or croak "unparsable expiration $content{expiration}";
105 my( $month, $year ) = ( $1, $2 );
106 $month = '0'. $month if $month =~ /^\d$/;
107 $exp = "$month$year";
111 if ( $self->test_transaction) {
115 my $terminal_type = 0;
116 $terminal_type = 4 if $content{'recurring_billing'};
118 $self->revmap_fields(
120 TRANSACTIONTYPE => 'action',
121 TOTALAMOUNT => 'amount',
123 CARDDATA => 'card_number',
124 CARDEXPIRYDATE => \$exp,
128 CLIENTREF => 'customer_id',
129 COMMENT => 'invoice_number',
130 TERMINALTYPE => \$terminal_type,
134 my $action = $content{action};
136 if ( $action eq 'PURCHASE' || $action eq 'PREAUTH' ) {
137 $self->required_fields(qw/
139 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
141 } elsif ( $action eq 'REFUND' ) {
142 $self->required_fields(qw/
144 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
147 } elsif ( $action eq 'COMPLETION' ) {
148 $self->required_fields(qw/
150 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
153 } elsif ( $action eq 'STATUS' ) {
154 $self->required_fields(qw/
160 my %post = $self->get_fields(qw/
162 INTERFACE TRANSACTIONTYPE TOTALAMOUNT CARDDATA CARDEXPIRYDATE
165 # if ( $DEBUG ) { warn "$_ => $post{$_}\n" foreach keys %post; }
167 webpayperl::init_client or croak "St.George initialization failed\n";
168 #dd this to all exit places after here
169 #webpayperl::cleanup( $webpayRef );
171 my $webpayRef = webpayperl::newBundle;
172 webpayperl::addVersionInfo($webpayRef);
173 webpayperl::put($webpayRef, "DEBUG", "OFF");
174 #webpayperl::put($webpayRef, "LOGFILE", "webpay.log");
175 webpayperl::put_ClientID ( $webpayRef, delete $post{'login'} );
176 webpayperl::put_CertificatePath ( $webpayRef, $self->cert_path );
177 webpayperl::put_CertificatePassword( $webpayRef, delete $post{'password'} );
178 webpayperl::setPort ( $webpayRef, $self->port );
179 webpayperl::setServers ( $webpayRef, $self->server );
181 foreach my $key ( keys %post ) {
182 warn "$key undefined" unless defined($post{$key});
183 webpayperl::put($webpayRef, $key, $post{$key} );
186 my $tranProcessed = webpayperl::execute( $webpayRef );
187 unless ( $tranProcessed ) {
188 #St.George error handling is bunk
189 $self->is_success(0);
190 $self->error_message( webpayperl::get( $webpayRef, "ERROR").
191 ' (transaction reference: '.
192 webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
196 webpayperl::cleanup( $webpayRef );
197 webpayperl::free_client();
201 my $responseCode = webpayperl::get( $webpayRef, "RESPONSECODE");
202 $self->result_code($responseCode);
204 if ( grep { $responseCode eq $_ } qw( 00 08 77 ) ) {
205 $self->is_success(1);
206 $self->authorization(webpayperl::get( $webpayRef, "AUTHCODE"));
207 $self->order_number(webpayperl::get( $webpayRef, "TXNREFERENCE"));
209 $self->is_success(0);
210 $self->error_message( webpayperl::get( $webpayRef, "RESPONSETEXT"). ' - '.
211 webpayperl::get( $webpayRef, "ERROR").
212 ' (transaction reference: '.
213 webpayperl::get( $webpayRef, 'TXNREFERENCE' ).
218 webpayperl::cleanup( $webpayRef );
219 webpayperl::free_client();
228 Business::OnlinePayment::StGeorge - St.George Bank backend for Business::OnlinePayment
232 use Business::OnlinePayment;
234 my $tx = new Business::OnlinePayment( 'StGeorge',
235 'cert_path' => '/home/StGeorge/client.cert',
239 login => '10000000', #The Client ID issued to you
240 password => 'w0rd', #The password protecting your certificate file
242 action => 'Normal Authorization',
243 description => 'Business::OnlinePayment test',
245 invoice_number => '100100',
246 customer_id => 'jsk',
247 name => 'Jason Kohles',
248 address => '123 Anystreet',
252 email => 'ivan-stgeorge@420.am',
253 card_number => '4007000000027',
254 expiration => '09/99',
258 if($tx->is_success()) {
259 print "Card processed successfully: ".$tx->authorization."\n";
261 print "Card was rejected: ".$tx->error_message."\n";
264 =head1 SUPPORTED TRANSCTION TYPES
266 =head2 CC, Visa, MasterCard, American Express, Discover
270 For detailed information see L<Business::OnlinePayment>.
274 This module implements an interface to the St. George Bank Internet Payment
277 https://www.ipg.stgeorge.com.au/
279 This module has been developed against webpayPerl version 2.8
285 Ivan Kohler <ivan-stgeorge@420.am>
287 Based on Busienss::OnlinePayment::AuthorizeNet written by Jason Kohles.
291 perl(1), L<Business::OnlinePayment>.