支付宝 App 支付签约 vs H5 支付签约

支付宝 App 支付签约 vs H5 支付签约

在接入支付宝周期扣款(签约支付)时,AppH5 版本有一些差异。这里整理一份对比说明和示例代码,方便开发者快速接入。


🚀 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 参数。

这份总结可直接用于技术博客,帮助团队快速理解差异。

posted @ 2025-08-22 14:54  芬尼拔  阅读(29)  评论(0)    收藏  举报