支付宝 App 支付签约 vs H5 支付签约
支付宝 App 支付签约 vs H5 支付签约
在接入支付宝周期扣款(签约支付)时,App 与 H5 版本有一些差异。这里整理一份对比说明和示例代码,方便开发者快速接入。
🚀 H5 支付签约 Java 代码示例
public ContractOrderResultVo createH5Order(ContractOrderCreateVo orderVo) {
String executeTime = orderVo.getExecuteTime();
LocalDate requestExecuteTime = LocalDate.parse(executeTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
if (requestExecuteTime.getDayOfMonth() > 28) {
requestExecuteTime = requestExecuteTime.plusMonths(1).withDayOfMonth(1);
}
String periodUnit = orderVo.getPeriodUnit().toUpperCase();
Integer period = orderVo.getPeriod();
if (TariffTimeUnit.YEAR.name().equals(periodUnit)) {
period = period * 12;
periodUnit = PeriodUnit.MONTH.name();
}
// 🔹 H5 使用 WapPayRequest,而不是 AppPayRequest
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", orderVo.getPaymentOrderNo());
bizContent.put("total_amount", orderVo.getPaymentAmount());
bizContent.put("subject", orderVo.getCardName());
bizContent.put("product_code", "CYCLE_PAY_AUTH");
bizContent.put("timeout_express", "10m");
JSONObject agreementSignParams = new JSONObject();
agreementSignParams.fluentPut("personal_product_code", "CYCLE_PAY_AUTH_P")
.fluentPut("sign_scene", "INDUSTRY|DIGITAL_MEDIA")
.fluentPut("external_agreement_no", orderVo.getContractOrderNo())
.fluentPut("sign_notify_url", notifyUrl)
.fluentPut("access_params", new JSONObject().fluentPut("channel", "ALIPAYWAP"))
.fluentPut("period_rule_params", new JSONObject()
.fluentPut("period_type", periodUnit)
.fluentPut("period", period)
.fluentPut("execute_time", requestExecuteTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.fluentPut("single_amount", orderVo.getContractAmount())
);
bizContent.put("agreement_sign_params", agreementSignParams);
request.setBizContent(bizContent.toString());
request.setReturnUrl(returnUrl);
request.setNotifyUrl(notifyUrl);
AlipayTradeWapPayResponse response = client.pageExecute(request); // 🔹 H5 用 pageExecute
return ContractOrderResultVo.builder()
.originResult(response.getBody()) // H5 返回 form 表单 HTML
.executeTime(executeTime)
.build();
}
🔍 App vs H5 签约差异点
| 对比点 | App 支付签约 | H5 支付签约 |
|---|---|---|
| 请求类 | AlipayTradeAppPayRequest |
AlipayTradeWapPayRequest |
| 执行方法 | client.sdkExecute(request) |
client.pageExecute(request) |
| 渠道参数 | access_params.channel = ALIPAYAPP |
access_params.channel = ALIPAYWAP |
| 返回结果 | orderString(供客户端 SDK 拉起支付宝) |
HTML 表单页面(直接跳转或渲染给前端) |
| 场景 | 移动 App 内嵌 SDK | 移动浏览器 / H5 页面 |
| 跳转方式 | SDK 内部拉起支付宝 | form 表单自动提交 / 页面跳转 |
| 典型使用场景 | 原生 App | H5 网站、微信内 H5 支付 |
📌 总结
- App 签约:适用于原生 App,返回
orderString,需由客户端 SDK 拉起支付宝。 - H5 签约:适用于 H5 页面,返回 HTML form 表单,直接跳转或渲染给用户完成签约。
- 关键改动:
Request 类、执行方法、channel参数。
这份总结可直接用于技术博客,帮助团队快速理解差异。

浙公网安备 33010602011771号