From 50e4bcc992753f5536b0ab1960b4c6e982cb6212 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 1 May 2004 09:34:09 +0000 Subject: [PATCH] initial import --- Changes | 4 + MANIFEST | 11 +++ Makefile.PL | 11 +++ README | 24 +++++ StGeorge.pm | 294 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ t/bop.t | 5 + t/load.t | 5 + t2/bad_auth.t | 42 ++++++++ t2/credit_card.t | 43 ++++++++ 9 files changed, 439 insertions(+) create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 Makefile.PL create mode 100644 README create mode 100644 StGeorge.pm create mode 100644 t/bop.t create mode 100644 t/load.t create mode 100644 t2/bad_auth.t create mode 100644 t2/credit_card.t diff --git a/Changes b/Changes new file mode 100644 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 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 index 0000000..746c961 --- /dev/null +++ b/Makefile.PL @@ -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 ', + '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 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 + +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 index 0000000..cea459c --- /dev/null +++ b/StGeorge.pm @@ -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. + +=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 + +Based on Busienss::OnlinePayment::AuthorizeNet written by Jason Kohles. + +=head1 SEE ALSO + +perl(1), L. + +=cut + diff --git a/t/bop.t b/t/bop.t new file mode 100644 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 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 index 0000000..8e49e67 --- /dev/null +++ b/t2/bad_auth.t @@ -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 index 0000000..a0cab12 --- /dev/null +++ b/t2/credit_card.t @@ -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; +} + + -- 2.11.0