 |
Make sure to replace the UMkey parameter with your source key. Also, the example below uses our sandbox test server. Make sure to change the url to https://secure.usaepay.com/gate when ready to process production transactions
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$res = $ua->post('https://sandbox.usaepay.com/gate', [
'UMkey' => "OEyB1Ziz4i4anLLMQAe7OR6Z13mQAkq1",
'UMname' => "Example Tester",
'UMcard' => "4444555566667779",
'UMexpir' => "0113",
'UMcvv2' => "999",
'UMamount' => "5.50",
'UMinvoice' => "123456",
'UMstreet' => "1234 Main Street",
'UMzip' => "12345",
'UMcommand' => 'cc:sale'
]);
print "\n\nresult: ".$res->content;
print "\n";
If your source key has been secured with a pin, you must generate and pass a hash authentication token to the server. The following example demonstrates this using the Digest::SHA1 module.
use LWP::UserAgent;
use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
$sourcekey = 'fTU2rg5afrEGazF6ew6PBk6ts0G8gvB0';
$pin = '1234';
$command = 'cc:sale';
$amount = '5.50';
$invoice = '123123';
# Generate Hash
$seed = rand();
$prehash = $command . ":" . $pin . ":" . $amount . ":" . $invoice . ":" . $seed;
$hash = 's/' . $seed . '/' . sha1_hex($prehash) . '/n';
$ua = LWP::UserAgent->new;
$res = $ua->post('https://sandbox.usaepay.com/gate.php', [
'UMkey' => $sourcekey,
'UMhash' => $hash,
'UMname' => "Example Tester",
'UMcard' => "4444555566667779",
'UMexpir' => "0113",
'UMcvv2' => "999",
'UMamount' => $amount,
'UMinvoice' => $invoice,
'UMstreet' => "1234 Main Street",
'UMzip' => "12345",
'UMcommand' => $command
]);
print "\n\nresult: ".$res->content;
print "\n";
#!/usr/bin/perl
#########################################################
#Connect.pl
#Developed by Mind2Web for USAePay
#For question or comments email: mind2webinfo@yahoo.com
# OR support@usaepay.com
#
#The following is a perl script to gather,
#parse and verify form data that is then sent
#through SSL to the USAePay gateway for verification.
#The script requires and uses Net::SSLeay which can
#be found at http://symlabs.com/Net_SSLeay/ or through
#http://search.cpan.org You will also need to install
#openSSL from http://www.openssl.org and have perl
#5.6.1 or later to use Net::SSLeay.
#########################################################
#To use the program after installing required packages
#you can either use this script as is (not recommended
#since the script only parses the response of the
#gateway without displaying any messages), or you can
#create your own response handling script. There are
#two ways of accomplishing this:
#1. At the end of this script add more lines of code
# to handle messages.
#2. Create a script of your own and at the top write the
# command
# require 'connect.pl';
# This will execute the script at run time and continue
# executing your script and response handling code.
# Keep in mind though that this script does call
# use Net::SSLeay, prints the Content-type and parses
# the form and responses, therefore you do not need to
# add them into your code.
#
#Your web site should have an HTML form pointing to this
#script (or to your own if you chose to go with option 2).
#This script was written to check for the gateway required
#fields and will reload your form HTML with red warning
#messages where the missing fields are and the others will
#have the values that were specified byt he user.
#WARNING: this has to be an HTML page (not a script) or else
#the program will not perform properly. If you have a script
#generated form then you will need to disable this feature
#and create your own error handling.
#Go over to the config section to learn how to disable this feature if
#you wish to handle error messages yourself. You can see a
#sample form by looking at the formPage.htm file provided with
#this perl script.
#
#########################################################
#INSTRUCTIONS:
#We have included helpful hints in comments throughout the
#script. Please read them carefully and follow the instructions.
#You can also find instructions about the variables in which
#the gateway responses are held and how to access them at the
#end of the script.
#
#go over the Config setion below and change any variables
#to your own values.
#
#########################################################
####CONFIG SECTION
#go over the following code and change any value
#$formPage should be the path to the html page that contains the form.
#this will be used if there is a required field missing, the program
#will automatically reload the script with the values and a red
#notice that the required field is missing.
#In order for this feature to work the page has to be an HTML page and
#the <input ...> openning and closing tag has to be on the same line.
#that is when you open an input tag '<input ...' ther should be no
#new lines untill you close that tag '>'. If not the script may produce
#undesired response.
#IF you do not wish to have this feature, you can leave $formPage.
#Just put a comment '#' in front of the following line and uncomment
#the line below it.
$formPage = 'formPage.htm';
#$formPage = '';
#uncomment the above line to disable reloading the form page with
#error messages
#Your Source Key that is provided by usaepay
$sourceKey = 'PUT_YOUR_SOUCE_KEY_HERE';
#END CONFIG SECTION. Go to the bottom "OUTPUT SECTION" and add any code
#you need to change the output of the script
use Net::SSLeay qw(post_https make_form);
print "Content-type: text/html\n\n";
###Pare Form Input. The following lines of code will parse
#the form variables sent through the web page. It can handle
#both POST and GET methods.
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
@cgiPairs = split(/&/,$buffer);
foreach $cgiPair (@cgiPairs)
{
($name,$value) = split(/=/,$cgiPair);
$value =~ s/\+/ /g;
$value =~ s/%(..)/pack("c",hex($1))/ge;
$form{$name} .= "\0" if (defined($form{$name}));
$form{$name} .= "$value";
}
##### END FORM PARSE. VALUES ARE IN %form
# form values can now be accessed by calling $form{'formVariableName'}
# depending on what the form variable name is
#####
##Below if statement checks to see if there is a source key
#if not then it will print eror message and exit.
if ($sourceKey =~ /^\s*$/) {
print "Error Missing Source Key. Please contact site admin\n";
exit;
}
##Below IF statement checks for all gateway required fields
#if any of them are missing, it will print an error message
#and exit the program. If you have put in a value for $formPage
#then it will reload the HTML page and display the error messages.
$required = 0;
if ($form{'UMcommand'} eq 'check' || $form{'UMcommand'} eq 'checkcredit')
{
if ($form{'UMrouting'} =~ /^\s*$/ ||
$form{'UMaccount'} =~ /^\s*$/ ||
$form{'UMssn'} =~ /^\s*$/ ||
$form{'UMdlnum'} =~ /^\s*$/ ||
$form{'UMdlstate'} =~ /^\s*$/)
{
$required = 1;
}
}
else
{
if ($form{'UMcard'} =~ /^\s*$/ ||
$form{'UMexpirM'} =~ /^\s*$/ ||
$form{'UMexpirY'} =~ /^\s*$/)
{
$required = 2;
}
}
if ($required == 1 || $required == 2 ||
$form{'UMamount'} =~ /^\s*$/ ||
$form{'UMinvoice'} =~ /^\s*$/ ||
$form{'UMname'} =~ /^\s*$/ ||
$form{'UMstreet'} =~ /^\s*$/ ||
$form{'UMzip'} =~ /^\s*$/)
{
print "<center><font color=\"red\" size=\"3\">Error missing parameter</font></center>\n";
#if any form feild missing, read form page, find missing fields, display with double red asterisks.
if ($formPage)
{
open (formHTML, "$formPage")|| die"cannot open form page. Please click back button and complete required fields manually\n";
while (<formHTML>){
$line = $_;
if ($required == 0)
{
$line =~ s/(<input.*type.*=.*"UMcard"[^>]*)(>)/$1 value="$form{'UMcard'}">/;
$line =~ s/(<input.*type.*=.*"UMexpirM"[^>]*)(>)/$1 value="$form{'UMexpirM'}">/;
$line =~ s/(<input.*type.*=.*"UMexpirY"[^>]*)(>)/$1 value="$form{'UMexpirY'}">/;
$line =~ s/(<input.*type.*=.*"UMrouting"[^>]*)(>)/$1 value="$form{'UMrouting'}">/;
$line =~ s/(<input.*type.*=.*"UMaccount"[^>]*)(>)/$1 value="$form{'UMaccount'}">/;
$line =~ s/(<input.*type.*=.*"UMssn"[^>]*)(>)/$1 value="$form{'UMssn'}">/;
$line =~ s/(<input.*type.*=.*"UMdlnum"[^>]*)(>)/$1 value="$form{'UMdlnum'}">/;
$line =~ s/(<input.*type.*=.*"UMdlstate"[^>]*)(>)/$1 value="$form{'UMdlstate'}">/;
}
if ($required == 1)
{
if ($form{'UMrouting'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMrouting".*/) {
$line =~ s/(<input.*type.*=.*"UMrouting"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Routing.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMrouting"[^>]*)(>)/$1 value="$form{'UMrouting'}">/;
}
if ($form{'UMaccount'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMaccount".*/) {
$line =~ s/(<input.*type.*=.*"UMaccount"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Account Number.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMaccount"[^>]*)(>)/$1 value="$form{'UMaccount'}">/;
}
if ($form{'UMssn'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMssn".*/) {
$line =~ s/(<input.*type.*=.*"UMssn"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field SSN.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMssn"[^>]*)(>)/$1 value="$form{'UMssn'}">/;
}
if ($form{'UMdlnum'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMdlnum".*/) {
$line =~ s/(<input.*type.*=.*"UMdlnum"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Driver's License Number.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMdlnum"[^>]*)(>)/$1 value="$form{'UMdlnum'}">/;
}
if ($form{'UMdlstate'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMdlstate".*/) {
$line =~ s/(<input.*type.*=.*"UMdlstate"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field State Where Driver's License Was Issued.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMdlstate"[^>]*)(>)/$1 value="$form{'UMdlstate'}">/;
}
$line =~ s/(<input.*type.*=.*"UMcard"[^>]*)(>)/$1 value="$form{'UMcard'}">/;
$line =~ s/(<input.*type.*=.*"UMexpirM"[^>]*)(>)/$1 value="$form{'UMexpirM'}">/;
$line =~ s/(<input.*type.*=.*"UMexpirY"[^>]*)(>)/$1 value="$form{'UMexpirY'}">/;
}
if ($required == 2)
{
if ($form{'UMcard'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMcard".*/) {
$line =~ s/(<input.*type.*=.*"UMcard"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Card Number.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMcard"[^>]*)(>)/$1 value="$form{'UMcard'}">/;
}
if ($form{'UMexpirM'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMexpirM".*/) {
$line =~ s/(<input.*type.*=.*"UMexpirM"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Expire Date Month.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMexpirM"[^>]*)(>)/$1 value="$form{'UMexpirM'}">/;
}
if ($form{'UMexpirY'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMexpirY".*/) {
$line =~ s/(<input.*type.*=.*"UMexpirY"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Expire Date Year.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMexpirY"[^>]*)(>)/$1 value="$form{'UMexpirY'}">/;
}
$line =~ s/(<input.*type.*=.*"UMrouting"[^>]*)(>)/$1 value="$form{'UMrouting'}">/;
$line =~ s/(<input.*type.*=.*"UMaccount"[^>]*)(>)/$1 value="$form{'UMaccount'}">/;
$line =~ s/(<input.*type.*=.*"UMssn"[^>]*)(>)/$1 value="$form{'UMssn'}">/;
$line =~ s/(<input.*type.*=.*"UMdlnum"[^>]*)(>)/$1 value="$form{'UMdlnum'}">/;
$line =~ s/(<input.*type.*=.*"UMdlstate"[^>]*)(>)/$1 value="$form{'UMdlstate'}">/;
}
if ($form{'UMamount'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMamount".*/) {
$line =~ s/(<input.*type.*=.*"UMamount"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Amount.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMamount"[^>]*)(>)/$1 value="$form{'UMamount'}">/;
}
if ($form{'UMinvoice'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMinvoice".*/) {
$line =~ s/(<input.*type.*=.*"UMinvoice"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Invoice Number.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMinvoice"[^>]*)(>)/$1 value="$form{'UMinvoice'}">/;
}
if ($form{'UMname'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMname".*/) {
$line =~ s/(<input.*type.*=.*"UMname"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Customer Name.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMname"[^>]*)(>)/$1 value="$form{'UMname'}">/;
}
if ($form{'UMstreet'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMstreet".*/) {
$line =~ s/(<input.*type.*=.*"UMstreet"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Customer Address Street.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMstreet"[^>]*)(>)/$1 value="$form{'UMstreet'}">/;
}
if ($form{'UMzip'} =~ /^\s*$/) {
if ($line =~ /<input.*type.*=.*"UMzip".*/) {
$line =~ s/(<input.*type.*=.*"UMzip"[^>]*>)/$1<font color=\"red\" size=\"1\">Missing Required Field Customer Address Zip.<\/font>\n/;
}
} else {
$line =~ s/(<input.*type.*=.*"UMzip"[^>]*)(>)/$1 value="$form{'UMzip'}">/;
}
print "$line\n";
}
close (formHTML);
}
exit;
}
###Following lines format the fields to gateway specs.
$form{'UMcard'} =~ s/[^0-9]//g;
$form{'UMexpirM'} =~ s/[^0-9]//g;
$form{'UMexpirY'} =~ s/[^0-9]//g;
$form{'UMexpir'} = "$form{'UMexpirM'}$form{'UMexpirY'}";
$form{'UMamount'} =~ s/[^0-9\.]//g;
#All required fields are checked and formatted
#Now we need to save them in a hash array and submit them through
#Net::SSLeay to the gateway
#Uncomment the following line to enable tracing (for debugging)
#values are: 0=no debugging, 1=ciphers, 2=trace, 3=dump data
#$Net::SSLeay::trace = 2;
#gather all the cgi form variables to be sent to the gateway.
%formData = make_form (
#'UMkey' => $form{'UMkey'},
'UMkey' => $sourceKey,
'UMauthCode' => $form{'UMauthCode'},
'UMrefNum' => $form{'UMrefNum'},
'UMcard' => $form{'UMcard'},
'UMexpir' => $form{'UMexpir'},
'UMrouting' => $form{'UMrouting'},
'UMaccount' => $form{'UMaccount'},
'UMamount' => $form{'UMamount'},
'UMtax' => $form{'UMtax'},
'UMcustid' => $form{'UMcustid'},
'UMinvoice' => $form{'UMinvoice'},
'UMponum' => $form{'UMponum'},
'UMticket' => $form{'UMticket'},
'UMdescription' => $form{'UMdescription'},
'UMcvv2' => $form{'UMcvv2'},
'UMcustemail' => $form{'UMcustemail'},
'UMcustreceipt' => $form{'UMcustreceipt'},
'UMname' => $form{'UMname'},
'UMstreet' => $form{'UMstreet'},
'UMzip' => $form{'UMzip'},
'UMssn' => $form{'UMssn'},
'UMdlnum' => $form{'UMdlnum'},
'UMdlstate' => $form{'UMdlstate'},
'UMip' => $form{'UMip'},
'UMcommand' => $form{'UMcommand'},
'UMredir' => $form{'UMredir'},
'UMredirApproved' => $form{'UMredirApproved'},
'UMredirDeclined' => $form{'UMredirDeclined'},
'UMechofields' => $form{'UMechofields'},
'UMechounsafe' => $form{'UMechounsafe'},
'UMtestmode' => $form{'UMtestmode'},
'UMrecurring' => $form{'UMrecurring'},
'UMbillamount' => $form{'UMbillamount'},
'UMschedule' => $form{'UMschedule'},
'UMnumleft' => $form{'UMnumleft'},
'UMstart' => $form{'UMstart'},
'UMbillfname' => $form{'UMbillfname'},
'UMbilllname' => $form{'UMbilllname'},
'UMbillcompany' => $form{'UMbillcompany'},
'UMbillstreet' => $form{'UMbillstreet'},
'UMbillstreet2' => $form{'UMbillstreet2'},
'UMbillcity' => $form{'UMbillcity'},
'UMbillstate' => $form{'UMbillstate'},
'UMbillzip' => $form{'UMbillzip'},
'UMbillcountry' => $form{'UMbillcountry'},
'UMbillphone' => $form{'UMbillphone'},
'UMemail' => $form{'UMemail'},
'UMfax' => $form{'UMfax'},
'UMwebsite' => $form{'UMwebsite'},
'UMshipfname' => $form{'UMshipfname'},
'UMshiplname' => $form{'UMshiplname'},
'UMshipcompany' => $form{'UMshipcompany'},
'UMshipstreet' => $form{'UMshipstreet'},
'UMshipstreet2' => $form{'UMshipstreet2'},
'UMshipcity' => $form{'UMshipcity'},
'UMshipstate' => $form{'UMshipstate'},
'UMshipzip' => $form{'UMshipzip'},
'UMshipcountry' => $form{'UMshipcountry'},
'UMshipphone' => $form{'UMshipphone'},
'UMcardauth' => $form{'UMcardauth'},
'UMpares' => $form{'UMpares'},
'UMxid' => $form{'UMxid'},
'UMcavv' => $form{'UMcavv'},
'UMeci' => $form{'UMeci'},
);
#send data via SSLeay and gather encrypted reply.
my $host = 'www.usaepay.com';
my $script = '/gate.php';
my $port = '443';
$Net::SSLeay::ssl_version = 3;
my ($replyData, $reply_type, %reply_headers)
= post_https($host, $port, $script, '', %formData);
####Parse the reponse from the gateway.
@replyPairs = split(/&/,$replyData);
foreach $replyPair (@replyPairs)
{
($name,$value) = split(/=/,$replyPair);
$value =~ s/\+/ /g;
$value =~ s/%(..)/pack("c",hex($1))/ge;
$reply{$name} .= "\0" if (defined($reply{$name}));
$reply{$name} .= "$value";
}
###REPLY FORMAT AND INSTRUCTIONS ON HOW TO ACCESS THEM
#The Gateway sends a reply through form variables
#you can find more description about these variables on
#the usaepay web site. Follow the link to the
#Developer's Center -> Developer's Library -> USA ePay Gateway API
#currently found at:
#http://www.usaepay.com/topics/api.html
#the replies are stored in the %reply hash array and can
#be access by specifying the key. For example, to find the
#status of the transaction, you would access it through the
#variable $reply{'UMstatus'} which should be Approved for a
#successful transaction.
####OUTPUT SECTION:
#following is a generic unprocessed output of the gateway's response.
#you will need to change the code to format it to your site's look and feel
#and give your users a more informative result.
print "replyData = $replyData <br>\n response = $response <br>\nreply headers:<br>\n";
foreach $key (keys %reply_headers)
{
print "$key: $reply_headers{$key}<br>\n";
}
#return results to user's script.
<form action="connect.pl" method="POST">
<table border="1" width="80%">
<tr>
<td>Card Number</td>
<td><input type="text" name="UMcard" size="12"></td>
</tr>
<tr>
<td>Expire Date (MM/YY)</td>
<td><input type="text" name="UMexpirM" size="2" maxlength="2">/
<input type="text" name="UMexpirY" size="2" maxlength="2"></td>
</tr>
<tr>
<td>Amount</td>
<td>$<input type="text" name="UMamount" size="6"></td>
</tr>
<tr>
<td>Invoice Number</td>
<td><input type="text" name="UMinvoice" size="12"></td>
</tr>
<tr>
<td>Customer Name</td>
<td><input type="text" name="UMname" size="20"></td>
</tr>
<tr>
<td>Street</td>
<td><input type="text" name="UMstreet" size="20"></td>
</tr>
<tr>
<td>Zip</td>
<td><input type="text" name="UMzip" size="5" maxlength="5"></td>
</tr>
<tr>
<td align="center"><input type="submit" name="submit" value="Submit"></td>
<td align="center"><input type="reset" name="reset" value="reset"></td>
</tr>
</table>
</form>
We've noticed that because of some updates to NetSSL that the code above may need to be modified in order to get everything working.
If you are getting a “Specified Source Key Not Found” even when placing a proper value for the Key you may need to modify the code:
The line in connect.pl:
%formData = make_form (
should be:
$formData_ref = make_form (
and the line in connect.pl:
my ($replyData, $reply_type, %reply_headers) = post_https($host, $port, $script, '', %formData);
should be:
my ($replyData, $reply_type, %reply_headers) = post_https($host, $port, $script, '', $formData_ref);
1.2
Typos in code of connect.pl fixed
03/04/04
1.0 → 1.2
Added support for VBV and MSC as well as other fields (tax, po…).
10/15/03
|
|

|