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