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