PHP script for creating order numbers with checksum and prefix
I made these two functions to create order numbers with checksum and prefix.
It uses a predefined prefix "OLR" and a 2 digit checksum at the end of the order number. So if real identifier of an order is 1000 the order number will be OLR0100095
1000 => OLR0100095
prefix: OLR
order_id: 1000
checksum: 95
Other examples:
1 => OLR0000143
100 => OLR0010061
1000 => OLR0100095
Numbers above the 5 digit zero pre-filler will also work, but will extend the total number of the entire order number string.
<?php
/**
* Create an order number with prefix and checksum
* @param type $id
* @return type
*/
function createOrderNumber($id, $prefix = "OLR"){
$base = $prefix.sprintf("%05d", $id);
$bignum = hexdec( substr(sha1($id), 0, 15) );
$checksum = sprintf("%02d", ($bignum % 99));
return $base.$checksum;
}
/**
* Validate a given order number
* @param type $order_number
* @param type $show_details
* @return boolean OR explaining
*/
function validateOrderNumber($order_number, $show_details = FALSE, $prefix = "OLR"){
$checksum = substr($order_number, -2);
$order_id = (int) substr(str_replace($prefix, "", $order_number), 0, strlen($order_number)-(strlen($prefix))-2);
$control_order = createOrderNumber($order_id);
if($control_order === $order_number) {
$valid = "yes";
$valid_bool = TRUE;
}else{
$valid = "no";
}
if($show_details){
return "checksum: $checksum order_id: $order_id valid: $valid";
}else{
return $valid_bool;
}
}
/**
* Test the functions
**/
$i = 1;
echo "$i => ".createOrderNumber($i);
$validation = validateOrderNumber(createOrderNumber($i), TRUE);
echo "$validation<br>";
$i = 100;
echo "$i => ".createOrderNumber($i);
$validation = validateOrderNumber(createOrderNumber($i), TRUE);
echo "$validation<br>";
for ($i = 1000; $i < 1100; $i++){
$order_number = createOrderNumber($i);
$validation = validateOrderNumber($order_number, TRUE);
echo "$i => ".$order_number. " validation:".$validation;
echo "<br>";
}
//Out come of the test:
1 => OLR0000143checksum: 43 order_id: 1 valid: yes
100 => OLR0010061checksum: 61 order_id: 100 valid: yes
1000 => OLR0100095 validation:checksum: 95 order_id: 1000 valid: yes
1001 => OLR0100193 validation:checksum: 93 order_id: 1001 valid: yes
1002 => OLR0100200 validation:checksum: 00 order_id: 1002 valid: yes
1003 => OLR0100305 validation:checksum: 05 order_id: 1003 valid: yes
1004 => OLR0100461 validation:checksum: 61 order_id: 1004 valid: yes
1005 => OLR0100536 validation:checksum: 36 order_id: 1005 valid: yes
1006 => OLR0100683 validation:checksum: 83 order_id: 1006 valid: yes
...etc
?>
Knowledge keywords: