前言:
前段时间因为项目进度比较繁重所以一直都没有时间更新博客,内心深深的负重感,没有履行年初立下的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); } }