.NET中將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),並使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA


前言:

   前段時間因為項目進度比較繁重所以一直都沒有時間更新博客,內心深深的負重感,沒有履行年初立下的flag。不過這個月會把上個月沒有完成的任務補上來,咱們可不是喜歡拖欠任務的攻城獅。哈哈,廢話不多說,接下來是要總結下關於對接支付時我們經常會遇到的將對應集合中的參數按照ASCII碼按照從小到大排序,並使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA,其實對於有些參數比較少的而已我們完全可以自己使用固定拼接的方式拼接好來,但是假如參數集合中的參數多達十幾個呢?你還是願意用死方法一個一個的拼接嗎?當然我是不願意的,下面是我在網上的找的一個關於參數ASCII按從小到大排序的例子並結合自己的需求而總結的一個比較好的方法,已經在項目中使用了(老實說.Net對接美團支付真的是心累,慶幸的是現在已經無縫對接完成了)!

代碼實現:

/// <summary>
/// 將參數模型轉為按照ASCII碼從小到大排序的並且通過鍵值對的格式拼接而成的字符串如:(stringA="appId=xxxxxx&body=test&merchantId=xxxxx&random=xxxx&key=xxxx")
/// </summary>
/// <param name="rqData">實例的支付參數模型</param>
/// <returns></returns>
public string GetParameterAsciiAsc(paymentModel rqData)
{
//rqData為自己實例化的支付參數模型
Dictionary<string, string> stringSignTemp = new Dictionary<string, string>();
stringSignTemp.Add("appId",rqData.appId.ToString());
stringSignTemp.Add("body",rqData.body);
stringSignTemp.Add("channel",rqData.channel);
stringSignTemp.Add("merchantId",rqData.merchantId.ToString());
stringSignTemp.Add("notifyUrl", rqData.notifyUrl);
stringSignTemp.Add("outTradeNo", rqData.outTradeNo);
stringSignTemp.Add("openId", rqData.openId);
stringSignTemp.Add("random",random);
stringSignTemp.Add("subject", rqData.subject);
stringSignTemp.Add("totalFee",(rqData.totalFee).ToString());//單位為分
stringSignTemp.Add("tradeType", rqData.tradeType);

var stringSign=JoinToStrForm(stringSignTemp);

return stringSign;
}


/// <summary>
/// 將字典集合轉化為String類型字符串,並按照參數名ASCII碼從小到大排序(字典序)
/// </summary>
/// <param name="dataPara">字典集合數據</param>
/// <returns></returns>
public string JoinToStrForm(Dictionary<string, string> dataPara)
{
var parameterAsc= dataPara.OrderBy(x => x.Key, new ComparerString()).ToDictionary(x => x.Key, y => y.Value);//參數按照參數名ASCII碼從小到大排序(字典序)
List<string> list = new List<string>();
foreach (var item in parameterAsc)
{
//通過key,value拼接key=value
list.Add(item.Key + "=" + item.Value.Replace("#", "").Replace("?", "").Replace("&", "").Replace("=", ""));
}

 return string.Join("&", list);
}

/// <summary>
/// 對象字符串比較
/// </summary>
private class ComparerString : IComparer<String>
{
     public int Compare(String x, String y)
     {
       //將此實例與指定的 <see cref="T:System.String" /> 對象進行比較,並指示此實例在排序順序中是位於指定的字符串之前、之后還是與其出現在同一位置。
       return string.CompareOrdinal(x, y);
     }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM