// Assumption:
// Product: T-Shirt
// Quantity: 1 per purchase
// Currency: USD
// Price: 14.95
// Terminal number: as specified in configuration file
// Merchant name, number: as specified in configuration file
// Password file: as specified in configuration file
// Acquirer: "FDC"
// Slip: 1 per purchase
//
// Note:
// If the terminal number and merchant number are changed in the middle,
// things will go wrong.
function PrintReceiptItem(label, val)
{
write("", label,
" | ", val, " |
\n");
}
function PrintReceipt(pay, desc)
{
write("Thank you for shopping with us!.
");
write("\n");
write("",
"Receipt of Purchase | \n");
PrintReceiptItem("Date:", pay.eventTime);
PrintReceiptItem("Merchant Reference:", pay.merchantReference);
PrintReceiptItem("Authorization Code:", pay.authCode);
PrintReceiptItem("Payment Service Data:", pay.paySvcData);
PrintReceiptItem("AVS:", pay.avsResp);
PrintReceiptItem("Description:", desc);
PrintReceiptItem("Amount:", CentsToDollarStr(pay.amount));
write("
\n");
write('
');
}
function PrintFmtError(premsg, fmtmsg)
{
client.crErrno = 1;
client.crMsg1 = premsg;
client.crMsg2 = fmtmsg;
redirect("error.html");
}
function PrintError(premsg, info, postmsg)
{
client.crErrno = 2;
client.crMsg1 = premsg;
client.crMsg2 = info;
client.crMsg3 = postmsg;
redirect("error.html");
}
function GetMerchantReference()
{
project.lock();
if (project.MerchantReference == null)
project.MerchantReference = 0;
project.MerchantReference = parseInt(project.MerchantReference) + 1;
var merref = parseInt(project.MerchantReference);
project.unlock();
return(merref);
}
function CentsToDollarStr(cents)
{
if (cents.length == 1)
return("0.0"+cents);
if (cents.length == 2)
return("0."+cents);
return(cents.substring(0, cents.length - 2) + "." +
cents.substring(cents.length - 2, cents.length));
}
function GenerateSlip(amount, currency, orderDesc, processor)
{
//
// Create an initial slip object
//
slip = new Slip(request.cardNumber, request.cardExpYear + request.cardExpMonth,
amount, currency);
slip.billingStreet = request.billAddr1 + request.billAddr2;
slip.billingZip = request.billZip;
slip.cardType = request.cardType;
slip.appendOrderDesc(orderDesc);
//
// Encode the slip
//
if (!slip.encode(processor))
{
PrintFmtError("Failed to encode slip.",
slip.getStatusMessage());
}
//
// Extract the encrypted slip in DER format
//
asciiDER = slip.getDER();
//
// Recreate the slip from the extracted DER
//
slip2 = new Slip(asciiDER);
if (slip2.bad())
{
PrintFmtError("Failed to construct slip object from DER.",
slip2.getStatusMessage());
}
slip2.initMerchantOrderDesc(amount, currency);
slip2.appendMerchantOrderDesc(orderDesc);
return (slip2);
}
function CheckAVS(payevent)
{
var avsfail = 0;
avs = payevent.avsResp;
if (avs.substring(0, 1) == "N")
{
avsfail = 1;
}
if (avs.substring(1, 2) == "N")
{
avsfail = 2;
}
return (avsfail);
}
function Log(terminal, merchant, slip, processor,
payevent, merref, currency, orderDesc,
authGood, avsFail)
{
logFile = new File("/tmp/lpAuthOnly.log");
fileIsOpen = logFile.open("a");
if (fileIsOpen)
{
today = new Date();
logFile.write("Date: ");
logFile.writeln(today);
logFile.write("Merchant Reference: ");
logFile.writeln(merref);
logFile.write("Merchant: ");
logFile.write(merchant.merchantNumber);
logFile.write(" (");
logFile.write(merchant.name);
logFile.writeln(")");
logFile.write("Terminal: ");
logFile.writeln(terminal.terminalNumber);
logFile.write("Name: ");
logFile.writeln(request.billName);
logFile.write("Address: ");
logFile.writeln(request.billAddr1 + request.billAddr2);
logFile.write("Zip: ");
logFile.writeln(request.billZip);
logFile.write("Card Type: ");
logFile.writeln(request.cardType);
logFile.write("Card Expiration Date: ");
logFile.writeln(request.cardExpYear + request.cardExpMonth);
logFile.write("Description: ");
logFile.writeln(orderDesc);
logFile.write("Amount: ");
logFile.write(currency);
logFile.writeln(CentsToDollarStr(payevent.amount));
logFile.write("Slip: ");
logFile.writeln(slip.getDER());
logFile.write("\n");
if (authGood)
{
if (avsFail)
{
logFile.writeln("PURCHASE FAILED");
if (avsFail == 1)
{
logFile.writeln("Address mismatched.");
}
else
{
logFile.writeln("Zip code mismatched.");
}
logFile.write("\n\n");
}
else
{
logFile.writeln("AUTHORIZATION APPROVED");
logFile.write("Event Time: ");
logFile.writeln(payevent.eventTime);
logFile.write("Authorization Code: ");
logFile.writeln(payevent.authCode);
logFile.write("Payment Service Data: ");
logFile.writeln(payevent.paySvcData);
logFile.write("AVS: ");
logFile.writeln(payevent.avsResp);
logFile.write("\n\n");
}
}
else
{
logFile.writeln("AUTHORIZATION FAILED");
logFile.writeln(processor.getStatusMessage());
logFile.write("\n\n");
}
logFile.close();
}
else
{
PrintError("Can't open log file ", logFile);
}
}
//
// main
//
registerLivePayment();
if (request.cardNumber.length && request.cardExpYear.length + request.cardExpMonth.length)
{
merchant = new Merchant();
terminal = new Terminal();
processor = new Processor("FDC");
if (processor.bad())
{
PrintFmtError("Failed to construct processor",
processor.getStatusMessage());
}
//
// Generate slip
//
amount = "1495";
currency = "USD";
orderDescription = "T-Shirt";
slip = GenerateSlip(amount, currency, orderDescription, processor);
//
// Create a payevent object
//
var merchantReference = GetMerchantReference();
payevent = new PayEvent(merchantReference);
payevent.amount = amount;
//
// Authorize the transaction
//
var authGood = false;
var avsFail = 0;
if (processor.authorize(terminal, merchant, payevent, slip))
{
authGood = true;
avsFail = CheckAVS(payevent);
}
//
// Log transaction to file
//
Log(terminal, merchant, slip, processor,
payevent, merchantReference, currency, orderDescription,
authGood, avsFail);
if (authGood)
{
if (avsFail)
{
if (avsFail == 1)
{
PrintFmtError("Purchase Failed.", "Address mismatched.");
}
else
{
if (avsFail == 2)
{
PrintFmtError("Purchase Failed.", "Zip code mismatched.");
}
}
}
else
{
PrintReceipt(payevent, orderDescription);
}
}
else
{
PrintFmtError("Credit Card Authorization Failed.",
processor.getStatusMessage());
}
}
else
{
PrintError("Error in Purchase form
Please enter credit card number and expiration date");
}