PAYATHON 2026

同时接入网页端和移动端支付宝支付应选择哪种应用类型?

支付小周

明确结论

同一网站如果需要同时支持电脑网页支付和手机浏览器支付,应在支付宝开放平台创建面向普通商户的“网页/移动应用”类应用,并分别申请以下支付能力:

  • 电脑网页支付: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_url
  • return_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 收到的支付宝异步通知为准。处理通知时,至少要完成以下检查:

  1. 使用支付宝公钥验证签名。
  2. 检查通知中的 app_id 是否属于当前应用。
  3. 检查 out_trade_no 是否存在。
  4. 核对订单金额和收款主体。
  5. 判断 trade_status 是否属于业务认可的成功状态。
  6. 通过幂等处理防止重复发货。
  7. 处理成功后,按照支付宝协议返回成功响应。

示意代码:

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 的限制。
  • 如果控制台仍提示应用类型不支持,可以重新创建网页/移动应用,再申请电脑网站支付和手机网站支付。修改接口名称无法绕过产品签约限制。

备注:内容仅供参考。