1. 程式人生 > >paip 銀聯支付介面訂單號uuid演算法

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 "";        }