PAYATHON 2026

支付宝分阶段担保交易如何避免二清?

支付老李

结论

通常情况下,并没有一种面向普通商户开放的支付宝接口,能直接实现“企业一次冻结全部款项,之后由平台按 30%/40%/30%分期支付给人才”,并且天然避免二清风险。

目前主要有三种可行路径:

  1. 支付宝直付通等平台型产品:由支付宝处理收款、分账和结算,平台负责传递订单信息及资金分配指令。这类产品最接近上述需求。
  2. 资金预授权:先冻结企业资金,再根据业务结果扣款或解冻。但预授权不等于第三方资金托管。是否支持多次扣款、是否能向不同人才结算,取决于支付宝为商户实际开通的产品能力。
  3. 持牌机构提供的托管、监管账户或薪酬代发方案:如果支付宝现有产品无法覆盖该业务模型,应由银行、支付机构或人力资源服务机构处理资金。

不能使用普通转账、留存商户余额或平台内部余额账本,自行拼装所谓的“担保交易”。资金没有进入平台银行账户,也不代表一定不存在二清。监管判断还会考虑平台是否实际控制资金、是否决定收款人和金额,以及资金是否在平台形成沉淀。

为什么简单的“冻结后分三次解冻”行不通

支付宝的“冻结”“扣款”“解冻”分别对应不同操作:

  • 冻结:限制付款方使用部分资金。
  • 扣款:将冻结资金转化为一笔实际支付。
  • 解冻:解除资金限制,相关资金通常恢复至原付款方的可用余额。
  • 分账:在支付机构支持的产品框架内,按照既定规则将交易款结算给多个接收方。

所以,“解冻 30% 给人才”并不是准确的技术描述。实际需求通常是:

冻结全部金额
    ├── 达成阶段一:从冻结金额中完成 30% 支付
    ├── 达成阶段二:从剩余冻结金额中完成 40% 支付
    └── 达成阶段三:完成剩余 30% 支付

预授权产品通常用于保障付款方与商户之间的履约,不能默认支持以下能力:

  • 同一笔授权分三次完成支付;
  • 每次支付结算给不同自然人;
  • 平台自由决定最终收款人;
  • 冻结期限覆盖整个招聘履约周期;
  • 人才个人账户作为该产品的结算接收方。

是否具备这些能力,必须以支付宝与商户签署的产品协议、开放平台权限及接口实际返回结果为准,不能只看接口名称。

推荐的实施方案

方案一:使用直付通或同类平台型产品

如果平台负责撮合企业和人才,并根据履约情况计算各方应得金额,应优先向支付宝确认平台型收付和分账方案。

典型流程如下:

  1. 企业通过支付宝支付订单款项。
  2. 支付宝承载交易资金。
  3. 平台维护业务订单及各阶段的履约状态。
  4. 条件满足后,平台向支付宝提交分账或结算指令。
  5. 支付宝将相应金额结算给已签约并完成实名验证的接收方。
  6. 退款、分账回退和争议处理仍通过原交易链路完成。

在这种模式下,平台不应先将款项收进自己的银行账户,再通过转账支付给人才。即使使用分账产品,也只能按照审核通过的业务场景、分账比例、接收方类型和结算周期操作。

方案二:预授权加阶段性支付

如果支付宝确认商户当前权限支持“同一授权下多次完成支付”,可以考虑使用预授权模式:

  1. 企业授权冻结合同总额。
  2. 平台记录支付宝授权单号,但不保存支付密码等敏感信息。
  3. 每个阶段完成后,由企业确认,或按照双方约定的规则触发扣款。
  4. 订单取消时,解冻尚未支付的金额。
  5. 到期前仍未履约的订单,进入取消、重新授权或争议处理流程。

支付宝资金预授权的相关接口通常包括冻结和解冻,例如:

alipay.fund.auth.order.app.freeze
alipay.fund.auth.order.unfreeze

实际使用哪个接口完成支付、同一笔授权能否多次支付,以及单次与累计金额限制,都应以商户后台当前可见的文档和签约权限为准。在确认产品能力之前,不能将“多次扣款”作为系统设计的前提。

预授权也不会自动解决收款主体问题。如果完成支付后,资金只能结算至签约商户,再由平台付款给人才,仍可能形成二次清算链路。

方案三:不冻结总额,企业分阶段直接支付

如果不要求全额冻结,最简单的资金结构是由企业在每个阶段直接向人才付款:

阶段一完成:企业直接支付 30%
阶段二完成:企业直接支付 40%
阶段三完成:企业直接支付 30%

平台只保存合同、验收记录和支付结果,不代收、不代付,也不提供可提现余额。

这种方案的资金路径最清楚,但不能保证企业在后续阶段仍有足够余额。如果必须提供履约保障,可以结合银行保函、保证保险、授信或持牌机构托管,不应由平台自行冻结资金。

订单系统应如何设计

无论最终采用哪种支付宝产品,业务状态和支付状态都应分开管理:

业务状态:
CREATED
SIGNED
STAGE_1_ACCEPTED
STAGE_2_ACCEPTED
STAGE_3_ACCEPTED
COMPLETED
DISPUTED
CANCELLED

资金状态:
NOT_AUTHORIZED
AUTHORIZED
PARTIALLY_PAID
FULLY_PAID
PARTIALLY_REFUNDED
RELEASED

金额应使用最小货币单位计算,避免浮点数误差:

long totalFen = 100_00L;

long stage1Fen = totalFen * 30 / 100;
long stage2Fen = totalFen * 40 / 100;
long stage3Fen = totalFen - stage1Fen - stage2Fen;

最后一期用总金额减去前两期金额,可以避免比例换算产生尾差。

阶段支付代码示例

以下是业务层伪代码,主要展示状态控制和幂等处理。AlipayGateway 中的具体接口需要按照实际签约产品实现,示例中的方法名不是支付宝官方 API。

@Transactional
public PaymentResult payStage(
        String orderId,
        int stage,
        String enterpriseId,
        String idempotencyKey) {

    Order order = orderRepository.lockById(orderId);

    if (!order.getEnterpriseId().equals(enterpriseId)) {
        throw new ForbiddenException("无权操作该订单");
    }

    StagePayment payment =
        stagePaymentRepository.findByIdempotencyKey(idempotencyKey);

    if (payment != null) {
        return payment.toResult();
    }

    long amountFen = order.getStageAmountFen(stage);

    if (!order.canPay(stage)) {
        throw new IllegalStateException("当前阶段不允许支付");
    }

    if (order.getPaidAmountFen() + amountFen > order.getTotalAmountFen()) {
        throw new IllegalStateException("累计支付金额超过订单总额");
    }

    String requestNo = orderId + "-STAGE-" + stage;

    StagePayment created = StagePayment.pending(
        requestNo,
        idempotencyKey,
        orderId,
        stage,
        amountFen
    );
    stagePaymentRepository.save(created);

    AlipayResult result = alipayGateway.captureAuthorizedAmount(
        order.getAuthorizationNo(),
        requestNo,
        amountFen
    );

    created.updateFrom(result);
    stagePaymentRepository.save(created);

    return created.toResult();
}

处理异步通知时,不能只根据请求参数更新订单,至少需要完成以下验证:

public void handleAlipayNotify(Map<String, String> params) {
    if (!alipaySignatureVerifier.verify(params)) {
        throw new SecurityException("支付宝通知验签失败");
    }

    String requestNo = params.get("out_request_no");
    StagePayment payment = stagePaymentRepository.lockByRequestNo(requestNo);

    verifySellerIdentity(params);
    verifyApplicationIdentity(params);
    verifyAmount(payment, params);
    verifyCurrency(params);

    if (payment.isSuccess()) {
        return;
    }

    payment.markSuccess(params.get("trade_no"));
    orderRepository.increasePaidAmount(
        payment.getOrderId(),
        payment.getAmountFen()
    );
}

不同产品和接口使用的字段名称可能不同,应以实际接入文档为准。无论使用哪种接口,都要验证签名、商户身份、订单号和金额,并确保重复通知不会造成重复入账。

必须提前向支付宝确认的问题

开发前,应将完整的资金路径图提交给支付宝客户经理或服务商,并通过书面方式确认以下问题:

  • 业务是否允许企业向自然人或灵活用工人员付款;
  • 收款人才是否需要开户注册、实名认证或签署电子协议;
  • 是否支持一次冻结后分多次完成支付;
  • 冻结的有效期及到期后的处理规则;
  • 支付结果最终结算给人才、平台商户还是其他主体;
  • 是否支持分账、分账回退和部分退款;
  • 发生劳动争议或服务争议时,由谁决定扣款或解冻;
  • 平台是否需要人力资源服务、劳务派遣等相关资质;
  • 相关款项属于工资、劳务报酬还是平台服务交易;
  • 个人所得税申报、代扣代缴和发票链路由谁负责。

如果支付宝不能明确支持“一次冻结、三次支付给人才”,就不应使用普通转账接口模拟这种能力。

注意事项

二清取决于资金链路和业务控制权,不只是使用了哪个接口。以下设计的风险较高:

  • 企业先将款项支付至平台商户号,再由平台转账给人才;
  • 将商户余额作为人才的虚拟账户余额;
  • 平台允许人才充值、提现或相互转账;
  • 使用红包、转账到支付宝账户等接口代替正式分账;
  • 平台自行长期留存待结算资金;
  • 名义上是平台服务交易,实际资金却属于企业应付给人才的报酬。

如果企业与人才之间构成劳动关系,相关款项可能属于工资,而不是普通电商交易款。工资支付时间、工资账户、个人所得税和用工责任,都需要根据实际合同关系判断。支付机构同意开放某个接口,不代表整个用工和清算模式已经合规。

最终方案需要同时通过支付宝的产品审核,并由熟悉支付清算、劳动用工和税务的专业人员审查。针对上述需求,建议按以下顺序选择方案:直付通等平台型产品 → 经确认支持的预授权方案 → 银行或持牌机构托管方案。不建议自行组合冻结、转账和平台余额来实现担保交易。

备注:内容仅供参考。