前言:
前段時間因為專案進度比較繁重所以一直都沒有時間更新部落格,內心深深的負重感,沒有履行年初立下的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); } }