客户端调起支付宝SDK后如何修改支付界面的订单信息?
结论
支付界面中的商品信息通过下单参数 subject 设置。如果希望界面尽量只显示商品名称,可以把商品名称写入 subject,不传 body,也不要在 subject 中拼接业务键值对。
支付宝收银台的布局和展示字段由支付宝客户端或 SDK 控制,商户无法自行修改。即使只传入 subject,是否显示订单号、金额和商户名称等信息,仍以支付宝收银台的实际规则为准。
为什么会显示键值对的值
通常有以下几种原因:
body中包含类似key=value的业务数据,收银台将其作为订单描述展示。- 生成订单时,将整个业务对象或参数字符串赋给了
subject。 - 客户端自行拼接订单参数,造成字段边界、转义或编码错误。
- 签名前使用的订单字符串与调起 SDK 时使用的内容不一致。
- 使用旧版接口时,将自定义数据放入了可能参与展示的商品描述字段。
subject 是订单标题,应填写商品名称。body 是订单描述,不需要展示时可以省略。不要通过这两个字段传递自定义业务数据。
推荐设置方式
以 App 支付接口 alipay.trade.app.pay 为例,服务端生成订单时只设置必要参数:
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "99.00",
"subject": "无线蓝牙耳机",
"product_code": "QUICK_MSECURITY_PAY"
}
不要按下面的方式设置:
{
"subject": "productId=12345",
"body": "userId=10001&couponId=888"
}
也不要将整个对象直接转成字符串作为商品标题:
request.setBizContent(orderObject.toString());
应明确构造支付宝要求的业务参数。自定义数据保存在商户服务端,并通过 out_trade_no 与订单关联。
Java 服务端示例
下面的示例只展示核心参数。SDK 初始化、证书模式和密钥配置等内容,应根据项目实际使用的支付宝 SDK 处理:
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("99.00");
model.setSubject("无线蓝牙耳机");
model.setProductCode("QUICK_MSECURITY_PAY");
// 不需要订单描述时,不设置 body
// model.setBody("商品描述");
request.setBizModel(model);
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradeAppPayResponse response =
alipayClient.sdkExecute(request);
String orderString = response.getBody();
服务端将生成的 orderString 原样返回给客户端,客户端直接用它调起支付宝 SDK:
PayTask payTask = new PayTask(activity);
Map<String, String> result = payTask.payV2(orderString, true);
客户端收到订单字符串后,不要再修改其中的 subject、body 或其他参数,否则可能导致验签失败。
自定义参数应该放在哪里
如果键值对只是商户内部使用的业务信息,例如用户编号、优惠券编号或活动编号,可以这样处理:
- 将业务数据保存在商户数据库中。
- 使用
out_trade_no关联商户订单。 - 收到支付异步通知后,根据
out_trade_no查询对应的业务数据。
部分接口支持 passback_params,但该字段是否可用、如何编码,以及通知时如何返回,取决于具体的支付产品和接口版本。使用前应核对当前接口文档,也不要假设它在所有收银台版本中都不会显示。仅用于服务端关联的数据,优先保存在商户自己的订单系统中更稳妥。
排查步骤
可以在服务端签名前记录实际提交的业务参数,重点检查:
subject
body
out_trade_no
passback_params
逐项确认:
subject中只有商品名称。body已删除或没有设置。subject中没有写入 JSON、Map 或查询字符串。- 客户端使用的订单字符串与服务端签名后返回的内容完全一致。
- 参数修改后重新生成订单并签名,没有直接修改旧的订单字符串。
如果删除 body 并正确设置 subject 后,界面仍然显示该值,应先确认该内容来自哪个下单字段。如果它属于支付宝收银台的固定展示信息,就无法通过客户端参数隐藏,只能以支付宝收银台的实际规则为准。
备注:内容仅供参考。
