initial import BUSINESS_ONLINEPAYMENT_STGEORGE_0_01 START
authorivan <ivan>
Sat, 1 May 2004 09:34:09 +0000 (09:34 +0000)
committerivan <ivan>
Sat, 1 May 2004 09:34:09 +0000 (09:34 +0000)
Changes [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
Makefile.PL [new file with mode: 0644]
README [new file with mode: 0644]
StGeorge.pm [new file with mode: 0644]
t/bop.t [new file with mode: 0644]
t/load.t [new file with mode: 0644]
t2/bad_auth.t [new file with mode: 0644]
t2/credit_card.t [new file with mode: 0644]

diff --git a/Changes b/Changes
new file mode 100644 (file)
index 0000000..ff725b1
--- /dev/null
+++ b/Changes
@@ -0,0 +1,4 @@
+Revision history for Perl extension Business::OnlinePayment::StGeorge.
+
+0.01  Sat Jan 31 02:43:20 PST 2004
+       - original version; created by ivan 1.0
diff --git a/MANIFEST b/MANIFEST
new file mode 100644 (file)
index 0000000..ba825d8
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,11 @@
+StGeorge.pm
+Changes
+MANIFEST
+Makefile.PL
+README
+t/bop.t
+t/load.t
+t2/credit_card.t
+t2/bad_auth.t
+#t2/check.t
+#t2/capture.t
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644 (file)
index 0000000..746c961
--- /dev/null
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+    'NAME'         => 'Business::OnlinePayment::StGeorge',
+    'VERSION_FROM' => 'StGeorge.pm', # finds $VERSION
+    'AUTHOR'       => 'Ivan Kohler <ivan-stgeorge@420.am>',
+    'PREREQ_PM'    => { 'Business::OnlinePayment' => 0, },
+    #'NORECURS'     => 1, # dont descend into subdirectories
+    #'test'         => { 'TESTS' => 't*/*.t' },
+);
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..90d257b
--- /dev/null
+++ b/README
@@ -0,0 +1,24 @@
+Copyright (c) 2004 Ivan Kohler
+All rights reserved. This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+This is Business::OnlinePayment::StGeorge, an Business::OnlinePayment
+backend module for the St.George Bank Internet Payment Gateway.  It is only
+useful if you have a merchant account with St.George Bank:
+https://www.ipg.stgeorge.com.au/ and their "Perl API".
+
+It is (rather distantly, at this point) based on
+Business::OnlinePayment::AuthorizeNet written by Jason Kohles.
+
+There are additional tests in t2/ that may be useful to you once you have
+a merchant account and the digital certificate from St. George.
+
+Ivan Kohler <ivan-stgeorge@420.am>
+
+Please send patches as unified diffs (diff -u).
+
+Business::OnlinePayment is a generic interface for processing payments through
+online credit card processors, online check acceptance houses, etc.  (If you
+like buzzwords, call it an "multiplatform ecommerce-enabling middleware
+solution").
+
diff --git a/StGeorge.pm b/StGeorge.pm
new file mode 100644 (file)
index 0000000..cea459c
--- /dev/null
@@ -0,0 +1,294 @@
+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
+
diff --git a/t/bop.t b/t/bop.t
new file mode 100644 (file)
index 0000000..64332c5
--- /dev/null
+++ b/t/bop.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment;
+$loaded = 1;
+print "ok 1\n";
diff --git a/t/load.t b/t/load.t
new file mode 100644 (file)
index 0000000..a90f99c
--- /dev/null
+++ b/t/load.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Business::OnlinePayment::StGeorge;
+$loaded = 1;
+print "ok 1\n";
diff --git a/t2/bad_auth.t b/t2/bad_auth.t
new file mode 100644 (file)
index 0000000..8e49e67
--- /dev/null
@@ -0,0 +1,42 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("StGeorge",
+#  'cert_path'   => './java.cert',
+  'cert_path'   => '/home/ivan/Business-OnlinePayment-StGeorge/t2/java.cert',
+);
+
+$tx->content(
+    login          => '10005432',
+    password       => 'certphrase',
+    type           => 'CC',
+    action         => 'Normal Authorization',
+    description    => 'Business::OnlinePayment::LinkPoint visa test',
+    amount         => '1.51',
+    first_name     => 'Tofu',
+    last_name      => 'Beast',
+    address        => '123 Anystreet',
+    city           => 'Anywhere',
+    state          => 'UT',
+    zip            => '84058',
+    country        => 'US',
+    email          => 'ivan-stgeorge@420.am',
+    card_number    => '5430489999999992',
+    expiration     => '12/2005',
+);
+
+$tx->test_transaction(1);
+
+$tx->submit();
+
+if($tx->is_success()) {
+    print "not ok 1\n";
+    $auth = $tx->authorization;
+    warn "********* $auth ***********\n";
+} else {
+    print "ok 1\n";
+    warn '***** '. $tx->error_message. " *****\n";
+    exit;
+}
+
diff --git a/t2/credit_card.t b/t2/credit_card.t
new file mode 100644 (file)
index 0000000..a0cab12
--- /dev/null
@@ -0,0 +1,43 @@
+BEGIN { $| = 1; print "1..1\n"; }
+
+use Business::OnlinePayment;
+
+my $tx = new Business::OnlinePayment("StGeorge",
+#  'cert_path'   => './java.cert',
+  'cert_path'   => '/home/ivan/Business-OnlinePayment-StGeorge/t2/java.cert',
+);
+
+$tx->content(
+    login          => '10005432',
+    password       => 'cretphrase',
+    type           => 'CC',
+    action         => 'Normal Authorization',
+    description    => 'Business::OnlinePayment::LinkPoint visa test',
+    amount         => '1.00',
+    first_name     => 'Tofu',
+    last_name      => 'Beast',
+    address        => '123 Anystreet',
+    city           => 'Anywhere',
+    state          => 'UT',
+    zip            => '84058',
+    country        => 'US',
+    email          => 'ivan-stgeorge@420.am',
+    card_number    => '4564456445644564',
+    expiration     => '12/2005',
+);
+
+$tx->test_transaction(1);
+
+$tx->submit();
+
+if($tx->is_success()) {
+    print "ok 1\n";
+    $auth = $tx->authorization;
+    warn "********* $auth ***********\n";
+} else {
+    print "not ok 1\n";
+    warn '***** '. $tx->error_message. " *****\n";
+    exit;
+}
+
+