支付宝浏览器H5如何通过AlipayJSBridge调起支付
明确结论
在支付宝客户端内置浏览器中,H5 页面可以通过 AlipayJSBridge.call('tradePay', ...) 调起收银台,但需要满足以下条件:
- 页面运行在支付宝客户端的 WebView 中;
- 商户已开通并签约相应的支付产品;
- 商户服务端通过支付宝开放接口创建支付订单;
- 前端使用服务端返回的支付宝交易号
trade_no发起支付; - 服务端通过异步通知或主动查询确认最终支付结果,不能只依赖前端回调。
如果支付宝已经停止向你的应用类型、支付产品或业务类目提供 H5 JSAPI 接入,就不能通过伪装 User-Agent、使用套壳页面或从小程序跳转到 H5 等方式绕过审核。账户余额充值、积分充值、储值卡等场景能否上线,取决于资金性质、使用范围、商户资质和平台规则。如果平台要求使用小程序,而小程序规则又禁止这类业务,即使技术上可以调起支付,也不代表业务符合规定。
为什么会出现“关闭内置浏览器 JSAPI 支付”的情况
接口无法调用,不一定意味着支付宝已经全面关闭 AlipayJSBridge。常见原因有以下几种:
-
支付产品或签约权限发生变化
商户可能没有开通相应产品,也可能是原产品已停止新增接入,或者需要迁移到其他支付方案。具体情况应以支付宝开放平台控制台中的签约状态和官方工单答复为准。
-
业务场景不符合平台准入要求
账户余额充值、积分充值和储值消费可能涉及预付资金、虚拟权益、资金沉淀、套现及退款责任,通常会受到更严格的审核。
-
应用载体与产品要求不一致
部分支付能力可能只允许从支付宝小程序发起,不再接受普通 H5 页面直接接入。即使 H5 页面是在支付宝客户端内打开,也不表示它拥有相应的调用权限。
-
风控或安全要求
支付平台需要核实商户身份、订单来源、商品内容和资金用途。如果任意 H5 页面都能直接调用客户端支付能力,会增加订单伪造、域名劫持和钓鱼支付等风险。
因此,要结合商户 PID、应用、签约产品、业务类目和接口错误码,才能判断“关闭”的具体原因。个别商户无法调用接口,不能说明整个接口已经全面下线。
推荐的调用流程
建议按照以下流程接入:
- 用户在支付宝客户端中打开商户 H5 页面。
- H5 请求商户服务端创建订单。
- 商户服务端调用支付宝开放接口,例如
alipay.trade.create。 - 服务端取得支付宝交易号
trade_no,并将其返回给 H5。 - H5 等待
AlipayJSBridge就绪。 - H5 调用
tradePay,传入tradeNO。 - 支付结束后,前端只展示处理中状态。
- 服务端对异步通知进行验签,或者调用订单查询接口确认最终状态。
支付金额、商品名称和商户订单号等重要参数不能由前端直接决定。服务端应根据业务订单创建支付宝订单,防止用户篡改金额。
前端调用示例
以下示例假设 /api/payment/alipay/create 用于创建业务订单,并返回支付宝生成的 trade_no:
<button id="payButton" type="button">支付宝支付</button>
<script>
function ready(callback) {
if (window.AlipayJSBridge) {
callback();
return;
}
document.addEventListener(
'AlipayJSBridgeReady',
callback,
false
);
}
async function createOrder() {
const response = await fetch('/api/payment/alipay/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
productId: 'PRODUCT_001'
})
});
const result = await response.json();
if (!response.ok || !result.tradeNo) {
throw new Error(result.message || '创建支付订单失败');
}
return result;
}
async function pay() {
if (!window.AlipayJSBridge) {
throw new Error('当前环境不是支付宝客户端内置浏览器');
}
const order = await createOrder();
ready(function () {
AlipayJSBridge.call(
'tradePay',
{
tradeNO: order.tradeNo
},
function (result) {
console.log('tradePay result:', result);
// 回调仅用于改善页面交互,不能作为到账依据。
// 建议跳转到结果页,由结果页向服务端查询订单状态。
window.location.href =
'/payment/result?orderNo=' +
encodeURIComponent(order.orderNo);
}
);
});
}
document
.getElementById('payButton')
.addEventListener('click', function () {
pay().catch(function (error) {
console.error(error);
alert(error.message || '暂时无法发起支付');
});
});
</script>
请求参数中的字段名通常是 tradeNO,服务端开放接口返回的字段通常写作 trade_no。两者的大小写和命名形式不同,不能直接照搬。
JSON 输入和输出示例
商户 H5 请求自己的服务端时,可以使用以下格式:
{
"productId": "PRODUCT_001"
}
服务端成功创建订单后返回:
{
"orderNo": "ORDER_202609090001",
"tradeNo": "2026090922000000000000000000"
}
传给 AlipayJSBridge 的参数是:
{
"tradeNO": "2026090922000000000000000000"
}
客户端回调通常包含结果码等信息,例如:
{
"resultCode": "9000"
}
不同客户端版本和支付场景返回的字段可能不同,应以当前接入文档和实际回调为准。即使前端收到了表示成功的结果码,也不能直接给账户增加余额、发放积分或交付高价值权益。
服务端必须确认支付结果
服务端应接收支付宝异步通知,并完成以下检查:
- 验证通知签名;
- 核对
app_id、商户身份和通知来源; - 核对商户订单号;
- 核对实付金额、币种和商品信息;
- 判断交易状态是否满足交付条件;
- 确保入账和权益发放操作具有幂等性;
- 保存订单、通知和退款记录。
如果异步通知还未到达,服务端可以调用订单查询接口。浏览器跳转参数、前端回调和页面截图都不能作为最终到账凭证。
非支付宝浏览器如何处理
AlipayJSBridge 是支付宝客户端注入的内置对象,在微信、系统浏览器和普通 App WebView 中通常不存在。页面调用前应检查运行环境:
if (!window.AlipayJSBridge) {
console.warn('AlipayJSBridge is unavailable');
}
在普通手机浏览器中,应根据商户已经签约的产品,使用支付宝手机网站支付等官方方案,不能自行构造或注入 AlipayJSBridge。具体使用哪种接口,应以商户当前能够签约的产品为准。
页面也不能只依赖 User-Agent 判断环境。User-Agent 可以修改,调用前仍须检查 window.AlipayJSBridge 是否存在。
账户余额充值和积分充值如何合规处理
接入前,需要先确认“余额”和“积分”的实际业务属性。
账户余额
如果用户付款后获得可供以后消费的余额,特别是可以跨商户使用、转赠、提现或兑换现金的余额,可能涉及预付资金、储值、支付业务或其他监管要求,不能简单地将其包装成普通商品订单。
相对稳妥的处理方式包括:
- 按实际商品或服务逐笔收款,不设置充值余额;
- 将余额限制为依法合规的单用途预付权益,并确认商户具备所需资质;
- 明确使用范围、有效期、退款规则和消费者权益保障;
- 分别记录充值资金和赠送权益;
- 禁止提现、套现、转账及未经许可的跨商户流通;
- 上线前向支付宝提交完整的业务说明,并取得明确的准入结论。
积分
积分不应被设计为现金替代物。免费获得的营销积分和用户直接付费购买、可以交易或兑换现金的积分,风险并不相同。
应避免以下设计:
- 用户直接使用人民币购买可流通积分;
- 积分可以提现或变相兑换现金;
- 用户之间可以自由转让或交易积分;
- 积分可以在无关联的商户之间通用;
- 以“购买商品赠积分”的名义掩盖实际的积分充值。
如果积分只是消费奖励,应在规则中写明获取方式、使用范围、有效期、退货扣回机制,以及不可提现、不可转让等限制。
被要求使用小程序时怎么办
如果平台明确要求该场景必须接入支付宝小程序,就应使用小程序官方支付能力,并按照小程序的类目、内容和支付规范提交审核。
如果账户充值或积分充值功能无法通过审核,不能采用以下方式规避:
- 在小程序中嵌入 H5,继续完成被禁止的充值;
- 先展示普通商品,支付后再转换为余额或积分;
- 使用个人收款码或让其他商户代收;
- 修改名称、类目或页面描述,隐藏资金的实际用途;
- 审核期间关闭功能,上线后再远程开启。
可以调整业务模式,改为按实际商品或服务直接支付;也可以准备资金流向、权益规则、退款机制和经营资质等材料,向支付宝开放平台申请业务评估。
如果平台仍然明确拒绝准入,就应停止在该渠道提供充值功能,不能另找技术入口绕过限制。AlipayJSBridge 只能解决如何调起支付,不能决定某类交易是否允许开展。涉及预付资金、虚拟权益或可能兑换现金的业务,上线前还应由具备相关经验的法律或合规人员结合经营地区和实际模式进行审查。
备注:内容仅供参考。
