2008-10-13 72 views
7

因此,我需要生成一個代碼,可以綁定到一個特定的用戶/潛在客戶,其中內置了美元數量。它需要是可逆的,以便客戶應用程序可以確認代碼的有效性並應用經理打算的折扣。生成用戶特定的1次優惠券代碼

我想盡可能縮短代碼,但它需要很好的模糊處理,以便推銷員不能自己動手。

我可以想出一些自己彈出數字的東西,除以pi並轉換爲十六進制,不過我會對社區的想法或最佳實踐感興趣。

我在C#中這樣做,但我期望可以翻譯任何語言的方法。

編輯: 澄清。我不能提前儲存這些東西,代碼必須隨時建立並隨身攜帶所有信息。

例如。推銷員14打電話給客戶773,並想給他們500美元的訂單。 14,773和500必須位於優惠券代碼中,並且可以在推銷員鍵入代碼後在客戶端應用程序中提取。

+0

你能在這裏澄清協議?聽起來你有很多派對,一個推銷員S,一個客戶(客戶?)C,一箇中央數據庫D和一個客戶端應用程序A.誰和誰談話,以什麼順序談話,哪個派對告訴哪個對方什麼? ?沒有這個,很難回答你的問題。 – 2008-12-11 16:59:25

回答

7

生成用於簽名的公鑰/私鑰對。使用私鑰對用戶ID和優惠券值的組合進行數字簽名。將優惠券值+簽名發佈爲優惠券代碼,例如使用字母和數字進行編碼。客戶端應用程序將通過重新創建最初簽名的數據組合(例如,將用戶ID預先添加到優惠券值)並驗證數字簽名來驗證代碼。

2

我會使用客戶代碼和優惠券到期日期。至於驗證,您可以將有效的優惠券存儲在數據庫中並進行驗證。您可以每天掃描一次優惠券表以清除過期的代碼。

+0

有些國家(如瑞士),依法優惠券永不過期(即使通常會在優惠券上打印到期日期)。用發放日期替換到期日期。 – 2008-10-13 12:33:59

+0

我喜歡這個答案,因爲它爲所有其他依賴密碼學的答案提供了一個很好的選擇。關於此解決方案唯一要注意的是,您無法在離線模式下驗證優惠券代碼。 – Alexander 2008-10-13 12:46:04

+0

稍微更乾淨的解決方案導致更短的優惠券代碼,是生成完全隨機的短優惠券ID(例如,8個字母數字數字長),將它們連同所有相關優惠券信息一起存儲在數據庫中,例如客戶ID,代表ID ,優惠券價值,到期... – Alexander 2008-10-13 12:51:32

5

聽起來就像是非對稱加密的情況。您可以將公鑰分配給每個人,從而爲他們提供驗證優惠券的信息,但是創建帳戶的能力將取決於私鑰的所有者(=您)。

我會創建一個串行化到XML的優惠券類,然後加密xml字符串。驗證將解密字符串,看看它是否是有效的XML(我建議不要反序列化的對象之前沒有檢查這一點)。

1

我從你的措辭,你不想代碼存儲在數據庫中(如果你沒有,你可以簡單地驗證對數據庫中的每個代碼)

所以問題的方式猜測,是什麼你可以做的就是獲取有關優惠券內容的所有相關信息,然後將它與一個祕密鹽一起散列以防止篡改。

因此,假設你想的優惠券供用戶23價值$ 200,你可以建立一個字符串,如「23_200」,並以「BillTheLizard」的祕密鹽計算MD5哈希得到2671519131e974ee6fc746151e98f4a8,因此,完整的代碼,你給顧客是200_23_2671519131e974ee6fc746151e98f4a8

現在,當您收到的代碼,你打破它拆開,並檢查MD5(「200_23」 +祕密)= 2671519131e974ee6fc746151e98f4a8驗證該值

編輯:如果一個32字符的哈希太長了,你總是可以截斷它,例如把它砍到8個字符仍然會給你4294967296不同的散列值。

1

這只是總結迄今爲止的答案。有生成這樣的優惠券代碼的兩個主要不同的方式:

  1. 集中式解決方案:關於每個優惠券的信息被存儲在數據庫中。然後可以隨機生成優惠券代碼並且簡短 - 它只是對數據庫中記錄的引用,其中包含所有必要信息,例如優惠券價值,客戶ID,代表ID。驗證這樣的代碼需要在線訪問您的服務器。

  2. 分散式解決方案:優惠券是一種獨立的信息,可以在離線模式下進行驗證,無需訪問任何服務器。結果,優惠券代碼必須包含一些(甚至全部)信息。最安全的方法是使用非對稱密碼術或Message Authentication Code,以便私人密鑰持有者(您)以外的任何人都不能生成優惠券。

1

史蒂夫·吉布森談到他的網站上關於一次性密碼,但沒有理由你不能用它來創建一個時間的優惠券代碼:http://grc.com/ppp

相關問題