内网自助设备能否申请支付宝手机H5网站支付
结论
技术上可以使用支付宝手机网站支付,但申请能否通过,要看支付宝对商户资质、经营场景和网站内容的实际审核结果。
自助设备位于内网并不会直接影响接入。支付请求、支付页面和异步通知都可以由公网后台处理。自助设备负责生成订单二维码,客户完成支付后,再通过确认码或其他方式核验支付结果。
但如果跳转页面只显示”姓名、费用、立即支付”,很难充分说明实际经营内容和交易标的,可能无法通过手机网站支付的准入审核。建议将其完善为可公开访问的业务和订单页面,清楚展示商户信息、服务或商品名称、订单金额、订单编号、退款规则和客服说明等内容。是否符合准入要求,最终以支付宝开放平台的审核结果为准。
推荐的业务流程
系统可以分为三个部分:
- 内网自助设备
- 可从互联网访问的业务后台
- 支付宝支付系统
具体流程可以这样设计:
- 自助设备在本地生成业务订单。
- 设备通过允许的网络通道、人工同步机制或其他安全方式,将订单提交给公网后台。
- 公网后台为订单生成一个不可预测的访问令牌。
- 自助设备展示包含公网订单地址的二维码,例如:
https://pay.example.com/order/8d1f6d0f8af44961992b07ce72d66a4f
- 客户扫码进入订单详情页,核对服务名称、付款金额和商户信息。
- 客户点击”立即支付”,后台调用支付宝手机网站支付接口。
- 支付宝将支付结果异步通知给公网后台。
- 后台完成验签,并主动查询订单状态。确认支付成功后,生成一次性确认码。
- 客户在自助设备上输入确认码,设备通过本地数据、安全同步数据或受控接口完成核验。
如果自助设备完全不能与公网后台通信,确认码就必须支持离线验证,否则设备无法判断订单是否已经支付。
支付页面应展示哪些内容
网站不必做成完整的网上商城,但要让审核人员和客户看清商户经营什么,以及当前订单购买的是什么。页面建议至少包含:
- 商户名称和经营主体信息
- 服务或商品名称
- 订单编号
- 应付金额
- 订单创建时间和有效期
- 收款用途或服务说明
- 客服联系方式
- 退款、取消或售后规则
- 隐私政策及必要的用户协议
- “立即支付”按钮
例如,页面不应只显示:
姓名:张三
费用:100 元
更合适的订单信息是:
服务项目:自助体检服务
订单编号:S202609090001
服务对象:张**
应付金额:100.00 元
订单有效期:2026-09-09 15:30
收款方:某某科技有限公司
不要把姓名、证件号、手机号等个人信息直接写入二维码 URL,也不宜在页面上完整展示。二维码只应包含随机订单令牌,具体订单信息由服务器根据令牌查询。
手机网站支付调用示例
手机网站支付通常由服务端调用 alipay.trade.wap.pay。下面的示例只保留关键结构,实际参数和 SDK 用法应以支付宝开放平台当前文档及所用 SDK 版本为准。
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setReturnUrl("https://pay.example.com/payment/return");
request.setNotifyUrl("https://pay.example.com/payment/notify");
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo("S202609090001");
model.setTotalAmount("100.00");
model.setSubject("自助体检服务");
model.setProductCode("QUICK_WAP_WAY");
request.setBizModel(model);
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request);
if (response.isSuccess()) {
String paymentForm = response.getBody();
// 将 paymentForm 返回给手机页面,由浏览器提交到支付宝收银台
}
支付金额和商品名称必须由服务端根据订单数据生成,不能直接采用手机页面提交的金额。
异步通知处理
不能根据手机端的跳转结果判断支付是否成功。return_url 只用于向客户展示结果页面,实际支付结果应以 notify_url 的验签结果为准,必要时还要主动查询订单。
处理异步通知时,至少要检查:
- 通知签名是否合法
app_id是否属于当前商户应用out_trade_no是否存在total_amount是否与本地订单一致seller_id或收款主体是否正确- 订单是否已经处理
trade_status是否符合成功条件
示意代码如下:
Map<String, String> params = getNotifyParams(request);
boolean valid = AlipaySignature.rsaCheckV1(
params,
alipayPublicKey,
"UTF-8",
"RSA2"
);
if (!valid) {
return "failure";
}
Order order = orderService.findByOrderNo(params.get("out_trade_no"));
if (order == null) {
return "failure";
}
if (!order.getAmount().toPlainString().equals(params.get("total_amount"))) {
return "failure";
}
String tradeStatus = params.get("trade_status");
if ("TRADE_SUCCESS".equals(tradeStatus)
|| "TRADE_FINISHED".equals(tradeStatus)) {
orderService.markPaidIdempotently(
order.getOrderNo(),
params.get("trade_no")
);
}
return "success";
支付宝可能重复发送异步通知,因此订单更新必须具备幂等性。重复收到通知时,不能重复生成确认码、发放服务或记账。
确认码的设计
如果自助设备能够通过受控方式查询公网后台,建议使用订单号和随机令牌查询支付状态,不必让客户手工输入短确认码。
如果设备必须完全离线,可以使用带数字签名的确认数据。后台生成订单摘要后,使用私钥签名;设备预置公钥,在本地验证签名。二维码或确认数据可以包含:
{
"order_no": "S202609090001",
"amount": "100.00",
"paid_at": 1788937200,
"expires_at": 1788939000,
"nonce": "f8c76f57bd944dd8"
}
后台随后对规范化的数据进行数字签名。设备验证时还要检查:
- 签名是否合法
- 订单号是否与当前业务一致
- 金额是否一致
- 确认数据是否过期
nonce是否已经使用- 当前订单是否已经核销
不建议把四位或六位随机数字直接作为确认码。短码容易被猜中,也可能发生碰撞。如果业务必须使用短码,应限制尝试次数,设置较短的有效期,并结合订单号、设备编号等信息进行校验。
还需要解决的关键问题
自助设备如何生成公网订单
如果设备完全不能访问互联网,就无法实时通知公网后台创建订单。因此,必须先确定订单数据如何进入公网系统,例如:
- 为设备开放仅能访问指定业务网关的受控通道
- 通过内外网隔离交换系统同步订单
- 预先生成可使用的订单凭证
- 由另一个具备联网能力的业务系统创建订单
如果不存在任何数据交换方式,公网后台就无法识别设备刚刚创建的订单,也无法安全生成对应的支付页面。
二维码不能携带敏感信息
不要使用下面这种地址:
https://pay.example.com/pay?name=张三&idCard=...&amount=100
应使用不可预测、可过期且可撤销的随机令牌:
https://pay.example.com/order/8d1f6d0f8af44961992b07ce72d66a4f
后台根据令牌读取订单信息。令牌要设置有效期,并在订单支付完成或取消后失效。
网站必须能从公网正常访问
支付页面、return_url 和 notify_url 都应部署在稳定的公网服务上。通常还需要配置 HTTPS、有效的域名证书,以及与经营主体相符的网站信息。
备案、域名归属和页面审核要求可能会因主体类型、地区和支付宝产品政策而变化。提交申请前,应查看支付宝开放平台当时的规则。
申请接入时的建议
申请材料应完整说明”线下自助设备下单、客户通过手机完成付款”这一实际业务场景,并提供:
- 自助设备照片或操作流程
- 二维码扫码页面
- 完整订单详情页
- 支付成功页
- 实际提供的服务或商品说明
- 商户资质和经营范围
- 客服及售后规则
- 内网设备与公网支付后台的系统架构说明
如果现有页面只是一个没有业务说明的支付跳转页,建议完善后再提交审核。也可以先向支付宝开放平台确认,该场景适合手机网站支付,还是更适合当面付等线下收款产品。产品选择既要考虑能否调起支付宝,也要符合实际交易场景和支付宝当前的准入政策。
这套方案在系统架构上可行,但只显示”姓名、费用和支付按钮”的页面有明显的审核风险。申请前应补全经营内容、订单信息和安全核验机制,使页面与手机网站支付的使用场景相符。
备注:内容仅供参考。
