PAYATHON 2026

支付宝无感停车车牌代扣开通及退款接口咨询

支付小周

结论

spi.alipay.user.agreement.sign.apply与车牌代扣签约有关,但它是 SPI 回调接口,通常由停车平台实现、支付宝调用,用于接收用户发起的签约申请。它不是由停车平台主动调用支付宝并直接开通车牌代扣的普通 OpenAPI。

典型的无感停车代扣流程会用到以下接口:

  • spi.alipay.user.agreement.sign.apply:接收签约申请,处理车牌与签约关系。
  • alipay.eco.mycar.parking.agreement.query:查询车牌代扣签约状态。
  • alipay.eco.mycar.parking.order.pay:执行停车订单代扣。
  • alipay.eco.mycar.parking.pay.query:查询无感支付结果。
  • alipay.eco.mycar.parking.pay.refund或alipay.eco.mycar.parking.order.refund:处理退款。

仅凭接口名称,无法判断两个退款接口是否可以互换。具体应以当前签约产品、支付宝开放平台控制台实际开放的接口和对应的产品文档为准。

车牌代扣如何开通

spi.alipay.user.agreement.sign.apply中的spi说明它属于服务提供接口。通常流程如下:

  1. 用户在支付宝端选择开通无感停车。
  2. 支付宝向停车平台配置的 SPI 地址发送签约申请。
  3. 停车平台校验停车场、车牌、用户和业务资格。
  4. 停车平台按照 SPI 协议返回处理结果。
  5. 后续通过alipay.eco.mycar.parking.agreement.query确认车牌是否已有有效的代扣关系。

停车平台不能自行调用一次spi.alipay.user.agreement.sign.apply,然后就认定车牌已经开通代扣。签约入口、授权页面、SPI 地址配置、验签规则和签约结果通知,都需要按照无感停车产品的接入方案完成。

业务系统需要保存车牌与签约关系,但不能只依赖本地状态。正式扣款前,建议再次确认签约关系仍然有效。

推荐的支付处理流程

停车订单满足扣款条件后,可以调用:

alipay.eco.mycar.parking.order.pay

接口返回成功时,也不能只根据”请求已受理”就认定资金已经扣款成功。如果返回结果不明确、请求超时或网络中断,应调用:

alipay.eco.mycar.parking.pay.query

查询最终支付状态。

状态处理可以参考以下方式:

PayResponse response = callParkingOrderPay(order);

if (response.isDefinitelySuccess()) {
    markOrderPaid(order);
} else if (response.isDefinitelyFailed()) {
    markOrderPayFailed(order);
} else {
    PayQueryResponse queryResponse = callParkingPayQuery(order);

    if (queryResponse.isPaid()) {
        markOrderPaid(order);
    } else if (queryResponse.isClosedOrFailed()) {
        markOrderPayFailed(order);
    } else {
        keepOrderProcessing(order);
    }
}

这段代码只用于说明状态处理思路。PayResponse、PayQueryResponse和其中的判断方法并不是支付宝 SDK 的固定类或方法,具体请求类、字段名称和状态值应以当前 SDK 及接口文档为准。

两个退款接口的区别

alipay.eco.mycar.parking.order.refund

从接口名称和用途来看,它更偏向停车代扣订单退款,一般需要基于停车业务订单和原代扣记录发起退款。

如果现有接入文档明确要求通过该接口,为alipay.eco.mycar.parking.order.pay产生的订单办理退款,就应继续使用这组配套接口,不要自行改用另一套退款接口。

alipay.eco.mycar.parking.pay.refund

该接口用于提交无感支付退款申请,针对的是已经完成的无感支付交易。退款请求被受理,不一定表示退款资金已经最终到账。是否还有异步处理、结果查询或通知,应查看对应的产品文档。

不能仅凭名称确定的内容

缺少具体产品文档、应用签约信息和接口参数说明时,无法严谨判断两个接口分别属于哪个版本,也不能断定其中一个已经废弃。支付宝可能会为不同的接入模式、产品包或历史方案保留名称相近的接口。

选择接口时,应核对以下内容:

  • 原支付使用的是哪套接口。
  • 退款接口要求传入哪种订单号或支付流水号。
  • 应用是否已经取得该接口的调用权限。
  • 接口对应的产品是否已经签约。
  • 退款会同步完成,还是只受理申请。
  • 是否需要通过查询接口或异步通知确认最终状态。

稳妥的做法是:支付和退款使用同一份产品文档中明确配套的接口组合。不要把order.refund和pay.refund当作彼此失败后的备用通道,也不要对同一笔交易同时调用这两个接口。

退款实现建议

系统应先锁定原支付记录,再根据这条记录所属的接入流程选择退款接口:

RefundResult refund(ParkingPayment payment, Money amount) {
    validateRefundable(payment, amount);

    String refundRequestNo = createUniqueRefundRequestNo();

    if (payment.usesOrderRefundFlow()) {
        return callApi(
            "alipay.eco.mycar.parking.order.refund",
            payment.getOriginalPaymentReference(),
            refundRequestNo,
            amount
        );
    }

    if (payment.usesPayRefundFlow()) {
        return callApi(
            "alipay.eco.mycar.parking.pay.refund",
            payment.getOriginalPaymentReference(),
            refundRequestNo,
            amount
        );
    }

    throw new IllegalStateException("原支付记录未配置对应的退款流程");
}

代码中的参数名仅用于说明业务逻辑,并非官方接口字段。实际调用时,应使用接口文档规定的原订单号、支付流水号、退款请求号和退款金额等字段。

注意事项

  • SPI 接口必须验证支付宝请求的签名,并按协议返回结果。
  • 车牌号应统一大小写、地区简称和新能源车牌格式,避免同一车辆产生多条签约关系。
  • 扣款、查询和退款都需要设计幂等机制。
  • 每次退款应使用稳定且唯一的退款请求号。请求超时后,先查询原处理结果,不要直接生成新的请求号重复退款。
  • 退款金额不能超过原交易的可退余额。是否支持部分退款,应以接口文档为准。
  • 系统需要保存商户停车订单号、支付宝侧交易标识、代扣请求号和退款请求号,不能只保存车牌号。
  • HTTP 请求成功只能说明通信正常。业务是否成功,还要结合接口返回码、业务状态和后续查询结果判断。
  • 接口权限、签约产品和网关环境必须一致。在沙箱或测试环境中验证通过,不代表生产应用已经获得相同权限。
  • 如果控制台只开放了其中一个退款接口,应先核对产品签约情况和接口清单,不要仅因名称相近就更换接口。

备注:内容仅供参考。