247 lines
7.3 KiB
PHP
247 lines
7.3 KiB
PHP
<?php
|
|
/*
|
|
+--------------------------------------------------------------------------
|
|
| CubeCart 4
|
|
| ========================================
|
|
| CubeCart is a registered trade mark of Devellion Limited
|
|
| Copyright Devellion Limited 2006. All rights reserved.
|
|
| Devellion Limited,
|
|
| 5 Bridge Street,
|
|
| Bishops Stortford,
|
|
| HERTFORDSHIRE.
|
|
| CM23 2JU
|
|
| UNITED KINGDOM
|
|
| http://www.devellion.com
|
|
| UK Private Limited Company No. 5323904
|
|
| ========================================
|
|
| Web: http://www.cubecart.com
|
|
| Email: info (at) cubecart (dot) com
|
|
| License Type: CubeCart is NOT Open Source Software and Limitations Apply
|
|
| Licence Info: http://www.cubecart.com/site/faq/license.php
|
|
+--------------------------------------------------------------------------
|
|
| transfer.inc.php
|
|
| ========================================
|
|
| Core functions for the PROTX Gateway
|
|
+--------------------------------------------------------------------------
|
|
*/
|
|
|
|
// ** Base 64 Encoding function **
|
|
// PHP does it natively but just for consistency and ease of maintenance, let's declare our own function
|
|
function base64Encode($plain) {
|
|
// Initialise output variable
|
|
$output = "";
|
|
|
|
// Do encoding
|
|
$output = base64_encode($plain);
|
|
|
|
// Return the result
|
|
return $output;
|
|
}
|
|
|
|
|
|
// ** Base 64 decoding function **
|
|
// PHP does it natively but just for consistency and ease of maintenance, let's declare our own function
|
|
|
|
function base64Decode($scrambled) {
|
|
// Initialise output variable
|
|
$output = "";
|
|
|
|
// Do encoding
|
|
$output = base64_decode($scrambled);
|
|
|
|
// Return the result
|
|
return $output;
|
|
}
|
|
|
|
|
|
/* The SimpleXor encryption algorithm **
|
|
** NOTE: This is a placeholder really. Future releases of VSP Form will use AES or TwoFish. Proper encryption **
|
|
** This simple function and the Base64 will deter script kiddies and prevent the "View Source" type tampering **
|
|
** It won't stop a half decent hacker though, but the most they could do is change the amount field to something **
|
|
** else, so provided the vendor checks the reports and compares amounts, there is no harm done. It's still **
|
|
** more secure than the other PSPs who don't both encrypting their forms at all */
|
|
|
|
function simpleXor($data, $key) {
|
|
$output = "";
|
|
|
|
for($i = 0; $i < strlen($data); ) {
|
|
for($j = 0; $j < strlen($key); $j++, $i++) {
|
|
if($i < strlen($data))
|
|
$output .= $data[$i] ^ $key[$j];
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
|
|
/* The getToken function. **
|
|
** NOTE: A function of convenience that extracts the value from the "name=value&name2=value2..." VSP reply string **
|
|
** Works even if one of the values is a URL containing the & or = signs. */
|
|
|
|
function getToken($thisString) {
|
|
|
|
// List the possible tokens
|
|
$Tokens = array(
|
|
"Status",
|
|
"StatusDetail",
|
|
"VendorTxCode",
|
|
"VPSTxId",
|
|
"TxAuthNo",
|
|
"Amount",
|
|
"AVSCV2",
|
|
"AddressResult",
|
|
"PostCodeResult",
|
|
"CV2Result",
|
|
"GiftAid",
|
|
"3DSecureStatus",
|
|
"CAVV" );
|
|
|
|
// Initialise arrays
|
|
$output = array();
|
|
$resultArray = array();
|
|
|
|
// Get the next token in the sequence
|
|
for ($i = count($Tokens)-1; $i >= 0 ; $i--){
|
|
// Find the position in the string
|
|
$start = strpos($thisString, $Tokens[$i]);
|
|
// If it's present
|
|
if ($start !== false){
|
|
// Record position and token name
|
|
$resultArray[$i]->start = $start;
|
|
$resultArray[$i]->token = $Tokens[$i];
|
|
}
|
|
|
|
}
|
|
|
|
// Sort in order of position
|
|
sort($resultArray);
|
|
|
|
// Go through the result array, getting the token values
|
|
for ($i = 0; $i<count($resultArray); $i++)
|
|
{
|
|
// Get the start point of the value
|
|
$valueStart = $resultArray[$i]->start + strlen($resultArray[$i]->token) + 1;
|
|
// Get the length of the value
|
|
if ($i==(count($resultArray)-1))
|
|
{
|
|
$output[$resultArray[$i]->token] = substr($thisString, $valueStart);
|
|
}
|
|
else
|
|
{
|
|
$valueLength = $resultArray[$i+1]->start - $resultArray[$i]->start - strlen($resultArray[$i]->token) - 2;
|
|
$output[$resultArray[$i]->token] = substr($thisString, $valueStart, $valueLength);
|
|
}
|
|
|
|
}
|
|
|
|
// Return the ouput array
|
|
return $output;
|
|
|
|
}
|
|
|
|
// Randomise based on time
|
|
function randomise()
|
|
{
|
|
list($usec, $sec) = explode(' ', microtime());
|
|
return (float) $sec + ((float) $usec * 100000);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////
|
|
/////////////// END OF PROTX FUNCTIONS ///////////////
|
|
/////////////////////////////////////////////////////////
|
|
|
|
function repeatVars()
|
|
{
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
function fixedVars()
|
|
{
|
|
|
|
global $module, $orderSum, $config;
|
|
|
|
if(!empty($orderSum['add_2_d']))
|
|
{
|
|
|
|
$delAdd = $orderSum['add_1_d'].", ".$orderSum['add_1_d'].", ".$orderSum['town_d'].", ".$orderSum['county_d'].", ".$orderSum['country_d'];
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
$delAdd = $orderSum['add_1_d'].", ".$orderSum['town_d'].", ".$orderSum['county_d'].", ".$orderSum['country_d'];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!empty($orderSum['add_2']))
|
|
{
|
|
|
|
$invAdd = $orderSum['add_1'].", ".$orderSum['add_2'].", ".$orderSum['town'].", ".$orderSum['county'].", ".getCountryFormat($orderSum['country'],"id","iso");
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
$invAdd = $orderSum['add_1'].", ".$orderSum['town'].", ".$orderSum['county'].", ".getCountryFormat($orderSum['country'],"id","iso");
|
|
|
|
}
|
|
|
|
$VendorTxCode = 'CC4'.(rand(0,32000)*rand(0,32000));
|
|
|
|
$cryptVars =
|
|
"VendorTxCode=".$VendorTxCode
|
|
."&Amount=".$orderSum['prod_total']
|
|
."&Currency=".$config['defaultCurrency']
|
|
."&Description=Cart - ".$orderSum['cart_order_id']
|
|
."&CustomerEmail=".$orderSum['email']
|
|
."&CustomerName=".$orderSum['name']
|
|
."&VendorEmail=".$config['masterEmail'] ."&DeliveryAddress=".$delAdd
|
|
."&DeliveryPostCode=".$orderSum['postcode_d']
|
|
."&BillingAddress=".$invAdd
|
|
."&BillingPostCode=".$orderSum['postcode']
|
|
."&ContactNumber=".$orderSum['phone']
|
|
// ."&ApplyAVSCV2=0&Apply3DSecure=0&ShoppingBasket=ON" We have taken our the ShoppingBasket Variable - It seemed Protx didn't need it.
|
|
."&ApplyAVSCV2=0&Apply3DSecure=0"
|
|
."&SuccessURL=".$GLOBALS['storeURL']."/index.php?_g=rm&type=gateway&cmd=process&module=Protx&cart_order_id=".$orderSum['cart_order_id']
|
|
."&FailureURL=".$GLOBALS['storeURL']."/index.php?_g=rm&type=gateway&cmd=process&module=Protx&cart_order_id=".$orderSum['cart_order_id'];
|
|
|
|
$encrypted = base64Encode(SimpleXor($cryptVars,$module['passphrase']));
|
|
|
|
$hiddenVars = "<input type='hidden' name='VendorTxCode' value='".$VendorTxCode."' />
|
|
<input type='hidden' name='VPSProtocol' value='2.22' />
|
|
<input type='hidden' name='TxType' value='PAYMENT' />
|
|
<input type='hidden' name='Vendor' value='".$module['acNo']."' />
|
|
<input type='hidden' name='Crypt' value='".$encrypted."' />";
|
|
|
|
return $hiddenVars;
|
|
}
|
|
|
|
///////////////////////////
|
|
// Other Vars
|
|
////////
|
|
|
|
if($module['gate'] == "sim") {
|
|
|
|
$formAction = "https://ukvpstest.protx.com/VSPSimulator/VSPFormGateway.asp";
|
|
|
|
} elseif($module['gate'] == "test") {
|
|
|
|
$formAction ="https://ukvpstest.protx.com/vps2form/submit.asp";
|
|
|
|
} elseif($module['gate'] == "live"){
|
|
|
|
$formAction ="https://ukvps.protx.com/vps2form/submit.asp";
|
|
|
|
}
|
|
|
|
$formMethod = "post";
|
|
$formTarget = "_self";
|
|
$transfer = "auto";
|
|
?>
|