PAYATHON 2026

AlipayTradeQueryRequest 查询提示参数格式错误的原因

支付老李

结论

问题出在 BizContent 的 JSON 格式。当前代码生成的内容是:

{"out_trade_no":"******12",}

out_trade_no 后多了一个逗号。JSON 对象的最后一个字段不能带尾随逗号,支付宝因此无法正确解析业务参数,并返回:

ACQ.INVALID_PARAMETER
参数无效:参数格式错误

这个错误通常与 DefaultAopClient 的配置无关。Business Failed 也没有提供额外的错误信息,它只表示请求已经到达业务接口,但没有通过业务参数校验。

修正 JSON 拼接

只有一个字段时,删除字段末尾的逗号:

StringBuilder content = new StringBuilder();

content.Append("{");
content.AppendFormat("\"out_trade_no\":\"{0}\"", "******12");
content.Append("}");

request.BizContent = content.ToString();

AlipayTradeQueryResponse response = client.Execute(request);
WIDresule.Text = response.Body;

最终生成的 BizContent 应该是合法的 JSON:

{"out_trade_no":"******12"}

如果需要同时传入支付宝交易号和商户订单号,可以这样写:

request.BizContent =
    "{\"trade_no\":\"支付宝交易号\",\"out_trade_no\":\"商户订单号\"}";

两个字段之间需要逗号,最后一个字段后面则不能有逗号。

更稳妥的写法

尽量不要手工拼接 JSON。如果订单号中包含需要转义的字符,手工拼接仍可能产生格式错误。更稳妥的方式是交给序列化组件处理。

如果所用版本的支付宝 SDK 支持对应的业务模型,可以这样填写:

AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

request.SetBizModel(new AlipayTradeQueryModel
{
    OutTradeNo = "******12"
});

AlipayTradeQueryResponse response = client.Execute(request);
WIDresule.Text = response.Body;

如果当前 SDK 版本没有 SetBizModel,也可以使用项目已有的 JSON 序列化库。例如使用 Newtonsoft.Json:

var bizContent = new
{
    out_trade_no = "******12"
};

request.BizContent = JsonConvert.SerializeObject(bizContent);

AlipayTradeQueryResponse response = client.Execute(request);
WIDresule.Text = response.Body;

这样既不会生成尾随逗号,也能自动处理必要的字符转义。

检查 out_trade_no

修正 JSON 后,还需要检查 out_trade_no:

  • 必须使用创建支付订单时提交的原始商户订单号。
  • 查询沙箱订单时,订单也必须创建于同一个沙箱环境。
  • 不要把展示时脱敏的 ******12 当作实际查询值。
  • 检查是否带有前后空格、大小写是否一致,以及是否误传了支付宝交易号。
  • 如果传入的是支付宝生成的交易号,应使用 trade_no,而不是 out_trade_no。

如果 JSON 格式已经正确,但订单号不存在,接口通常会返回与“交易不存在”有关的业务错误,而不是单纯提示“参数格式错误”。具体错误码仍以实际响应为准。

检查客户端配置

从参数顺序来看,当前构造方式没有明显问题:

DefaultAopClient client = new DefaultAopClient(
    URL,
    APPID,
    APP_PRIVATE_KEY,
    FORMAT,
    "1.0",
    "RSA2",
    ALIPAY_PUBLIC_KEY,
    CHARSET,
    false
);

不过,仍需确认各项配置属于同一套环境:

  • 沙箱请求地址应为 https://openapi.alipaydev.com/gateway.do。
  • APPID 应是当前沙箱应用的 App ID。
  • APP_PRIVATE_KEY 应是与该应用上传公钥配套的应用私钥。
  • ALIPAY_PUBLIC_KEY 应填写支付宝公钥,而不是应用公钥。
  • 密钥内容应与 RSA2 签名方式匹配。
  • 不要混用正式环境和沙箱环境的 App ID、密钥或订单数据。

密钥或签名配置有误时,通常会返回签名验证相关的错误。当前请求已经进入 alipay.trade.query 的业务参数校验阶段,因此应该先修正 BizContent。

为什么会反复返回同一个错误

代码每次执行都会生成相同的非法 JSON:

{"out_trade_no":"******12",}

只要尾随逗号还在,服务端解析 biz_content 时就会失败,因此会反复返回 ACQ.INVALID_PARAMETER。

先输出并检查最终的 request.BizContent,确认它是合法 JSON,然后再排查订单号和沙箱配置。

备注:内容仅供参考。