• .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);
         }
    }
  • 相关阅读:
    BAT都来参加的 DevOps Master 培训
    如何快速复制BAT级的DevOps工具链
    DevOps开源工具的三种分类整理
    Devops成功的八大炫酷工具
    阿里CI/CD、DevOps、分层自动化技术
    Android爬坑之旅:软键盘挡住输入框问题的终极解决方式
    Android应用程序窗体View的创建过程
    LeetCode Convert Sorted List to Binary Search Tree
    Spark Streaming性能优化系列-怎样获得和持续使用足够的集群计算资源?
    android nfc中Ndef格式的读写
  • 原文地址:https://www.cnblogs.com/Can-daydayup/p/11123860.html
Copyright © 2020-2023  润新知