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

  • 相关阅读:
    选择排序
    unity面试准备
    标识位
    table.insert(tableName, v)
    使用bmfont制作字体
    长按tools Icon 弹出Tips音效
    钓鱼功能
    jQuery鼠标移到小图显示大图效果
    ThinkPHP3.2.3中如何显示二级栏目
    ThinkPHP3.2.2自定义success及error跳转页面
  • 原文地址:https://www.cnblogs.com/attilax/p/15199893.html
Copyright © 2020-2023  润新知