独立开发的票务系统对接支付宝应创建哪类应用?
结论
独立开发的票务系统,通常适合创建一个专用的“网页应用”,再在该应用下申请支付宝支付能力,并配置密钥和回调地址。
“默认签约 2.0 应用”一般用于承接商户直接签约的支付产品,或兼容已有签约关系,并非必须弃用。如果它已经具备票务系统需要的支付能力,也能正常配置应用公钥、回调地址和授权信息,可以直接使用。
选择应用时,不要只看名称,还要确认:
- 用户实际通过哪种终端支付;
- 应用对应的
app_id; - 所需产品是否已经签约并生效;
- 应用是否已经完成密钥配置;
- 是否便于单独管理、测试和后续维护。
如果票务系统准备长期运营并由独立团队维护,新建专用应用通常更清楚,也方便隔离配置和权限。
两种应用分别适用于什么场景
新建网页应用
网页应用适用于用户通过浏览器访问售票网站并付款的场景,例如:
- PC 网站售票;
- 手机浏览器中的 H5 售票页面;
- 独立部署的 Web 票务后台;
- 需要单独管理票务项目的密钥、回调地址和支付能力。
用户在电脑浏览器中跳转到支付宝收银台时,通常使用电脑网站支付接口:
alipay.trade.page.pay
在手机浏览器中唤起支付宝支付时,通常使用手机网站支付接口:
alipay.trade.wap.pay
网页应用只是承载这些能力的应用类型。某个接口能否调用,还要看对应的支付产品是否已经完成签约、审核并正式生效。
默认签约 2.0 应用
默认签约 2.0 应用通常由平台在商户签约支付宝产品时提供或关联,适合以下情况:
- 商户已经通过该应用完成所需产品的签约;
- 现有系统正在使用这个
app_id; - 只需对接简单业务或历史系统;
- 票务系统不需要单独隔离密钥、权限和回调配置。
如果默认签约应用已经开通电脑网站支付或手机网站支付,并允许配置接口加签,票务系统在技术上也可以使用它。
不过,多个系统共用一个默认应用,往往意味着共用应用凭证和部分配置。以后更换密钥、排查回调、区分交易来源或调整权限时,管理起来会更麻烦。
推荐的配置步骤
1. 确认支付入口
先确定购票人通过什么终端发起支付:
- PC 浏览器:优先考虑
alipay.trade.page.pay; - 手机浏览器:优先考虑
alipay.trade.wap.pay; - 支付宝小程序:创建支付宝小程序,并使用对应的支付能力;
- 原生 Android 或 iOS App:按照移动应用场景申请 App 支付能力。
如果票务系统同时支持 PC 和 H5,可以根据用户的访问终端选择相应接口。前提是应用已经取得这两类接口所需的产品权限。
2. 创建并配置应用
在支付宝开放平台创建网页应用后,记录该应用的:
app_id
接着配置接口加签方式。使用 RSA2 时,票务系统保存应用私钥,并在开放平台上传应用公钥。调用接口时,还需要取得支付宝公钥,用它验证支付宝同步响应和异步通知的签名。
以下内容不要提交到公开代码仓库:
- 应用私钥;
- 支付宝接口密钥;
- 生产环境配置文件;
- 含有完整支付参数的调试日志。
3. 申请支付产品
在应用中申请业务实际需要的支付产品,例如电脑网站支付或手机网站支付。
应用创建成功后,支付接口不一定能立即使用。产品是否需要审核、签约或补充经营资料,要以当前支付宝开放平台控制台显示的状态为准。
4. 配置异步通知地址
票务系统需要提供一个可通过公网访问的 HTTPS 地址,用于接收支付结果,例如:
https://ticket.example.com/api/payment/alipay/notify
处理异步通知时,至少要完成以下步骤:
- 验证支付宝签名;
- 核对
app_id; - 核对商户订单号;
- 核对订单金额和币种;
- 判断交易状态;
- 以幂等方式更新订单;
- 处理成功后,返回支付宝要求的响应内容。
不能只凭浏览器跳转结果出票。用户可能会关闭页面,跳转请求也可能被拦截。服务端应主要依据异步通知确认支付结果。
Java 调用示例
以下示例使用电脑网站支付接口 alipay.trade.page.pay,调用方式为支付宝 Java SDK 的常见写法。具体依赖版本和构造参数,应以项目实际采用的官方 SDK 文档为准。
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipay.com/gateway.do",
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl("https://ticket.example.com/api/payment/alipay/notify");
request.setReturnUrl("https://ticket.example.com/payment/result");
request.setBizContent("""
{
"out_trade_no": "TICKET_202609090001",
"total_amount": "99.00",
"subject": "演出票订单",
"product_code": "FAST_INSTANT_TRADE_PAY"
}
""");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String paymentForm = response.getBody();
// 将 paymentForm 返回给浏览器,由浏览器提交或渲染支付宝收银台页面
} else {
throw new IllegalStateException(
response.getCode() + ": " + response.getSubMsg()
);
}
生产环境中的 out_trade_no 必须由票务系统生成,并保证唯一。total_amount 应从服务端订单中读取,不能直接采用浏览器提交的金额。
选择建议
如果票务系统是一个新建且需要独立维护的业务系统,建议创建专用网页应用。这样可以分别管理:
app_id;- RSA2 密钥;
- 支付产品权限;
- 回调地址;
- 运维和审计边界。
如果已经有默认签约 2.0 应用,可以先检查:
- 所需支付产品的状态是否正常;
- 是否能够配置或已经配置 RSA2 公钥;
- 对应的
app_id能否正常调用目标接口; - 商户主体是否与票务业务一致;
- 是否会与现有系统的密钥和回调配置发生冲突。
以上条件全部满足时,可以继续使用默认签约应用。否则,应创建新的网页应用,并在新应用下申请相应能力。
不要因为页面中已有“默认签约 2.0 应用”就直接选用它,也不要认为新建网页应用后,会自动继承默认应用的全部签约能力。
注意事项
- 沙箱环境和生产环境的网关、应用编号、密钥及账号不能混用。
- 支付宝公钥与应用公钥用途不同,不要混淆。
- 收到异步通知后,必须先验签,再处理订单。
- 同一条支付通知可能重复发送,出票逻辑必须支持幂等处理。
- 支付成功、订单完成和门票出票应采用可恢复的状态流程。
- 退款时应使用原支付应用对应的交易信息,不要随意更换
app_id。 - 如果采用服务商代商户调用、支付宝小程序或原生 App 支付,应按相应模式创建应用,不能直接套用网页应用方案。
- 支付产品名称、准入条件和控制台入口可能发生调整。最终应以支付宝开放平台当前显示的可申请能力和签约状态为准。
备注:内容仅供参考。
