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

时间:2013-08-08 08:52:31

标签: php shopping-cart

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

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

7 个答案:

答案 0 :(得分:4)

以下是我用来生成随机密钥的方法,即使它有点冗长,你也可以实现独特的随机密钥。

$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(...)

答案 1 :(得分:1)

不要在uniqueid()上使用md5(),它实际上会在安全性上松动。要附加或前置md5值就可以了。

那说我会坚持http://www.php.net/manual/en/pdo.lastinsertid.php来获取新插入的ID,但也会生成带有前缀参数的uniqueid(),让我们说'username_',这样它就应该是非常独特的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了订单表的主键外,还有字符串,年,月,日和4位数的组合。可能很有用。

例如。

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

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

其中OS可以是您商店名称的首字母,接下来的4位数字是年份,接下来的2位数字是月份,接下来的2位数字是日期,接下来的4位数字(从每天0001开始)可以识别每天的订单数量。< / p>

答案 4 :(得分:0)

如果你真的想要一个唯一ID,这里是我正在使用的代码。这个简单创建了7个字符的字符串,如果它已经存在于数据库中 - &gt;重新生成新的,直到它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

答案 5 :(得分:0)

我想说,制作最独特ID的方法是当前时间戳(使用time()的unix)的组合,然后追加和/或在其前面加上当前用户的用户名。这样几乎不可能创建副本。您也可以添加最后插入的ID。 在我看来,这三者的组合是一个简单的方法,并且由于time()每秒都会改变而且用户不太可能在完全相同的秒内添加2个订单,因此几乎不可能复制。

答案 6 :(得分:-1)

基于数据库表的东西?带有AUTO_INCREMENT的列。您可以使用以下代码获取PDO的最后一个插入ID:http://www.php.net/manual/en/pdo.lastinsertid.php

或类似

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