PAYATHON 2026

支付宝扫码支付提示“应用未配置对应签名算法的公钥或者证书”如何配置?

支付小周

结论

这项配置需要在支付宝开放平台对应应用的开发配置中完成,入口通常是:

支付宝开放平台 → 控制台 → 应用详情 → 开发设置(或接口加签方式)

根据项目采用的加签模式选择对应配置:

  • 公钥模式:上传应用公钥。
  • 证书模式:上传应用公钥证书,并在项目中配置支付宝公钥证书和支付宝根证书。

不要上传应用私钥。应用私钥只能保存在自己的服务器中,用于为请求生成签名。

开放平台的菜单名称可能会调整,但配置入口一般都在对应应用的“开发设置”或“接口加签方式”中。

为什么会出现这个提示

支付宝收到扫码支付请求后,会根据请求中的 app_id 和 sign_type 查找对应的应用公钥或证书,并用它验证请求签名。

如果出现以下提示:

应用未配置对应签名算法的公钥或者证书

说明支付宝没有找到与当前请求匹配的验签材料。常见原因有:

  • 当前 app_id 还没有配置应用公钥或应用公钥证书。
  • 程序使用 RSA2 签名,但开放平台配置的密钥与当前应用不匹配。
  • 开放平台采用公钥模式,程序却按证书模式初始化,或者正好相反。
  • 请求中的 app_id 与配置公钥的应用不一致。
  • 混用了沙箱环境和正式环境。
  • 更换应用私钥后,没有把对应的新应用公钥更新到开放平台。
  • 第三方应用代商户调用接口时,错误地把被授权商户的信息当成接口调用应用的签名配置。

这里的“公钥”是与应用私钥配对生成的应用公钥,不是支付宝公钥。支付宝用应用公钥验证应用发出的请求,应用则用支付宝公钥验证支付宝返回的数据和异步通知。

配置步骤

1. 确认请求使用的应用

先检查程序实际发送的参数:

app_id=你的支付宝应用 APPID
sign_type=RSA2

登录支付宝开放平台,进入这个 app_id 对应的应用。不要只看项目名称,要直接核对 APPID。

还要确认调用环境:

正式环境:https://openapi.alipay.com/gateway.do
沙箱环境:https://openapi-sandbox.dl.alipaydev.com/gateway.do

沙箱应用的密钥配置不能用于正式应用,正式应用的配置也不能直接用于沙箱请求。

2. 选择公钥模式或证书模式

项目和开放平台必须采用同一种模式。

公钥模式

使用支付宝开放平台提供的密钥工具生成一对 RSA 密钥:

  • 应用私钥:保存在服务器中,用于生成请求签名。
  • 应用公钥:配置到支付宝开放平台。

进入对应应用的“开发设置”或“接口加签方式”,选择公钥方式并填写生成的应用公钥。保存后,平台通常会提供对应的支付宝公钥。项目需要用这个支付宝公钥验证支付宝的响应和通知。

公钥内容一般是去掉 PEM 头尾后的 Base64 内容,是否保留头尾以控制台输入框的提示为准。例如:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...

不要把下面这种应用私钥上传到控制台:

-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----

证书模式

如果应用采用证书方式,需要生成并上传应用公钥证书。完成配置后,还要下载以下证书并配置到项目中:

  • 应用公钥证书
  • 支付宝公钥证书
  • 支付宝根证书

这些证书通常是 .crt 文件。初始化支付宝 SDK 时必须使用证书模式的配置接口,不能继续只用支付宝公钥字符串作为验签配置。

Java SDK 配置示例

公钥模式

以下示例使用 RSA2:

String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "你的APPID";
String appPrivateKey = "你的应用私钥";
String alipayPublicKey = "支付宝公钥";

AlipayClient alipayClient = new DefaultAlipayClient(
    serverUrl,
    appId,
    appPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

发起当面付扫码支付请求:

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("ORDER_202609090001");
model.setTotalAmount("0.01");
model.setSubject("订单支付");

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

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    String qrCode = response.getQrCode();
    System.out.println(qrCode);
} else {
    System.out.println(response.getCode());
    System.out.println(response.getSubCode());
    System.out.println(response.getSubMsg());
}

appPrivateKey 必须与上传到开放平台的应用公钥配对。alipayPublicKey 是支付宝公钥,不能和应用公钥混用。

证书模式

如果开放平台采用证书方式,可以按证书模式初始化客户端:

CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
certAlipayRequest.setAppId("你的APPID");
certAlipayRequest.setPrivateKey("你的应用私钥");
certAlipayRequest.setFormat("json");
certAlipayRequest.setCharset("UTF-8");
certAlipayRequest.setSignType("RSA2");

certAlipayRequest.setCertPath("/path/to/appCertPublicKey.crt");
certAlipayRequest.setAlipayPublicCertPath(
    "/path/to/alipayCertPublicKey_RSA2.crt"
);
certAlipayRequest.setRootCertPath(
    "/path/to/alipayRootCert.crt"
);

AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

支付宝 Java SDK 的版本不同,具体类名和初始化方式可能略有差异,请以项目实际依赖版本提供的 API 为准。

如何确认公私钥是否匹配

可以从当前应用私钥重新导出公钥,再与开放平台保存的应用公钥进行比较。

如果私钥是 PEM 格式,可以使用 OpenSSL:

openssl pkey -in app_private_key.pem -pubout -out app_public_key.pem

如果导出的公钥与开放平台保存的公钥不一致,说明项目使用的是另一套私钥。此时可以选择以下一种处理方式:

  • 将程序改回与平台公钥配对的应用私钥。
  • 将新私钥对应的应用公钥重新配置到开放平台。

修改生产环境密钥前,要确认所有调用该应用的服务是否共用旧密钥,以免更新后只有部分服务能够调用支付宝接口。

配置后仍然报错时检查什么

可以按以下顺序排查:

  1. 核对请求中的 app_id,确认它与开放平台配置的应用完全一致。
  2. 核对网关地址,确认没有混用沙箱环境和正式环境。
  3. 检查 sign_type,通常应统一使用 RSA2。
  4. 确认程序和控制台采用相同的公钥模式或证书模式。
  5. 确认应用私钥与控制台中的应用公钥或应用公钥证书匹配。
  6. 检查配置文件,确认环境变量、容器配置或发布系统没有加载旧密钥。
  7. 如果刚修改过配置,重新加载应用配置或重启相关服务,避免程序继续使用内存中的旧配置。
  8. 查看支付宝返回的 code、sub_code 和 sub_msg,不要只保留最外层的错误信息。

注意事项

  • 应用私钥属于敏感信息,不要上传到支付宝控制台、提交到代码仓库或写入日志。
  • RSA2 是基于 SHA-256 的 RSA 签名方式。应用的加签配置必须与请求中的 sign_type 一致。
  • “应用公钥”和“支付宝公钥”的用途相反,不能互换。
  • 更换密钥后,需要同步更新所有使用该 APPID 的服务。
  • 使用证书模式时,不能只配置一个证书文件。应用证书、支付宝公钥证书和支付宝根证书都要按照 SDK 的要求正确加载。
  • 扫码支付接口本身通常不是这个错误的配置入口。应在应用级的“接口加签方式”中处理,而不是在单个支付产品或二维码参数中配置。

备注:内容仅供参考。