paip 銀聯支付介面訂單號uuid演算法
paip.銀聯支付介面訂單號uuid演算法
這幾天給專案接了個銀聯支付介面,介面訂單號uuid演算法按文件說明如下:
在銀聯支付時,商戶提交給銀聯支付系統的訂單號(長度為16 個位元組的數字串)前4是自定義的,商戶可以根據商戶業務的不同,頭四位不同。例如ET業務為4000,郵件業務為5000,實物銷售業務為6000等。此外訂單號的5-9位必須為商戶號MerId的最後5位。
也就是說,共16位,其中5位被佔用..有效利用的只能是11位了。。
而我的專案訂單號格式是yyyyMMdd_HHmmssfff,比如20120816_1918011234
長度達19位,看來在傳參時需要轉為銀聯格式的訂單號,因為時間要精確到MS,所以最短也是yyMMddHHMMssfff格式,需要15位..
看來只能使用相對ms數了。我先定一個基準時間,我用2012-01-01 00:00:00.000,然後現在時間減去這個基準時間,得到毫秒總數,先用11位9算了下,可以得到了最大載止時間是 2015-03-03 09:46:39 ,可以迴圈使用..到頭再從0開始..
然後把這11訂單號分成兩部分,中間插入商戶號MerId的最後5位。。就拼成了符合銀聯介面標準的訂單號了..
------得到11位訂單號,精確到MS.. // from 2012.1.1 public static string getUUID11(string uuid) {//20120816_1918011234 uuid = uuid.Substring(0, 18); DateTime dt1 = new DateTime(2012, 1, 1); DateTime dt2 = DateTime.ParseExact(uuid, "yyyyMMdd_HHmmssfff", null); // dt2.Ticks = "634807414811230000"; TimeSpan ts = dt2 - dt1; string ms = ts.TotalMilliseconds.ToString(); ms = pad0left(ms, 11); return ms; }
//計算最大最大載止時間 , private static string test2( ) { string TotalMilliseconds = "99999999999"; long ticks =long.Parse( TotalMilliseconds) * 10000; TimeSpan ts = new TimeSpan(ticks); DateTime dt1 = new DateTime(2012, 1, 1);
DateTime dt2 = dt1.Add(ts); //{2015-03-03 09:46:39
return ""; }