支付宝单笔转账改用证书加签后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 发起支付。不要把应用私钥或证书下发到移动端。
迁移步骤
- 确认支付宝开放平台中的应用已经切换到证书模式。
- 检查应用私钥与应用公钥证书是否匹配。
- 在服务端部署应用公钥证书、支付宝公钥证书和支付宝根证书。
- 将 APP 支付和单笔转账统一改为证书模式初始化。
- 更新支付宝异步通知的验签逻辑,使用 SDK 提供的证书模式验签能力。
- 在沙箱或测试环境中,分别验证下单、支付回调、转账请求和转账结果查询。
- 确认所有链路正常后,再切换生产环境。
注意事项
- 不能只根据文件名判断私钥是否可用,应检查私钥与应用公钥证书是否匹配。
- 支付宝公钥证书和应用公钥证书用途不同,不要混用。
- 如果重新生成了应用密钥对,所有仍在使用旧私钥的服务都需要更新。
- 采用多实例或多服务部署时,应保证 APP 支付、转账和回调验签使用同一套有效配置。
- 证书有有效期,需要监控到期时间并提前更新。
- 私钥应存放在密钥管理系统或受控配置中,不要提交到代码仓库,也不要写入客户端安装包。
备注:内容仅供参考。
