欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#校驗時間格式的場景分析

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

前言:

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

場景描述

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

前戲一

設計之初,肯定是怎么簡單怎么來,粗略代碼如下

[HttpPost]
public async Task<IActionResult> TestSendOrder([FromBody] ReceiveOrderRequest request)
{
    var secret_key = _options.Value.SecretKey;
    var url = _options.Value.Host;
    //1.將模型轉成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)調的時候,發(fā)現與第三方待加密的明文字符串不一致,問題出在JsonConvert序列化上,這里有兩個問題

 1. DateTime格式不一致
    如: DateTime dt = "2022-07-30 12:26:56"
    序列化后 dt=2022-07-30T12:26:56
    2. decimal小數點后自動補0
    如: decimal price = 10
    序列化后 price=10.0

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

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

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

前戲二

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

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

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

正戲

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

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();
}

尾戲

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

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

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

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

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

相關文章

  • c#動態(tài)編譯執(zhí)行對象方法示例 運用映射機制創(chuàng)建對象

    c#動態(tài)編譯執(zhí)行對象方法示例 運用映射機制創(chuàng)建對象

    本示例核心技術是運用.NET動態(tài)編譯技術+.NET映射技術,把一個代碼塊中的代碼,動態(tài)編譯成程序集后,在運用映射機制,創(chuàng)建對象示例,調用對象方法
    2014-01-01
  • C#實現掃雷游戲

    C#實現掃雷游戲

    這篇文章主要為大家詳細介紹了C#實現掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C#實現SMTP服務發(fā)送郵件的示例代碼

    C#實現SMTP服務發(fā)送郵件的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現SMTP服務發(fā)送郵件的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C#環(huán)形緩沖區(qū)(隊列)完全實現

    C#環(huán)形緩沖區(qū)(隊列)完全實現

    這篇文章主要為大家詳細介紹了C#環(huán)形緩沖區(qū)(隊列)完全實現代碼,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 基于WPF實現3D畫廊動畫效果的示例代碼

    基于WPF實現3D畫廊動畫效果的示例代碼

    這篇文章主要為大家詳細介紹了如何基于WPF實現簡單的3D畫廊動畫效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • C#創(chuàng)建及讀取DAT文件操作

    C#創(chuàng)建及讀取DAT文件操作

    這篇文章主要介紹了C#創(chuàng)建及讀取DAT文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#實現公式計算驗證碼的示例詳解

    C#實現公式計算驗證碼的示例詳解

    現在很多的平臺已經不使用普通的數字、字母等驗證碼了,取而代之的是拼圖類、選圖類、旋轉類或者計算類的驗證碼。本文將利用C#實現一個公式計算驗證碼,感興趣的可以了解一下
    2022-10-10
  • C#使用哈希表實現XML文件查詢

    C#使用哈希表實現XML文件查詢

    這篇文章主要為大家詳細介紹了C#如何使用哈希表實現XML文件查詢功能,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-02-02
  • 詳解C#編程中一維數組與多維數組的使用

    詳解C#編程中一維數組與多維數組的使用

    這篇文章主要介紹了詳解C#編程中一維數組與多維數組的使用,包括數組初始化等基礎知識的講解,需要的朋友可以參考下
    2016-01-01
  • 簡介Winform中創(chuàng)建用戶控件

    簡介Winform中創(chuàng)建用戶控件

    用戶控件可以讓開發(fā)人員對VS控件進行組裝。下面我們來創(chuàng)建一個按鈕的用戶控件我們可以給它添加屬性,并且添加相應鼠標移入、移出事件。
    2013-03-03

最新評論