H5 跳转支付宝小程序签约付款需要开发哪些页面?
明确结论
不能只接入一个支付按钮。
支付宝会提供收银台、签约确认等平台页面,但商家仍需开发支付宝小程序中的业务承接页面,以及服务端的订单、签约、支付回调和状态查询能力。至少包括:
- H5 跳转后的承接页
- 订单确认或订单加载页
- 签约发起及签约结果处理
- 支付发起及支付结果页
- 异常、取消和重试页面
- 必要的协议、隐私政策及客服入口
如果签约产品支持”签约后立即支付”,可以把上述步骤集中在一个页面中,但相关业务逻辑仍然不能省略。
哪些页面由支付宝提供
以下页面通常由支付宝提供,商家不需要自行仿制:
- 支付密码输入、付款方式选择等支付宝收银台页面
- 签约授权确认页面
- 实名认证、风险验证等支付宝安全页面
小程序调用相应能力后,支付宝会展示对应的系统页面。商家不应自行采集支付密码、银行卡号等敏感信息。
“独立签约付款”可能对应周期扣款、先享后付、代扣协议或其他签约产品。不同产品的签约 API、准入要求和页面流程并不完全相同,应以商户实际开通产品的文档为准。
支付宝小程序需要开发什么
1. H5 跳转承接页
H5 拉起支付宝小程序时,只传递用于定位业务的参数,例如短期有效的跳转令牌或订单引用。不要把订单金额、支付状态直接作为可信参数。
alipays://platformapi/startapp?appId=支付宝小程序AppId&page=pages/order/index%3Ftoken%3D一次性令牌
小程序打开后,使用令牌向商家服务端查询订单:
Page({
async onLoad(query) {
if (!query.token) {
this.setData({ error: '缺少订单参数' });
return;
}
const result = await my.request({
url: 'https://api.example.com/orders/resolve',
method: 'POST',
headers: {
'content-type': 'application/json'
},
data: {
token: query.token
}
});
this.setData({
order: result.data.order
});
}
});
服务端必须重新校验订单归属、金额、商品状态和令牌有效期。
2. 订单确认或加载页
用户需要清楚当前购买的商品、支付金额和签约内容。即使不设置完整的商品详情页,也至少要展示:
- 商品或服务名称
- 支付金额
- 签约服务名称
- 扣款周期、扣款条件和解约方式
- 商户名称及客服入口
小程序打开后直接拉起签约页面,容易让用户不清楚授权对象,也可能影响审核和转化。
3. 签约流程
签约请求通常由商家服务端创建,小程序再按照产品要求打开支付宝签约页面。不能只根据前端回调判断签约结果,应以服务端异步通知或主动查询结果为准。
建议采用以下状态流程:
未签约 → 签约处理中 → 已签约 → 待支付 → 支付处理中 → 支付成功
↘ 签约失败 ↘ 支付失败
签约和支付是否由同一个接口完成,取决于商户已经开通的支付宝产品。在没有确认产品类型前,不要把普通支付接口当作代扣签约接口使用。
4. 支付发起页
使用支付宝小程序支付时,常见做法是由服务端调用支付宝交易接口创建交易,再将支付宝交易号返回给小程序。小程序通过 my.tradePay 拉起支付宝收银台:
my.tradePay({
tradeNO: '服务端返回的支付宝交易号',
success: (result) => {
// 此处只表示客户端调用结束,不能直接作为最终入账依据
this.queryOrderStatus();
},
fail: () => {
my.alert({
title: '支付未完成',
content: '请稍后重试或查询订单状态'
});
}
});
订单金额、商品信息和商户订单号应由服务端生成。不要让小程序提交未经校验的金额并直接创建交易。
5. 支付结果页
客户端返回成功,不代表商家已经确认收款。结果页应调用商家服务端查询订单:
async function queryOrderStatus(orderId) {
const response = await my.request({
url: `https://api.example.com/orders/${encodeURIComponent(orderId)}`,
method: 'GET'
});
return response.data.status;
}
服务端应验签并处理支付宝异步通知,同时提供主动查询作为补偿机制。只有服务端确认交易成功后,才能发货、开通会员或履行业务服务。
6. 异常处理页面
至少要处理以下情况:
- 用户取消签约
- 签约成功但支付失败
- 支付处理中,暂时没有最终结果
- 订单已关闭或重复支付
- H5 传入的令牌过期
- 用户未安装支付宝或无法正常拉起
- 用户从支付宝返回抖音后需要继续查询订单
页面应提供重新查询、重新支付、返回订单和联系客服等操作,不能在失败后只显示空白页。
推荐的完整实现流程
- 用户在抖音内的 H5 选择商品并提交订单。
- H5 请求商家服务端创建业务订单。
- 服务端生成一次性、短期有效的跳转令牌。
- H5 使用合规的跳转方式拉起支付宝,并打开指定的小程序页面。
- 小程序使用令牌从服务端获取订单,不信任 URL 中的金额和支付状态。
- 小程序展示订单与签约信息。
- 服务端创建签约请求,小程序进入支付宝提供的签约确认页面。
- 服务端确认签约成功后创建支付交易。
- 小程序调用支付能力,由支付宝展示收银台。
- 服务端处理支付宝异步通知并更新订单。
- 小程序结果页查询服务端,展示最终的签约和支付状态。
还需要开发的服务端能力
这类方案不只是开发小程序页面,服务端至少还要具备以下能力:
- 创建业务订单
- 生成并校验跳转令牌
- 创建签约请求
- 查询签约状态
- 创建支付交易
- 接收并验签异步通知
- 主动查询交易结果
- 关闭超时订单
- 幂等处理和重复通知处理
- 退款、解约及售后处理
签约号、商户订单号和支付宝交易号应分别保存,不能共用同一个字段。
注意事项
抖音内跳转限制
抖音内置浏览器能否通过 URL Scheme 直接拉起支付宝,可能受平台规则、系统版本、投放资质和风控策略影响。上线前应分别测试 Android、iOS 和不同的失败回退路径,不能默认所有环境都能直接拉起。
小程序审核
承接页需要提供真实、完整的业务内容。如果小程序只有一个按钮,打开后立即进入签约或支付流程,可能无法清楚说明商品、服务和授权关系。具体审核要求应以提交审核时的平台规范为准。
签约必须充分告知
如果涉及自动续费、周期扣款或免密代扣,应明确展示:
- 扣款金额或金额计算方式
- 扣款周期和触发条件
- 服务期限
- 取消签约的方法
- 退款与售后规则
不要使用默认勾选、含糊的按钮文案,也不要隐藏解约入口。
防止参数篡改
H5 跳转参数只能用于定位订单,不能决定实际支付金额。服务端必须根据订单记录生成支付宝请求,并校验订单所属用户、订单状态和有效期。
保证接口幂等
用户可能重复点击按钮,也可能在关闭小程序后重新进入。服务端还可能多次收到异步通知。创建交易、更新订单和发放权益时,都要使用商户订单号进行幂等控制。
支付宝提供的是签约确认页和支付收银台,不是完整的商家业务页面。一个能够上线的最小方案,通常也要包含小程序承接页、订单确认、结果展示、异常重试和对应的服务端闭环,不能只接入支付功能。
备注:内容仅供参考。
