PAYATHON 2026

鸿蒙开发接入支付宝支付时提示“系统繁忙,请稍后再试”

支付小周

结论

出现”系统繁忙,请稍后再试”,通常并不是鸿蒙系统真的繁忙,而是支付宝无法正确识别或校验传入的支付请求。建议先检查服务端生成的 orderStr、应用签名配置、支付产品权限,以及客户端传参是否完整。

单凭这句提示无法判断具体原因,还需要结合支付宝返回的 resultStatus、memo、服务端日志和支付宝开放平台配置逐项排查。

常见原因

1. 客户端传入的支付参数不完整

APP 支付参数应由服务端通过支付宝开放平台接口生成,再由鸿蒙客户端原样传给支付宝 SDK。只传订单号、支付金额或业务 JSON 无法完成支付。

服务端生成的支付字符串通常包含:

app_id
biz_content
charset
format
method
notify_url
sign
sign_type
timestamp
version

字段缺失、内容为空,或者签名后又修改了参数,都可能导致支付宝无法处理请求。

2. 签名或密钥配置不一致

需要逐项确认:

  • app_id 是否属于当前支付宝开放平台应用。
  • 服务端使用的应用私钥是否与该应用匹配。
  • 开放平台采用的是应用公钥模式还是支付宝公钥证书模式。
  • 签名方式是否统一为 RSA2。
  • 是否混用了沙箱应用、沙箱账号和正式环境。
  • 更换密钥后,服务端是否仍在使用旧私钥。

应用私钥用于请求签名,支付宝公钥用于验证支付宝返回的内容,不能混用。

3. 服务端生成支付参数的方式有误

建议使用支付宝官方服务端 SDK 的 sdkExecute 生成 APP 支付参数,不要自行拼接参数和签名。

以 Java 服务端为例:

AlipayClient alipayClient = new DefaultAlipayClient(
        "https://openapi.alipay.com/gateway.do",
        APP_ID,
        APP_PRIVATE_KEY,
        "json",
        "UTF-8",
        ALIPAY_PUBLIC_KEY,
        "RSA2"
);

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setSubject("订单支付");
model.setOutTradeNo(outTradeNo);
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);
request.setNotifyUrl("https://example.com/alipay/notify");

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
String orderStr = response.getBody();

其中:

  • outTradeNo 必须由商户系统生成,并保证唯一。
  • totalAmount 应是合法的金额字符串。
  • notifyUrl 必须是支付宝服务器能够访问的 HTTPS 地址。
  • orderStr 应直接返回给客户端,客户端不要重新签名。

如果使用证书模式,需要改用对应的 SDK 初始化方式,不能把证书内容当作普通公钥传入。

4. orderStr 被二次编码或改写

服务端返回的支付字符串可能含有 &、=、%、+ 等特殊字符,常见问题包括:

  • 对整个 orderStr 再做一次 URL 编码。
  • JSON 序列化或反序列化过程中丢失字符。
  • + 被转换成空格。
  • 前端手动拼接或替换 sign。
  • 只截取了 biz_content。
  • 日志或数据库字段长度不足,造成字符串截断。

客户端应把服务端返回的字符串原样传给支付宝 SDK:

const orderStr: string = response.orderStr;

if (!orderStr || orderStr.trim().length === 0) {
  throw new Error('支付参数为空');
}

// 此处调用所接入版本的支付宝鸿蒙支付 SDK。
// orderStr 必须原样传入,不要再次编码、拼接或签名。
const result = await payWithAlipay(orderStr);

payWithAlipay 只是示意封装,并非支付宝固定的 API 名称。具体调用方式应以当前接入的支付宝鸿蒙 SDK 文档和类型声明为准。

5. 支付产品或应用状态异常

登录支付宝开放平台,检查以下内容:

  • 应用是否已经创建并处于可用状态。
  • APP 支付能力是否已经签约并生效。
  • 当前 app_id 是否属于已签约应用。
  • 应用公钥或应用公钥证书是否已经上传。
  • 应用配置变更是否已经提交并生效。
  • 商户账号是否存在风控、签约或账户状态问题。

即使客户端能够拉起支付宝,如果尚未完成 APP 支付签约,支付请求仍可能无法正常创建。

6. 鸿蒙侧 SDK 或应用配置不完整

确认所用支付宝 SDK 明确支持当前 HarmonyOS 版本和设备架构,并按照对应文档完成以下配置:

  • SDK 依赖配置。
  • 必要权限声明。
  • 页面或组件生命周期接入。
  • 应用跳转、回跳或 scheme 配置。
  • Release 包签名及应用配置。
  • 混淆或压缩相关配置。

不要把 Android 的 PayTask 调用方式直接搬到纯鸿蒙工程。不同版本的支付宝鸿蒙 SDK 可能采用不同的包名、初始化方式和支付 API,具体应以实际下载的 SDK 文档及 .d.ts 类型声明为准。

建议的排查顺序

第一步:记录完整返回结果

不要只显示”系统繁忙”,还应记录 SDK 返回的原始结果,至少包括:

resultStatus
memo
result

不同版本 SDK 的返回结构可能不同,因此还要保留完整的原始返回值。日志中如果包含 sign、用户标识或订单信息,需要先做脱敏处理。

常见的支付宝支付状态包括:

  • 9000:支付成功。
  • 8000:正在处理中,最终状态需要通过服务端查询或异步通知确认。
  • 6001:用户取消。
  • 6002:网络连接异常。
  • 4000:支付过程发生异常。

这些状态只能辅助判断。业务系统不能仅凭客户端返回结果确认款项已经到账。

第二步:检查服务端生成结果

记录以下信息:

app_id
out_trade_no
total_amount
method
sign_type
SDK 返回的原始错误码和错误信息

确认 sdkExecute 返回的 body 不为空,并检查生成结果中是否包含 sign=。生产日志不能输出完整私钥,也不要长期保留完整签名内容。

第三步:核对环境

确保整条支付链路使用同一套环境参数:

正式 app_id
+ 正式应用私钥
+ 正式支付宝网关
+ 正式支付宝账号

或者:

沙箱 app_id
+ 沙箱应用私钥
+ 沙箱网关
+ 沙箱买家账号

沙箱参数与正式参数不能交叉使用。

第四步:确认传输前后完全一致

可以分别在服务端和客户端计算 orderStr 的长度和摘要,以确认传输过程中内容没有发生变化:

console.info(`orderStr length: ${orderStr.length}`);

调试时可以比对两端字符串的摘要,但不要在普通日志中直接输出完整支付参数。

第五步:使用最小订单测试

暂时移除非必要的扩展参数,只保留:

subject
out_trade_no
total_amount
product_code
notify_url

如果最小订单能够支付,再逐项恢复业务参数,这样更容易找出导致请求异常的字段。

还需要检查的细节

  • timestamp 应由服务端生成,同时要确保服务器时间准确。
  • 不要将同一个 out_trade_no 用于不同金额或不同业务订单。
  • 金额应使用十进制字符串,例如 "0.01",不要直接使用可能产生精度误差的浮点计算结果。
  • 商品标题不能包含不可见字符或异常控制字符。
  • notify_url 不需要由客户端处理,但必须能够从公网访问。
  • 客户端回调成功不等于服务端已经确认到账。
  • 异步通知必须验签,并核对 app_id、out_trade_no、total_amount 和商户身份。
  • 如果服务端根本没有请求支付宝网关,客户端拉起后便立即报错,应先检查 orderStr 和鸿蒙侧 SDK 接入。
  • 如果同一个 orderStr 在其他已经验证的客户端上也支付失败,应先检查开放平台配置、签名和订单参数。

仍无法解决时

向支付宝技术支持提交以下信息:

  • 支付发生时间。
  • app_id。
  • 脱敏后的 out_trade_no。
  • SDK 版本和 HarmonyOS 版本。
  • resultStatus、memo 及完整错误码。
  • 服务端调用支付宝 SDK 时返回的错误信息。
  • 问题是否只出现在 Release 包、特定设备或特定支付宝客户端版本。

不要提交应用私钥、完整签名或用户隐私信息。仅凭”系统繁忙”通常无法定位问题,排查时需要完整错误码和服务端请求记录。

备注:内容仅供参考。