【问题标题】:How to generate a unique transaction id in a shopping cart如何在购物车中生成唯一的交易 ID
【发布时间】:2013-08-08 08:52:31
【问题描述】:

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

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

【问题讨论】:

  • 感谢所有回复。检索最后插入的 id 可以优雅地解决这个问题。

标签: php shopping-cart


【解决方案1】:

这是我用来生成随机密钥的方法,即使它有点长,您也可以获得唯一的随机密钥。

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

【讨论】:

  • 很好的一步一步的解释。因为我需要一个随机数,所以我改用time().''.mt_rand();
【解决方案2】:

不要在 uniqueid() 上使用 md5() 它实际上会降低安全性。附加或前置 md5 值是可以的。

也就是说我会坚持使用http://www.php.net/manual/en/pdo.lastinsertid.php 来获取新插入的 ID,但还会生成 uniqueid() 并将前缀参数设置为让我们说“用户名_”,这样它应该是非常独特的。

【讨论】:

    【解决方案3】:

    如果你真的想要一个唯一 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
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        除订单表主键外,由字符串、年、月、日和4位数字组成。很有用。

        例如。

        2013 年 8 月 8 日下的订单可能有以下订单号: OS201308080001 操作系统201308080002

        2013 年 8 月 9 日下的订单可能有以下订单号: 操作系统201308090001 操作系统201308090002 操作系统201308090003

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

        【讨论】:

          【解决方案6】:

          我想说,制作最唯一 ID 的方法是结合当前时间戳(unix 使用 time()),然后附加和/或在其前面加上当前用户用户名之类的东西。这样几乎不可能创建副本。您也可以添加最后插入的 ID。 在我看来,这三者的结合是一种简单的方法,并且几乎不可能出现重复,因为 time() 每秒都会改变,并且用户不太可能在完全相同的秒内添加 2 个订单.

          【讨论】:

            【解决方案7】:

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

            或者类似的东西

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

            【讨论】:

            • 如果有两个用户同时使用该函数,加密将返回相同的$reference变量。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-31
            • 2014-01-26
            • 1970-01-01
            • 2014-11-03
            • 1970-01-01
            相关资源
            最近更新 更多