支付宝“应用2.0签约”是否需要设置接口加签方式?
支付小周
结论
通常不需要单独为“应用2.0签约”设置接口加签方式。只需为 Android APP 实际接入并用于发起支付宝支付请求的应用配置密钥,同时确保代码中的 app_id 与该应用的 APPID 一致。
判断时以 APPID 为准:调用支付宝开放平台接口时使用哪个 APPID,就为哪个应用配置接口加签方式。
为什么会出现“应用2.0签约”
“应用2.0签约”一般是签约或开通产品时产生的关联类目,并不一定是实际调用支付接口的应用。在应用管理页面看到这个类目,不代表必须为它生成密钥或配置加签方式。
需要配置接口加签方式的应用应同时满足以下条件:
- Android APP 实际绑定了该应用;
- 支付请求中的
app_id使用该应用的 APPID; - 支付宝支付产品开通在该应用下;
- 服务端使用该应用对应的私钥签名。
如果“应用2.0签约”有独立的 APPID,而且系统确实会用这个 APPID 调用接口,才需要单独为它配置密钥。否则不要随意修改其中的参数。
配置步骤
1. 确认实际使用的 APPID
进入支付宝开放平台的应用详情页,确认 Android APP 对应的 APPID,再检查服务端配置是否与其一致:
alipay.app-id=你的应用APPID
不要根据应用名称判断,应以 APPID 为准。
2. 为自己的应用设置接口加签方式
在实际应用的“开发设置”或“接口加签方式”中,根据当前接入方案选择一种签名模式:
- 普通公钥模式;
- 公钥证书模式。
两种模式不能混用。服务端 SDK 的配置方式必须与开放平台中的设置一致。
3. 上传应用公钥或应用公钥证书
私钥只能保存在自己的服务端,不要上传到开放平台、发送给他人或放入 Android 安装包。开放平台需要配置的是应用公钥,或者公钥证书模式所需的应用公钥证书。
建议由服务端完成订单签名,Android 客户端只接收已经生成的支付参数。
4. 检查服务端配置
普通公钥模式的 Java 示例:
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
"你的应用APPID",
"你的应用私钥",
"json",
"UTF-8",
"支付宝公钥",
"RSA2"
);
创建 APP 支付订单时,应继续使用同一套应用配置:
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setSubject("商品名称");
model.setOutTradeNo("业务系统订单号");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("https://example.com/alipay/notify");
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if (response.isSuccess()) {
String orderInfo = response.getBody();
// 将 orderInfo 返回给 Android 客户端调用支付宝 SDK
}
这里使用的 app_id、应用私钥和支付宝公钥必须属于同一套应用配置。
如何确认是否配置正确
可以逐项检查:
- 服务端使用的
app_id是否为 Android APP 对应的 APPID。 - 应用私钥是否与开放平台上传的应用公钥配对。
- 签名算法是否一致,通常为
RSA2。 - 使用普通公钥模式时,是否填写了正确的支付宝公钥。
- 使用公钥证书模式时,是否配置了对应的应用证书、支付宝公钥证书和支付宝根证书。
- 是否混用了正式环境与沙箱环境的 APPID、密钥或网关地址。
注意事项
- 不要因为页面出现了新的类目,就为所有条目重复生成或覆盖密钥。
- 不要修改业务系统当前没有使用的关联应用,以免影响已有签约关系或其他接口调用。
- 不要把应用私钥打包进 APK。APK 可以被反编译,私钥只能保存在服务端。
- 支付宝异步通知必须验签,不能只根据客户端返回的结果判断支付是否成功。
- 如果账号中的“应用2.0签约”显示为独立应用,但产品签约关系和 APPID 归属不明确,应先查看支付产品的签约详情,确认实际绑定的 APPID,再决定是否配置。仅凭类目名称,无法判断它是否承担接口调用职责。
备注:内容仅供参考。
