PAYATHON 2026

支付宝 VR Pay 是否已下线?VR 一体机有哪些支付方案?

支付老李

结论

此前的支付宝 VR Pay 已不适合作为可申请并持续维护的支付方案。从支付宝目前公开的开放能力来看,也没有足够依据证明支付宝将推出适配 VR 一体机的 Native SDK。是否支持定向合作、后续是否有相关产品规划,需要以支付宝开放平台根据具体商户资质给出的答复为准。

现阶段较稳妥的做法是由服务端调用 alipay.trade.precreate 创建当面付订单,再将返回的 qr_code 渲染到 VR 场景中,让用户使用手机支付宝扫码付款。服务端通过异步通知和主动查询确认支付结果。

如果 VR 一体机可以正常安装和唤起支付宝客户端,也可以评估 App 支付。不过,这只是 Android 支付能力在特定设备上的适配,不代表支付宝提供了 VR 专用 SDK。手机网站支付通常需要在浏览器和支付宝客户端之间跳转,不适合优先用于 VR 端。

推荐方案:在 VR 内展示支付宝二维码

支付流程可以这样设计:

  1. VR 客户端向业务服务端发送创建订单请求。
  2. 服务端生成唯一的 out_trade_no,并记录商品、金额和用户信息。
  3. 服务端调用支付宝 alipay.trade.precreate。
  4. 支付宝返回 qr_code。
  5. VR 客户端根据该内容生成二维码,并显示在虚拟场景中。
  6. 用户使用手机支付宝扫码付款。
  7. 服务端接收支付宝异步通知,验签后更新订单状态。
  8. VR 客户端轮询业务服务端,或者通过 WebSocket 获取支付结果。

这种方式不要求 VR 设备安装支付宝,也不依赖 VR 浏览器唤起外部 App,通常比在设备内使用网页支付稳定。

服务端创建支付订单

下面是使用支付宝 Java SDK 的示意代码。网关、应用 ID、密钥和签名方式应从安全配置中读取,不能硬编码在客户端或代码仓库中。

AlipayClient alipayClient = new DefaultAlipayClient(
    "https://openapi.alipay.com/gateway.do",
    appId,
    merchantPrivateKey,
    "json",
    "UTF-8",
    alipayPublicKey,
    "RSA2"
);

AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setNotifyUrl("https://pay.example.com/alipay/notify");

AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setOutTradeNo("VR202609090001");
model.setTotalAmount("19.90");
model.setSubject("VR 应用内商品");
model.setTimeoutExpress("10m");

request.setBizModel(model);

AlipayTradePrecreateResponse response = alipayClient.execute(request);

if (response.isSuccess()) {
    String qrCodeContent = response.getQrCode();
    // 将 qrCodeContent 返回给 VR 客户端,由客户端生成二维码。
} else {
    throw new IllegalStateException(
        response.getCode() + ": " + response.getSubMsg()
    );
}

示例订单号只用于说明。生产环境必须保证 out_trade_no 在商户系统内唯一。订单金额应由服务端根据商品数据计算,不能直接采用 VR 客户端提交的价格。

确认支付结果

VR 客户端显示”扫码成功”或页面发生跳转,都不能作为发放商品的依据。支付是否成功,应以服务端确认的订单状态为准。

服务端需要先处理支付宝发送到 notify_url 的异步通知:

Map<String, String> params = extractRequestParams(request);

boolean signatureValid = AlipaySignature.rsaCheckV1(
    params,
    alipayPublicKey,
    "UTF-8",
    "RSA2"
);

if (!signatureValid) {
    response.setStatus(400);
    return;
}

String outTradeNo = params.get("out_trade_no");
String tradeStatus = params.get("trade_status");
String totalAmount = params.get("total_amount");
String appIdFromNotify = params.get("app_id");
String sellerId = params.get("seller_id");

// 再校验 app_id、seller_id、订单金额及订单归属。
if ("TRADE_SUCCESS".equals(tradeStatus)
        || "TRADE_FINISHED".equals(tradeStatus)) {
    // 使用事务或幂等更新,将订单标记为已支付。
}

验签成功后也不能立即发货,还需要检查:

  • app_id 是否属于当前应用;
  • seller_id 是否为预期收款账户;
  • out_trade_no 是否存在,并且属于当前商户;
  • total_amount 是否与服务端保存的订单金额一致;
  • 订单是否已经处理,防止重复发放权益。

如果异步通知出现延迟,或者 VR 客户端需要及时刷新状态,服务端可以调用 alipay.trade.query 主动查询。查询时应限制频率并设置截止时间,不能无限轮询。

VR 客户端的处理方式

VR 客户端只需从业务服务端获取二维码内容和订单状态,不应持有支付宝应用私钥。

public async Task StartPaymentAsync(string productId)
{
    CreateOrderResponse order =
        await paymentApi.CreateOrderAsync(productId);

    Texture2D qrTexture = QrCodeGenerator.Generate(order.qrCode);
    qrCodeRenderer.material.mainTexture = qrTexture;

    while (!order.IsExpired)
    {
        await Task.Delay(2000);

        OrderStatus status =
            await paymentApi.GetOrderStatusAsync(order.orderId);

        if (status == OrderStatus.Paid)
        {
            ShowPaymentSuccess();
            return;
        }

        if (status == OrderStatus.Closed)
        {
            ShowPaymentClosed();
            return;
        }
    }

    ShowPaymentExpired();
}

QrCodeGenerator 和 paymentApi 是业务侧的封装,不属于支付宝 API。生成二维码时应直接使用支付宝返回的 qr_code 原始内容,不要自行拼接支付链接。

其他方案是否可行

App 支付

如果一体机使用 Android 系统,并且可以安装、更新和正常唤起支付宝客户端,可以评估 alipay.trade.app.pay 和支付宝 App 支付 SDK。

采用该方案前,需要确认以下条件:

  • 设备系统和 CPU 架构是否符合 SDK 要求;
  • 支付宝客户端能否在设备上正常登录;
  • VR 应用能否唤起支付宝并接收返回结果;
  • 从二维支付宝界面切回 VR 应用时,交互体验是否可以接受;
  • 设备厂商的应用商店、系统权限和安全策略是否允许这一流程。

即使客户端返回支付成功,最终结果仍要由服务端验签并确认。由于这不是 VR 专用能力,正式采用前需要完成真机测试,并向支付宝确认当前的接入资格。

手机网站支付

手机网站支付通常用于手机浏览器,并可能通过页面跳转或唤起支付宝完成付款。不同 VR 浏览器对外部应用唤起、重定向、Cookie、返回页面和弹窗的支持差异较大,容易出现无法返回 VR 应用,或者支付已经完成但页面状态没有刷新的情况。

如果目标一体机的浏览器环境不固定,或者尚未经过充分验证,不建议将手机网站支付作为主要方案。

电脑网站支付

电脑网站支付可以作为备选方案,但其页面布局和交互面向传统浏览器设计,在 VR WebView 中的体验未必理想。如果主要需求只是让用户扫码付款,直接通过 alipay.trade.precreate 展示二维码,支付流程会更简单。

手机伴侣应用

如果产品已有手机端账号体系,也可以由 VR 端生成短码或登录二维码,让用户在手机 App、H5 页面或小程序中完成购买,再由服务端将权益同步到对应的 VR 账号。

这种方式不需要适配 VR 设备上的支付组件,但仍要处理账号绑定、订单归属和跨端状态同步。

接入时需要特别注意

  • 支付宝私钥、应用证书等敏感材料只能保存在服务端。
  • 创建订单、计算金额和发放权益都应由服务端完成。
  • 二维码需要设置明确的有效期,超时后应关闭订单或重新创建订单。
  • 支付回调必须验签,并检查商户、应用、订单和金额。
  • 回调处理必须具备幂等性,重复通知不能导致重复发货。
  • VR 客户端应轮询业务服务端,不能直接调用支付宝查询接口。
  • 数字内容、虚拟商品和特定行业可能有额外的准入要求,具体以签约产品和商户审核结果为准。
  • 上线前需要分别测试支付成功、取消、超时、重复扫码、网络中断、回调延迟和退款等场景。

在支付宝没有发布新的 VR 专用产品说明前,可以采用”VR 展示二维码、手机支付宝完成支付、服务端确认结果”的设计。这套方案不依赖已经停止维护的 VR Pay,也适用于大多数 VR 一体机的支付场景。

备注:内容仅供参考。