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

原文地址:https://www.cnblogs.com/attilax/p/15199893.html