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

原文地址:https://www.cnblogs.com/Can-daydayup/p/11123860.html

时间: 2024-08-04 12:44:34

.Net将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA的相关文章

C# 非空字段按照ASCII码从小到大排序(字典序)

public static void requestPay() { Dictionary<string, string> dics = new Dictionary<string, string>(); dics.Add("amount", amount); dics.Add("callback_url", callback_url); dics.Add("goodsname", goodsname); dics.Add(

【Java】字符拼接成字符串的注意点

这两天敲代码的时候,偶然间发现一个好玩的事情,分享一下,记录一下. 该段代码主要是:先产生的几个整数,把整数转换成对应的字符,最后的字符拼接成字符串,在把字符拼接成字符串的时候,个人因为偷懒使用+号进行操作,出现了一点小惊喜.拼接以后出现了两种不同的结果,感到十分的意外,所以分析了一下出现的结果,记录一下. 1 package top.supertd.www; 2 3 import java.util.concurrent.ThreadLocalRandom; 4 5 public class

利用下划线将列表的每个元素拼接成字符串,li=[&quot;alex&quot;,&quot;eric&quot;,&quot;rain&quot;]

利用下划线将列表的每个元素拼接成字符串,li=["alex","eric","rain"] li=['alex', 'eric', 'rain'] c = li[0] for k,n in enumerate(li[1:]): c += "_"+n print(c) 原文地址:https://www.cnblogs.com/riling/p/10133147.html

二级 长度为7的字符串除首位外其余五个字符按ascii码进行排序

//编写程序函数的功能为,对长度为7的字符串除首位外其余五个字符按ascii码进行排序 void fun(char *s,int num) { char t; int i,j; for(i=1;i<num-2;i++) for(j=i+1;j<num-1;j++) { if(s[i]<s[j]) { t=s[i]; s[i]=s[j]; s[j]=t; } } }

Sql Server将一列字段拼接成字符串方法

最近在项目中遇到个问题,需要将表中某列字段合并成字符串输出,如果直接通过代码全部读取出来,再遍历进行拼接显然不是最好的方法,所以想着能否在数据读取的时候直接拼接好返回,网上搜了可通过for xml来实现. 首先,准备好需要的数据,脚本如下: if exists (select * from sysObjects where id=object_id('Student')) drop table Student go create table Student ( Id int, Name varc

sqlserver中将查询结果拼接成字符串

#for xml path(param)--将查询结果以xml格式输出 1 select id,name from table1 for xml path 2 --id和name为table1的真实字段 - path后面没有参数时,且查询的字段为真实存在或取了别名的的(即查出来有列名的),每行数据以最外面以<row>标签包裹,接着有列名的数据被其列名标签包裹. 上面sql的结果可如下: 1 <row> 2 <id>1</id> 3 <name>h

集合拼接成字符串

List<string> idlist = new List<string>(); foreach (BM item in list) { idlist.Add("'" + item.DrBh + "'"); }string IDContent = string.Join(",", idlist.ToArray()); }

phpstorm将多个int数字拼接成字符串

场景:将程序输出的多个int数字拼成以','分隔的字符串 数据为 8680 24399 37619 45425 49635 139334 386918 429498 461616 523384 561828 628485 864751 893995 897155 替换后为: 8680,24399,37619,45425,49635,139334,386918,429498,461616,523384,561828,628485,864751,893995,897155, 替换操作为:使用phps

把列表中的元素拼接成字符串

注意字符串join方法的使用 namelist = ['宋小宝','宋仲基','古龙','哈珀'] string = ''.join(namelist) print(string) #宋小宝宋仲基古龙哈珀 string2 = ''.join(namelist[1:3]) print(string2) #宋仲基古龙 原文地址:https://www.cnblogs.com/chillytao-suiyuan/p/9125163.html