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,然后再排查订单号和沙箱配置。
备注:内容仅供参考。
