最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#校驗(yàn)時(shí)間格式的場景分析

 更新時(shí)間:2022年08月03日 08:37:02   作者:CNBLOG  
本文通過場景分析給大家講解C#里如何簡單的校驗(yàn)時(shí)間格式,本次的場景屬于比較常見的收單API,對第三方的訂單進(jìn)行簽名驗(yàn)證,然后持久化到數(shù)據(jù)庫,需要的朋友跟隨小編一起看看吧

前言:

晚上打算睡覺的時(shí)候,群里反饋訂單接收失敗,開工排查問題,日志顯示驗(yàn)簽失敗,發(fā)現(xiàn)一個(gè)蠻有意思的BUG,總算有了一個(gè)寫作的素材

場景描述

本次的場景屬于比較常見的收單API,對第三方的訂單進(jìn)行簽名驗(yàn)證,然后持久化到數(shù)據(jù)庫,簽名規(guī)則大致是將參數(shù)key按照升序排序,然后根據(jù)key=value&進(jìn)行字符串拼接,最后加上秘鑰,按照指定的加密方式生成簽名

前戲一

設(shè)計(jì)之初,肯定是怎么簡單怎么來,粗略代碼如下

[HttpPost]
public async Task<IActionResult> TestSendOrder([FromBody] ReceiveOrderRequest request)
{
    var secret_key = _options.Value.SecretKey;
    var url = _options.Value.Host;
    //1.將模型轉(zhuǎn)成json格式字符串
    var param = JsonConvert.SerializeObject(request);
    //2.將json格式字符串,序列化成有序字典
    SortedDictionary<string, string> dict = JsonConvert.DeserializeObject<SortedDictionary<string, string>>(param);
    //3.循環(huán)字典,按規(guī)則拼接成待加密的明文字符串
    var data = "";
    foreach (var item in dict)
    {
        if (item.Key == "sign") continue;
        data += $"{item.Key}={item.Value}&";
    }
    data += $"secret_key={secret_key}";
    //4.生成簽名
    var sign = EncryptHelper.SHA1Encryption(data);
    request.sign = sign;
    //5.模擬訂單推送
    var res = await _httpClientHelper.PostData(url, JsonConvert.SerializeObject(request));
    return Ok(res);
}

不出意外,肯定是要出意外的,聯(lián)調(diào)的時(shí)候,發(fā)現(xiàn)與第三方待加密的明文字符串不一致,問題出在JsonConvert序列化上,這里有兩個(gè)問題

 1. DateTime格式不一致
    如: DateTime dt = "2022-07-30 12:26:56"
    序列化后 dt=2022-07-30T12:26:56
    2. decimal小數(shù)點(diǎn)后自動(dòng)補(bǔ)0
    如: decimal price = 10
    序列化后 price=10.0

針對第一個(gè)問題,很好解決,我們在序列化的時(shí)候,指定DateTime的格式即可

var iso = new IsoDateTimeConverter();
iso.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
var param = JsonConvert.SerializeObject(request, iso);

針對第二個(gè)問題,處理起來就比較麻煩了,要重寫底層的一些東西(主要是我不會(huì)),這不符合"簡單"的定義,得換個(gè)方案

前戲二

通過反射遍歷對象,然后將屬性名稱與值,丟到有序字典里面,這里我寫了個(gè)方法來判斷值是否為時(shí)間,如果是時(shí)間類型,則格式化,代碼如下

public string GetFmortDateTime(string strDate) 
{
    DateTime dt;
    if (DateTime.TryParse(strDate, out dt))
    {
        return dt.ToString("yyyy-MM-dd HH:mm:ss");
    }
    else
    {
        return strDate;
    }
}   

不出意外,肯定是要出意外的,不然也不會(huì)有這個(gè)素材去水一篇博客了

正戲

有個(gè)字段的值是9.9,結(jié)果被序列化成了 2022-09-09 00:00:00,吃了一驚,看來是把這個(gè)數(shù)字格式化成月份日份了,真有意思,又GET到一個(gè)新姿勢,發(fā)現(xiàn)問題解決問題就簡單多了,因?yàn)槎x了數(shù)據(jù)模型,我們直接在反射的時(shí)候,獲取該值的類型做判斷即可

public static async Task<bool> CheckSign(dynamic request, string secret)
{
    SortedDictionary<string, string> dict = new SortedDictionary<string, string>();
    foreach (PropertyInfo p in request.GetType().GetProperties())
    {
        var value = p.GetValue(request);
        if (value == null)
        {
            dict[p.Name] = "";
        }
        else
        {
            var valueType = value.GetType();
            if (valueType.Name == "DateTime") 
            {
                dict[p.Name] = Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss");
            }
            else 
            {
                dict[p.Name] = value.ToString();
            }
        }
    }
    var sign = dict["sign"];
    dict.Remove("sign");
    var data = "";
    foreach (var item in dict)
    {
        data += $"{item.Key}={item.Value}&";
    }
    data += $"secret_key={secret}";
    var new_sign = EncryptHelper.SHA1Encryption(data);
    return new_sign.ToLower() == sign.ToLower();
}

尾戲

看到這里,可能就有小伙伴有話要說了,你這定義了一個(gè)模型,還要通過循環(huán)兩次,才能生成待加密的明文字符串,不符合"簡單",干脆直接用個(gè)有序字典去接收參數(shù)好了,這樣只用循環(huán)一次

秒啊,秒啊,秒啊,妙蛙種子都沒有你秒,這種做法不是不行,但是后面維護(hù)的人估計(jì)要抓狂了,按照規(guī)約,我們是不推薦這么干的,這次就破例這么干一次,拋出另一個(gè)問題,一個(gè)字符串,如何判斷它是一個(gè)我們約定的時(shí)間格式,很顯然9.9并不是約定的時(shí)間格式

這里推薦 DateTime.ParseExact方法,可以根據(jù)我們自定義的方式,來格式化時(shí)間,舒坦了...

public static string GetFmortDateTime(string strDate)
{
    string[] format = { "yyyy-MM-ddTHH:mm:ss" };
    DateTime dt;
    if (DateTime.TryParseExact(strDate,format,CultureInfo.InvariantCulture,DateTimeStyles.None,out dt))
    {
        return dt.ToString("yyyy-MM-dd HH:mm:ss");
    }
    else
    {
        return strDate;
    }
}

到此這篇關(guān)于C#里如何簡單的校驗(yàn)時(shí)間格式的文章就介紹到這了,更多相關(guān)C#校驗(yàn)時(shí)間格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中詳細(xì)描述了C#生成互不相同隨機(jī)數(shù)的各個(gè)步驟及所用到的函數(shù),非常具有借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C# 泛型編譯特性對性能的影響小結(jié)

    C# 泛型編譯特性對性能的影響小結(jié)

    C#作為一種強(qiáng)類型語言,具有豐富的泛型支持,允許開發(fā)者編寫可以應(yīng)對不同數(shù)據(jù)類型的通用代碼,這篇文章主要介紹了C# 泛型編譯特性對性能的影響 ,需要的朋友可以參考下
    2023-11-11
  • C#泛型詳解及關(guān)鍵字作用

    C#泛型詳解及關(guān)鍵字作用

    這篇文章主要來講講c#中的泛型,因?yàn)榉盒驮赾#中有很重要的位置,對于寫出高可讀性,高性能的代碼有著關(guān)鍵的作用,大家都知道泛型公共語言運(yùn)行庫是非常重要功能,那么為什么使用泛型呢,帶著這個(gè)問題一起通過本文學(xué)習(xí)下吧
    2021-08-08
  • c# HttpClient設(shè)置超時(shí)的步驟

    c# HttpClient設(shè)置超時(shí)的步驟

    這篇文章主要介紹了c# HttpClient設(shè)置超時(shí)的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#操作非持久化內(nèi)存映射文件詳解

    C#操作非持久化內(nèi)存映射文件詳解

    多個(gè)進(jìn)程之間,通過操作未映射到磁盤上現(xiàn)有文件的內(nèi)存映射文件,可以實(shí)現(xiàn)數(shù)據(jù)共享和類似進(jìn)程間通訊的功能,下面我們就來學(xué)習(xí)一下C#如何操作非持久化內(nèi)存映射文件的吧
    2023-12-12
  • 適合初學(xué)者開發(fā)的C#在線英漢詞典小程序

    適合初學(xué)者開發(fā)的C#在線英漢詞典小程序

    這篇文章主要為大家詳細(xì)介紹了適合初學(xué)者開發(fā)的C#在線英漢詞典小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • c# 文件壓縮zip或?qū)ip文件解壓的方法

    c# 文件壓縮zip或?qū)ip文件解壓的方法

    下面小編就為大家分享一篇c# 文件壓縮zip或?qū)ip文件解壓的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法

    C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法,較為詳細(xì)的分析了C#基于DataTable保存Excel數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • c# 判斷是否為空然后賦值的4種實(shí)現(xiàn)方法

    c# 判斷是否為空然后賦值的4種實(shí)現(xiàn)方法

    下面小編就為大家分享一篇c# 判斷是否為空然后賦值的4種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法

    C# 去除首尾字符或字符串的方法,需要的朋友可以參考一下
    2013-04-04

最新評論

精河县| 陆川县| 新乐市| 九江县| 务川| 巴南区| 河曲县| 全州县| 邯郸市| 宜黄县| 南木林县| 阿拉善左旗| 怀柔区| 汕头市| 甘孜县| 姚安县| 青铜峡市| 昌黎县| 武定县| 景谷| 隆化县| 托克托县| 长岛县| 洛宁县| 双峰县| 江陵县| 上饶县| 和田县| 浮梁县| 洞头县| 涿鹿县| 竹山县| 屯门区| 上林县| 寿光市| 乌苏市| 磐石市| 峨眉山市| 宜君县| 怀仁县| 龙海市|