PAYATHON 2026

URL 添加 order_id 和 description 参数时报错

支付老李

结论

不要手动拼接查询字符串。把 API 地址设为基础 URL,再通过 RestSharp 的查询参数接口添加 currency、order_id 和 description。RestSharp 会处理 &、空格和中文等需要进行 URL 编码的字符。

var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";

var client = new RestClient("http://api.blabla.net");
var request = new RestRequest("subscriptions");

request.AddQueryParameter("currency", "dkk");
request.AddQueryParameter("order_id", orderId);
request.AddQueryParameter("description", "Medlemskab");

最终请求 URL 的形式如下:

http://api.blabla.net/subscriptions?currency=dkk&order_id=20261234&description=Medlemskab

其中,order_id 的具体值取决于 NyTal(4) 的返回内容。

原代码的问题

原来的写法在参数值只有简单字母和数字时未必会报错,但有两个隐患。

首先,description 变量中混入了参数名和分隔符:

var description = "&description=Medlemskab";

这会把 URL 结构和参数值混在一起。如果描述中出现空格、&、+ 或中文,生成的 URL 可能无效,服务器也可能错误拆分参数。

其次,下面这行代码的结果取决于 NyTal(4) 的返回类型:

var order = DateTime.Now.Year + Helper.Settings.NyTal(4);

如果 NyTal(4) 返回整数,这里执行的是数值加法。例如:

2026 + 1234 == 3260

如果需要得到 20261234,应明确使用字符串拼接:

var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";

如果必须手动构造 URL

应分别编码每个参数值,不要把 &description= 放进变量:

var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";
var description = "Medlemskab";

var url =
    "http://api.blabla.net/subscriptions" +
    "?currency=" + Uri.EscapeDataString("dkk") +
    "&order_id=" + Uri.EscapeDataString(orderId) +
    "&description=" + Uri.EscapeDataString(description);

var client = new RestClient(url);

如果描述中包含空格,例如:

var description = "Årligt medlemskab";

编码后会得到类似这样的查询参数:

description=%C3%85rligt%20medlemskab

注意事项

  • 第一个查询参数前使用 ?,后续参数之间使用 &。
  • 只编码参数值,不要对整个 URL 调用 Uri.EscapeDataString()。
  • 如果 order_id 有固定格式,应使用字符串保存,尤其是可能包含前导零时。
  • 如果接口要求 HTTPS,应将地址改为 https://。是否必须使用 HTTPS,以该支付 API 的实际要求为准。
  • RestSharp 不同版本的构造函数和执行方法可能略有差异,但都可以通过 AddQueryParameter() 添加查询参数。
  • 调试器中出现 %20、%C3%85 等内容通常只是正常的 URL 编码,并不表示 URL 有误。

备注:内容仅供参考。