如何在购物车中生成唯一的交易id


How to generate a unique transaction id in a shopping cart

我正在开发一个购物车和一个本地支付网关,该网关要求每笔交易都有一个唯一的订单id。该id应该根据订单详细信息保存在数据库中,并作为变量发送到支付网关。我的难题是如何生成唯一id,以及如何在将变量发送到网关之前保存它,以便在从网关的IPN收到响应时检查它是否匹配。有问题的变量如下所示:

$reference = $_POST['reference'];//unique order id of the transaction, generated by merchant

以下是我用来生成随机密钥的方法,尽管它有点长,但你可以实现唯一的随机密钥。

$id.time().uniqid(mt_rand(),true)

uniqid()-这将生成13个字符的uniqid

mt_rand()-使用Mersenne Twister算法生成随机数,速度是rand()的4倍

uniqid(mt_rand())-在随机生成数前面加上uniqueid

uniqid(mt_rand(),true)-为了获得更强的随机性,我通过将第二个参数设置为"true"来启用uniqid的熵

$id。time().uniqid(mt_rand(),true)-这里$id可以是userid、productid或您想要选择的任何id,time()将生成当前的unix时间戳,最后我将附加我的uniqid(…)

不要在uniqueid()上使用md5(),它实际上会在安全性上松散。附加或预附加md5值是可以的。

也就是说我会坚持http://www.php.net/manual/en/pdo.lastinsertid.php以获取新插入的ID,但也生成前缀参数设置为"username_"的uniqueid(),这样它应该是非常唯一的。

如果你真的想要一个唯一的id,下面是我正在使用的代码。这个简单的方法创建7个字符的字符串,如果它已经存在于数据库中,则->重新生成新的,直到它是100%唯一的。uniqid()并不是真正唯一的id,你可以在那里放你自己的前缀,它可以与我的代码混合,但单独放uniqid)到base64、md5和sha1,我不知道还有什么不是唯一的。

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }
    return $str;
}
$unique_id = randString(7);  
while(mysqli_num_rows(mysqli_query($con, "SELECT unique_id FROM table WHERE unique_id = '".mysqli_real_escape_string($con, $unique_id)."'")) > 0) { 
   $unique_id = randString(7);
}
//insert this id into database and use it

将订单详细信息插入表格中。该表的主键应设置AUTO INCREMENT属性。然后检索最后插入的idhttp://php.net/manual/en/function.mysql-insert-id.php

除了订单表的主键之外,字符串、年、月、日和4位数字的编号的组合也很有用。

例如。

2013年8月8日下的订单可能有以下订单号:os2013008080001os2013008080002

2013年8月9日下的订单可能有以下订单号:os20130809001os20130809002OS201308090003

其中OS可以是您店铺名称的首字母,后面的4位数字是年份,后面的2位数字是月份,后面的两位数字是日期,后面的四位数字(从每天0001开始)可以识别每天的订单数量。

我想说,制作最唯一ID的方法是组合当前时间戳(unix使用time()),然后用类似于当前用户用户名的东西附加和/或预加它。这样几乎不可能创建一个副本。您还可以添加最后插入的ID。在我看来,这三种方法的组合是一种简单的方法,由于时间()每秒都会改变,用户不太可能在同一秒添加两个订单,因此几乎不可能重复。

基于数据库表的东西?具有AUTO_INCREMENT的列。您可以通过以下方式获取PDO的最后一个插入ID:http://www.php.net/manual/en/pdo.lastinsertid.php

或者类似的东西

$reference = sha1(md5(time()));