[ic] Custom Payment (credit Card) Options

Desjardins, Ray Desjardins.Ray@Con-Way.com
Mon, 6 Nov 2000 04:46:12 -0800

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

Content-Type: text/plain;

Here are some instructions I put together some time ago for Authorize.Net.
Some of this may already be done if your using version 4.6.  

Hope this helps,

Ray Desjardins

Authorize.Net 3.X installation instructions:

1.  Place the below global sub routine file in
Example Path: /usr/local/minivend/globalsub/authorizenet  

2.  Edit your minivend.cfg and add the autorizenet include.
#include /globalsub/authorizenet

My Example:  
#### Now including individual usertag files
#include usertag/*
#include compat/*
#include globalsub/authorizenet

3.  Using your knar editor add the following variables to your catalog
variables database.  I did this to allow me to change the authorize net
variables much easier.  You can also add these to your catalog.cfg file if
you would like.

Variable			Value
MV_PAYMENT_ID		your_authorize.net_login
MV_PAYMENT_MODE		custom authorizenet
MV_PAYMENT_SECRET		your_authorize.net_password
MV_PAYMENT_REFERER 	http://www.yourdomain.com/authorize.html

4.  I changed the /usr/local/minivend/lib/Vend/Order.pm module to allow a
few more arguments to authrorize.net at purchase time.  
Here is an example of my map_actual sub routine in the Order.pm module.
(This is change is optional but recommended)

sub map_actual { 
	# Allow remapping of payment variables 
    my %map = qw( 
		mv_credit_card_number       mv_credit_card_number 
		name                        name 
		fname                       fname 
		lname                       lname 
		b_name                      b_name 
		b_fname                     b_fname 
		b_lname                     b_lname 
		address                     address 
		address1                    address1 
		address2                    address2 
		b_address                   b_address 
		b_address1                  b_address1 
		b_address2                  b_address2 
		city                        city 
		b_city                      b_city 
		state                       state 
		b_state                     b_state 
		zip                         zip 
		b_zip                       b_zip 
		country                     country 
		b_country                   b_country 
		mv_credit_card_exp_month    mv_credit_card_exp_month 
		mv_credit_card_exp_year     mv_credit_card_exp_year 
		cyber_mode                  mv_cyber_mode 
		amount                      amount
 	      mv_order_number		    mv_order_number


5.  Make sure your authorize.net account is configured to accept the
http://www.yourdomain.com/authorize.html as a referrer.  Put your account in
test mode and have fun.

-----Original Message-----
From: Ted Sindzinski [mailto:admin@extremefactor.com]
Sent: Sunday, November 05, 2000 3:15 PM
To: interchange-users@minivend.com
Subject: [ic] Custom Payment (credit Card) Options

    I am currently trying to setup Interchange to work with
Authorize.net which authenticates via http requests.  I currently have a
little lwp script that I used with my old shopping cart to send the
transactions.  Although I have read a great deal of documentaiton, all I
can find about setting up payment schemes in Interchange is to use
'&charge=custom MY_PAYMENT_FUCNTION_NAME'.  With this line added, what
must I do to define the function name and get it running?  where must
errors return to to be seen? and lastly, where does this line go (file

Thank you for any assistance

Ted Sindzinski
CTO Extreme Factor

Interchange-users mailing list

Content-Type: application/octet-stream;
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;

# Connection routine for AuthorizeNet version 3 using the 'ADC Direct =
Response' method.=20
# by mark@summersault.com with code reused and inspired by =20
#	Mike Heins <mike@minivend.com>=20
#	webmaster@nameastar.net=20
#   Jeff Nappi <brage@cyberhighway.net>=20
#   Paul Delys <paul@gi.alaska.edu>=20
#  Edited by Ray Desjardins <ray@dfwmicrotech.com>
 1. Modify minivend.cfg to use this file.=20
	#include globalsub/authorizenet=20
 2. Modify catalog.cfg to set the server and your Authorize.Net account =
 # Username and password=20
 Variable MV_PAYMENT_ID      YourAuthorizeNetID=20
 Variable MV_PAYMENT_SECRET  YourAuthorizeNetPassword=20
 Variable MV_PAYMENT_MODE    custom authorizenet=20
 Variable MV_PAYMENT_REFERER A valid referering url (match this with =
your setting on secure.authorize.net=20
 3. Make sure CreditCardAuto is off (default in MV4)=20
 4. Restart Minivend.=20

GlobalSub <<EOS
sub authorizenet {=20
	my ($user, $secret, $amount) =3D @_;=20
	my (%actual) =3D Vend::Order::map_actual();=20
	if (! $user ) {=20
		$user    =3D  $::Variable->{MV_PAYMENT_ID} ||=20
                    or return undef;=20
	if(! $secret) {=20
        $secret  =3D  $::Variable->{MV_PAYMENT_SECRET} ||=20
                    or return undef;=20
    my $server  =3D   $::Variable->{MV_PAYMENT_SERVER} ||=20
                    $::Variable->{CYBER_SERVER} ||=20
    my $script 	=3D   $::Variable->{MV_PAYMENT_SCRIPT} ||=20
                    $::Variable->{CYBER_SCRIPT} ||=20
    my $port    =3D   $::Variable->{MV_PAYMENT_PORT} ||=20
                    $::Variable->{CYBER_PORT} ||=20
	my $precision =3D $::Variable->{MV_PAYMENT_PRECISION} ||=20
                    $::Variable->{CYBER_PRECISION} ||=20
	my $referer   =3D $::Variable->{MV_PAYMENT_REFERER};                   =
	$actual{mv_credit_card_exp_month} =3D~ s/\D//g;=20
    $actual{mv_credit_card_exp_month} =3D~ s/^0+//;=20
    $actual{mv_credit_card_exp_year} =3D~ s/\D//g;=20
    $actual{mv_credit_card_exp_year} =3D~ s/\d\d(\d\d)/$1/;=20
    $actual{mv_credit_card_number} =3D~ s/\D//g;=20
    my $exp =3D sprintf '%02d%02d',=20
                        $actual{mv_credit_card_exp_year};               =
	 $actual{cyber_mode} =3D 'AUTH_CAPTURE'=20
        unless $actual{cyber_mode};=20
	my %type_map =3D (=20
		mauth_capture 			=3D>	'AUTH_CAPTURE',=20
		mauthonly				=3D>	'AUTH_ONLY',=20
		CREDIT					=3D>	'CREDIT',=20
		VOID					=3D>	'VOID',=20
	);                       =20
	if (defined $type_map{$actual{cyber_mode}}) {=20
        $actual{cyber_mode} =3D $type_map{$actual{cyber_mode}};=20
    else {=20
        $actual{cyber_mode} =3D 'AUTH_CAPTURE';=20
    if(! $amount) {=20
        $amount =3D Vend::Interpolate::total_cost();=20
        $amount =3D sprintf("%.${precision}f", $amount);=20
    } =20
    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =3D =
    # We'll make an order ID based on date, time, and MiniVend session=20
    # $mon is the month index where Jan=3D0 and Dec=3D11, so we use=20
    # $mon+1 to get the more familiar Jan=3D1 and Dec=3D12=20
    $orderID =3D sprintf("%02d%02d%02d%02d%02d%05d%s",=20
            $year + 1900,$mon + 1,$mday,$hour,$min,$Vend::SessionName); =

    my %query =3D (=20
                    x_Card_Num		=3D> $actual{mv_credit_card_number},=20
                    x_First_Name        =3D> $actual{b_fname},=20
                    x_Last_Name         =3D> $actual{b_lname},
                    x_Address           =3D> $actual{address},=20
                    x_City              =3D> $actual{b_city},=20
                    x_State             =3D> $actual{b_state},=20
                    x_Zip		=3D> $actual{zip},
                    x_Type		=3D> $actual{mv_payment_mode},=20
                    x_Amount    	=3D> $amount,=20
                    x_Exp_Date  	=3D> $exp,
                    x_Method    	=3D> 'CC',
                    x_Invoice_Num       =3D> $actual{mv_order_number},
#                    x_Company           =3D> $actual{company},
#                    x_Phone             =3D> $actaul{day_phone}, =20
                    x_Password  	=3D> $secret,=20
                    x_Login     	=3D> $user,=20
                    x_Version   	=3D> '3.0',=20
                    x_ADC_URL   	=3D> 'FALSE',=20
                    x_ADC_Delim_Data	=3D> 'TRUE',=20
    my @query;=20
    for (keys %query) {=20
        my $key =3D $_;=20
        my $val =3D $query{$key};=20
        $val =3D~ s/["\$\n\r]//g;=20
        $val =3D~ s/\$//g;=20
        my $len =3D length($val);=20
        if($val =3D~ /[&=3D]/) {=20
            $key .=3D "[$len]";=20
        push @query, "$key=3D$val";=20
    my $string =3D join '&', @query;=20
    use Net::SSLeay qw(post_https make_form make_headers);=20
    my ($page, $response, %reply_headers)=20
                =3D post_https($server, $port, $script, =20
                	   make_headers( Referer =3D> $referer), =20
    # Minivend names are on the  left, Authorize.Net on the right=20
    my %result_map =3D ( qw/=20
            MStatus               x_response_code=20
            pop.status            x_response_code=20
            MErrMsg               x_response_reason_text=20
            pop.error-message     x_response_reason_text=20
            order-id              x_trans_id=20
            pop.order-id          x_trans_id=20
            pop.auth-code         x_auth_code=20
            pop.avs_code          x_avs_code=20
            pop.avs_zip           x_zip=20
            pop.avs_addr          x_address=20
    );          =20
#::logError(qq{\nauthorizenet page: $page response: $response\n}); =20
    my ($response_code,=20
    	$trans_id) =3D split (/,/,$page);=20
#::logError(qq{authorizenet =
response_reason_text=3D$response_reason_text response_code: =
$response_code});    	=20
    my %result;=20
    if ($response_code =3D=3D 1) {=20
    	$result{MStatus} =3D 'success';=20
    	$result{'order-id'} =3D 1; # ? Why this this set to 1? -mark=20
    } else {=20
    	$result{MStatus} =3D 'failure';=20
		# NOTE: A lot more AVS codes could be checked for here. =20
    	if ($avs_code eq 'N') {=20
    		$result{MErrMsg} =3D "You must enter the correct billing address =
of your credit card. The bank returned the following error: " . =
    	} else {=20
    		$result{MErrMsg} =3D "$response_reason_text"=20
    return (%result);=20