支付宝 VR Pay 是否已下线?VR 一体机有哪些支付方案?
结论
此前的支付宝 VR Pay 已不适合作为可申请并持续维护的支付方案。从支付宝目前公开的开放能力来看,也没有足够依据证明支付宝将推出适配 VR 一体机的 Native SDK。是否支持定向合作、后续是否有相关产品规划,需要以支付宝开放平台根据具体商户资质给出的答复为准。
现阶段较稳妥的做法是由服务端调用 alipay.trade.precreate 创建当面付订单,再将返回的 qr_code 渲染到 VR 场景中,让用户使用手机支付宝扫码付款。服务端通过异步通知和主动查询确认支付结果。
如果 VR 一体机可以正常安装和唤起支付宝客户端,也可以评估 App 支付。不过,这只是 Android 支付能力在特定设备上的适配,不代表支付宝提供了 VR 专用 SDK。手机网站支付通常需要在浏览器和支付宝客户端之间跳转,不适合优先用于 VR 端。
推荐方案:在 VR 内展示支付宝二维码
支付流程可以这样设计:
- VR 客户端向业务服务端发送创建订单请求。
- 服务端生成唯一的
out_trade_no,并记录商品、金额和用户信息。 - 服务端调用支付宝
alipay.trade.precreate。 - 支付宝返回
qr_code。 - VR 客户端根据该内容生成二维码,并显示在虚拟场景中。
- 用户使用手机支付宝扫码付款。
- 服务端接收支付宝异步通知,验签后更新订单状态。
- 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 一体机的支付场景。
备注:内容仅供参考。
