--- /dev/null
+package Business::OnlinePayment::Cardcom;
+
+use strict;
+use Carp;
+use Tie::IxHash;
+use Business::OnlinePayment 3;
+use Business::OnlinePayment::HTTPS 0.03;
+use Data::Dumper;
+use vars qw($VERSION $DEBUG @ISA);
+
+@ISA = qw(Business::OnlinePayment::HTTPS);
+$VERSION = '0.01';
+$DEBUG = 0;
+
+sub set_defaults {
+ my $self = shift;
+
+ $self->server('secure.cardcom.co.il');
+ $self->path('/BillGoldPost.aspx');
+ $self->port('443');
+}
+
+# XXX?
+# -CVV
+# -Identity number
+# -Configurable currency
+# -Configurable deal code
+# -Refunds or whatever this thing calls them
+sub submit {
+ my($self) = @_;
+
+ $self->remap_fields(
+ card_number => 'cardnumber',
+ amount => 'Sum',
+ login => 'Username',
+ );
+
+ die "invalid action" unless
+ $self->{_content}{'action'} =~ /^\s*normal\s*authorization\s*$/i;
+
+ $self->{_content}{'expiration'} =~ /^(\d+)\D+\d*(\d{2})$/
+ or croak "unparsable expiration ". $self->{_content}{expiration};
+ my( $month, $year ) = ( $1, $2 );
+ $month = '0'. $month if $month =~ /^\d$/;
+ $self->{_content}{cardvalidityyear} = $year;
+ $self->{_content}{cardvaliditymonth} = $month;
+
+ $self->{_content}{amount} = sprintf('%.2f', $self->{_content}{amount} );
+ $self->{_content}{languages} = 'en';
+
+ $self->terminalnumber =~ /^\d+$/ or die "invalid TerminalNumber";
+ $self->{_content}{TerminalNumber} = $self->terminalnumber;
+
+ tie my %fields, 'Tie::IxHash', $self->get_fields( $self->fields );
+ my $post_data = join('&', map "$_=$fields{$_}", keys %fields );
+ warn "POSTING: ".$post_data if $DEBUG > 1;
+
+ my( $page, $response, @reply_headers) = $self->https_post( $post_data );
+
+ if ($response !~ /^200/) {
+ # Connection error
+ $response =~ s/[\r\n]+/ /g; # ensure single line
+ $self->is_success(0);
+ my $diag_message = $response || "connection error";
+ die $diag_message;
+ }
+
+ $self->server_response($page);
+
+ unless ( $page =~ /^(\d+);(\d+);(.*?)$/ ) {
+ die "unparsable response received from gateway" .
+ ( $DEBUG ? ": $page" : '' );
+ }
+
+ my $result = $1;
+ my $authorization = $2;
+ my $message = $3;
+
+ $self->authorization($authorization);
+ if ( $result == 0 ) {
+ $self->is_success(1);
+ } else {
+ $self->is_success(0);
+ $self->error_message($message);
+ }
+}
+
+sub fields {
+ my $self = shift;
+
+ qw(
+ TerminalNumber
+ Sum
+ cardnumber
+ cardvalidityyear
+ cardvaliditymonth
+ Username
+ languages
+ );
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Business::OnlinePayment::Cardcom - Cardcom backend module for Business::OnlinePayment
+
+=head1 SYNOPSIS
+
+ use Business::OnlinePayment::Cardcom;
+
+ ####
+ # One step transaction, the simple case.
+ ####
+
+ my $tx = new Business::OnlinePayment("Cardcom");
+ $tx->content(
+ type => 'CC',
+ login => 'Cardcom Username',
+ password => 'Cardcom Password',
+ terminalnumber => 'Cardcom Terminal Number',
+ action => 'Normal Authorization',
+ amount => '49.95',
+ card_number => '4005550000000019',
+ expiration => '08/06',
+ );
+ $tx->submit();
+
+ if($tx->is_success()) {
+ print "Card processed successfully: ".$tx->authorization."\n";
+ } else {
+ print "Card was rejected: ".$tx->error_message."\n";
+ }
+
+=head1 SUPPORTED TRANSACTION TYPES
+
+=head2 CC
+
+Content required: type, login, password, action, amount, card_number, expiration, terminalnumber.
+
+=head1 PREREQUISITES
+
+ URI::Escape
+ Tie::IxHash
+
+ Net::SSLeay _or_ ( Crypt::SSLeay and LWP )
+
+=head1 DESCRIPTION
+
+For detailed information see L<Business::OnlinePayment>.
+
+=head1 AUTHOR
+
+Erik Levinson <levinse@freeside.biz>
+
+=head1 SEE ALSO
+
+perl(1). L<Business::OnlinePayment>.
+
+=cut
--- /dev/null
+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::Cardcom',
+ 'VERSION_FROM' => 'Cardcom.pm', # finds $VERSION
+ 'AUTHOR' => 'Erik Levinson <levinse@freeside.biz>',
+ #'NORECURS' => 1, # dont descend into subdirectories
+ 'PREREQ_PM' => {
+ 'Business::OnlinePayment' => 0,
+
+ # for HTTPS (maybe it should be a separate dist?)
+ 'URI::Escape' => 0,
+ 'Tie::IxHash' => 0,
+
+ # 'Net::SSLeay' => 0,
+ # or 'Crypt::SSLeay' => 0,
+ # 'URI
+
+ },
+ #'dist' => {CI => 'ci -l'},
+);
+
--- /dev/null
+Copyright (c) 2011 Erik Levinson
+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::Cardcom, an Business::OnlinePayment
+backend module for the Cardcom gateway. It is only
+useful if you have a merchant account with Cardcom:
+http://www.cardcom.co.il
+
+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").