PAYATHON 2026

支付宝单笔转账改用证书加签后APP支付秘钥是否可用

支付老李

结论

同一个支付宝应用切换到证书加签模式后,APP 支付服务端也需要同步改用证书模式配置。

原应用私钥不一定会因此失效:

  • 申请应用公钥证书时,如果继续使用原来的应用私钥和公钥,原应用私钥仍可用于签名。
  • 如果申请证书时重新生成了密钥对,就必须使用与应用公钥证书匹配的新应用私钥。
  • 证书模式下,不能再使用字符串形式的支付宝公钥验签,需要改用支付宝公钥证书,并配置支付宝根证书。
  • Android 或 iOS 客户端通常不需要保存这些证书,相关调整主要在商户服务端完成。

为什么需要同步调整

支付宝的密钥模式和证书模式不是针对单个 API 请求临时选择的。具体使用哪种模式,取决于支付宝开放平台中的应用配置和服务端 SDK 的初始化方式。

切换到证书模式后,请求仍由应用私钥进行 RSA2 签名,但请求中还会包含证书序列号等信息。支付宝返回的响应以及异步通知,则需要通过支付宝公钥证书验签。如果 APP 支付客户端仍按密钥模式初始化,可能会出现以下问题:

  • 请求中缺少证书序列号;
  • 支付宝无法正确识别应用证书;
  • 同步响应或异步通知验签失败;
  • APP 支付和单笔转账使用不同配置,增加线上问题的排查难度。

.crt 文件不是私钥文件,不能代替应用私钥。证书主要包含公钥、证书序列号、签发信息和有效期等数据。

需要准备的文件

证书模式通常需要以下三类证书:

  • 应用公钥证书,例如 appCertPublicKey_应用APPID.crt
  • 支付宝公钥证书,例如 alipayCertPublicKey_RSA2.crt
  • 支付宝根证书,例如 alipayRootCert.crt

服务端还需要应用私钥,而且该私钥必须与应用公钥证书中的公钥匹配。

可以使用下面的 OpenSSL 命令,比较两者导出的公钥摘要:

openssl pkey -in app_private_key.pem -pubout -outform DER | openssl sha256
openssl x509 -in appCertPublicKey_APPID.crt -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl sha256

如果两个摘要一致,就说明私钥与证书匹配。实际使用的文件名和私钥格式,以项目中的文件为准。

服务端配置示例

下面以支付宝 Java SDK 为例,使用证书模式初始化客户端。不同 SDK 版本的类或方法可能略有差异,请以项目当前使用版本的接口为准。

AlipayConfig config = new AlipayConfig();
config.setServerUrl("https://openapi.alipay.com/gateway.do");
config.setAppId("YOUR_APP_ID");
config.setPrivateKey("YOUR_APP_PRIVATE_KEY");
config.setFormat("json");
config.setCharset("UTF-8");
config.setSignType("RSA2");

config.setAppCertPath("/secure/alipay/appCertPublicKey_APPID.crt");
config.setAlipayPublicCertPath("/secure/alipay/alipayCertPublicKey_RSA2.crt");
config.setRootCertPath("/secure/alipay/alipayRootCert.crt");

AlipayClient alipayClient = new DefaultAlipayClient(config);

APP 支付和单笔转账应复用这个按证书模式初始化的 AlipayClient,然后分别构造对应的请求。例如,生成 APP 支付订单字符串:

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl("https://example.com/alipay/notify");
request.setBizContent("""
{
  "out_trade_no": "ORDER_202609130001",
  "total_amount": "0.01",
  "subject": "测试订单",
  "product_code": "QUICK_MSECURITY_PAY"
}
""");

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

服务端将 orderString 返回给移动端,再由支付宝客户端 SDK 发起支付。不要把应用私钥或证书下发到移动端。

迁移步骤

  1. 确认支付宝开放平台中的应用已经切换到证书模式。
  2. 检查应用私钥与应用公钥证书是否匹配。
  3. 在服务端部署应用公钥证书、支付宝公钥证书和支付宝根证书。
  4. 将 APP 支付和单笔转账统一改为证书模式初始化。
  5. 更新支付宝异步通知的验签逻辑,使用 SDK 提供的证书模式验签能力。
  6. 在沙箱或测试环境中,分别验证下单、支付回调、转账请求和转账结果查询。
  7. 确认所有链路正常后,再切换生产环境。

注意事项

  • 不能只根据文件名判断私钥是否可用,应检查私钥与应用公钥证书是否匹配。
  • 支付宝公钥证书和应用公钥证书用途不同,不要混用。
  • 如果重新生成了应用密钥对,所有仍在使用旧私钥的服务都需要更新。
  • 采用多实例或多服务部署时,应保证 APP 支付、转账和回调验签使用同一套有效配置。
  • 证书有有效期,需要监控到期时间并提前更新。
  • 私钥应存放在密钥管理系统或受控配置中,不要提交到代码仓库,也不要写入客户端安装包。

备注:内容仅供参考。