同时接入网页端和移动端支付宝支付应选择哪种应用类型?
明确结论
同一网站如果需要同时支持电脑网页支付和手机浏览器支付,应在支付宝开放平台创建面向普通商户的“网页/移动应用”类应用,并分别申请以下支付能力:
- 电脑网页支付:
alipay.trade.page.pay - 手机网站支付:
alipay.trade.wap.pay
控制台中的应用类型和产品名称可能调整,具体以支付宝开放平台当前展示为准。判断时不要只看应用名称,而要确认该应用能否申请“电脑网站支付”和“手机网站支付”。
当前应用类型为什么不符合条件
支付宝会根据应用的运行载体和业务身份开放相应能力。以下类型通常无法直接申请网站支付:
- 支付宝小程序:用于支付宝客户端内运行的小程序。
- 生活号:适用于生活号场景,不等同于独立网站应用。
- 第三方应用:主要供服务商代商户开发,需要具备相应的服务商身份并完成授权流程。
- 纯移动客户端应用:适用于原生 App 支付,并不代表支持手机浏览器支付。
- 其他行业或特定场景应用:可能只提供当面付、预授权等限定能力。
“手机网站支付”和“App 支付”也不是同一种产品。手机网站支付运行在手机浏览器或应用内 WebView 中,使用 alipay.trade.wap.pay;App 支付则由原生 Android、iOS 应用调用支付宝客户端,两者的接入方式和签约产品都不同。
即使应用类型选对了,出现“不符合接入条件”的提示还可能与以下情况有关:
- 商户账号尚未完成实名认证。
- 应用尚未完成创建、审核或上线流程。
- 经营类目不支持申请对应产品。
- 账号签约主体与应用主体不一致。
- 网站域名、ICP备案或业务信息未按要求填写。
- 申请的产品与当前应用类型不匹配。
- 已有签约状态、账号权限或风控限制影响申请。
具体原因要以开放平台控制台显示的错误提示和签约要求为准。仅凭“应用类型不符合”这句话,无法判断究竟是哪项资料存在问题。
接入步骤
1. 创建合适的应用
登录支付宝开放平台,在控制台创建适用于网站业务的网页/移动应用,并填写应用名称、业务说明、网站地址和商户主体等信息。
如果控制台允许在同一个应用中申请两种支付产品,可以共用一个 app_id。如果当前规则要求分别创建应用,则要按照控制台提示拆分,不能强行共用。
2. 申请支付产品
在应用的产品绑定或能力管理页面申请:
- 电脑网站支付
- 手机网站支付
这两种产品可能需要分别签约和审核。通过其中一种产品的审核,并不代表另一种产品也会自动开通。
3. 配置密钥
为应用配置 RSA2 密钥,并妥善保管应用私钥。服务端调用支付宝接口时通常需要:
app_id- 应用私钥
- 支付宝公钥或支付宝公钥证书
notify_urlreturn_url
应根据控制台当前支持的密钥模式,在普通公钥和证书方式之间选择。两种模式对应的 SDK 配置不能混用。
4. 根据访问终端选择接口
电脑浏览器调用:
alipay.trade.page.pay
手机浏览器调用:
alipay.trade.wap.pay
前端可以传递终端信息,但最终调用哪个接口,应由服务端决定。应用私钥不能直接交给浏览器。
Java 示例
以下示例只演示核心调用方式。SDK 版本、构造函数和证书配置方式,请以实际使用的支付宝官方 SDK 为准。
String gatewayUrl = "https://openapi.alipay.com/gateway.do";
String appId = "YOUR_APP_ID";
String merchantPrivateKey = "YOUR_PRIVATE_KEY";
String alipayPublicKey = "ALIPAY_PUBLIC_KEY";
AlipayClient alipayClient = new DefaultAlipayClient(
gatewayUrl,
appId,
merchantPrivateKey,
"json",
"UTF-8",
alipayPublicKey,
"RSA2"
);
电脑网页支付:
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl("https://www.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/pay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090001",
"total_amount": "99.00",
"subject": "网站订单",
"product_code": "FAST_INSTANT_TRADE_PAY"
}
""");
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String paymentHtml = response.getBody();
// 将 paymentHtml 原样返回给浏览器,由浏览器跳转到支付宝收银台
}
手机网站支付:
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://m.example.com/pay/return");
request.setNotifyUrl("https://www.example.com/pay/notify");
request.setBizContent("""
{
"out_trade_no": "ORDER_202609090002",
"total_amount": "99.00",
"subject": "移动端网站订单",
"product_code": "QUICK_WAP_WAY"
}
""");
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String paymentHtml = response.getBody();
// 将 paymentHtml 原样返回给手机浏览器
}
服务端可以通过明确的业务入口选择支付方式。例如,电脑端支付按钮进入 /pay/pc,移动端支付按钮进入 /pay/wap。这种做法通常比只依赖 User-Agent 判断更稳定。
支付结果处理
支付完成后的页面跳转不能作为订单付款成功的唯一依据。return_url 只负责把用户带回网站,用户可能在跳转前关闭页面,跳转请求也可能被伪造。
订单状态应以 notify_url 收到的支付宝异步通知为准。处理通知时,至少要完成以下检查:
- 使用支付宝公钥验证签名。
- 检查通知中的
app_id是否属于当前应用。 - 检查
out_trade_no是否存在。 - 核对订单金额和收款主体。
- 判断
trade_status是否属于业务认可的成功状态。 - 通过幂等处理防止重复发货。
- 处理成功后,按照支付宝协议返回成功响应。
示意代码:
Map<String, String> params = extractAlipayParameters(httpRequest);
boolean verified = AlipaySignature.rsaCheckV1(
params,
alipayPublicKey,
"UTF-8",
"RSA2"
);
if (!verified) {
return "failure";
}
String orderNo = params.get("out_trade_no");
String tradeStatus = params.get("trade_status");
String totalAmount = params.get("total_amount");
String notifiedAppId = params.get("app_id");
if (!appId.equals(notifiedAppId)) {
return "failure";
}
// 从数据库读取订单并核对金额,更新时必须保证幂等
if ("TRADE_SUCCESS".equals(tradeStatus)
|| "TRADE_FINISHED".equals(tradeStatus)) {
markOrderPaidIdempotently(orderNo, totalAmount);
}
return "success";
注意事项
- 金额、商品名称和订单号应由服务端生成,不能直接信任前端提交的数据。
out_trade_no必须在商户系统内保持唯一。- 私钥只能存放在服务端,不能写入网页、JavaScript 或移动端安装包。
- 正式环境和沙箱环境的网关、应用 ID、密钥及订单数据不能混用。
- 异步通知地址必须能够由支付宝服务器通过公网访问。
- 不能只根据浏览器跳转结果修改订单状态或发货。
- 如果网站嵌入第三方 App 的 WebView,还需要确认跳转、唤起支付宝和回跳能力是否符合该 App 的限制。
- 如果控制台仍提示应用类型不支持,可以重新创建网页/移动应用,再申请电脑网站支付和手机网站支付。修改接口名称无法绕过产品签约限制。
备注:内容仅供参考。
