簡體   English   中英

如何在購物車中生成唯一的交易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可以是用戶ID,產品ID或您要選擇的任何ID,time()會生成當前的UNIX時間戳,最后我將附加我的uniqid (......)

不要在uniqueid()上使用md5(),這實際上會使安全性喪失。 附加或添加md5值是可以的。

也就是說,我會堅持使用http://www.php.net/manual/zh-CN/pdo.lastinsertid.php來獲取新插入的ID,但還會生成帶有設置為“ username_”的前綴參數的uniqueid()它應該非常獨特。

將訂單詳細信息插入表中。 該表的主鍵應具有AUTO INCREMENT屬性。 然后檢索最后插入的ID http://php.net/manual/en/function.mysql-insert-id.php

除訂單表的主鍵外,還包含字符串,年,月,日和4位數字的組合。 可能會有用。

例如。

2013年8月8日下的訂單可能具有以下訂單號:OS201308080001 OS201308080002

2013年8月9日下的訂單可能具有以下訂單號:OS201308090001 OS201308090002 OS201308090003

其中OS可能是商店名稱的首字母縮寫,接下來的4位數字是年份,接下來的2位數字是月份,接下來的2位數字是日期,接下來的4位數字(每天從0001開始)可以識別每天的訂單數量。

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

我要說的是,使唯一ID唯一的方法是組合當前時間戳(使用time()進行unix),然后在其前面添加和/或添加諸如當前用戶用戶名之類的名稱。 這樣,幾乎不可能創建副本。 您也可以添加最后插入的ID。 在我看來,這三個方法的組合是一種簡單的方法,並且由於time()每秒都會更改,並且用戶不太可能能夠在同一時間添加2個訂單,因此幾乎不可能進行重復操作。

是基於數據庫表的內容嗎? 具有AUTO_INCREMENT的列。 您可以使用以下方法使用PDO獲取最后一個插入ID: http : //www.php.net/manual/en/pdo.lastinsertid.php

或類似的東西

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM