Skip to content

概述

租赁行业交易是支付宝官方的租赁行业解决方案,是当前主推的租赁支付方式。本文档详细介绍租赁行业交易的架构、流程和开发细节。

架构设计

核心组件

CommerceRentServices (租赁行业交易服务)
├── AlipayZhimaTraits (公共Trait)

├── create()                   # 租赁订单创建
├── query()                    # 订单查询
├── close()                    # 订单取消
├── modify()                   # 订单修改
├── sign()                     # 租赁订单签约
├── pay()                      # 订单支付
├── payRefund()                # 支付退款
├── payCancel()                # 取消支付
├── paySync()                  # 同步订单支付结果
├── approve()                  # 履约订单商家审核通过
├── send()                     # 履约订单物流发货
├── receive()                  # 履约订单确认收货
├── finish()                   # 履约订单完成
├── aftersaleCreate()          # 售后创建
├── aftersaleConfirm()         # 售后处理
├── reletAppend()              # 短租续租追加
├── cancelReletAppend()        # 短租续租取消
├── orderNotify()              # 订单变更消息处理
├── payNotify()                # 支付消息通知处理
└── aftersaleNotify()          # 售后消息通知处理

代码来源:app/services/alipay/CommerceRentServices.php

调用流程

用户下单

租赁订单创建 (create)

租赁订单签约 (sign)

订单支付 (pay)

履约订单商家审核通过 (approve)

履约订单物流发货 (send)

履约订单确认收货 (receive)

续租/买断/归还

履约订单完成 (finish)

开发指南

租赁订单创建

php
// 租赁订单创建(公域交易组件下单)
$rentServices = app()->make(CommerceRentServices::class);
$result = $rentServices->create($orderId);

参数说明:

  • $orderId — 订单ID

返回值:

  • 成功:返回订单创建结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:151

租赁订单签约

php
// 租赁订单签约(预授权+代扣)
$result = $rentServices->sign($orderId);

参数说明:

  • $orderId — 订单ID

返回值:

  • 成功:返回签约结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:603

订单支付

php
// 订单支付(租金/押金/赔付金/违约金/寄还运费)
$result = $rentServices->pay($orderId, $num, $payType, $amount);

参数说明:

  • $orderId — 订单ID
  • $num — 分期期数
  • $payType — 支付类型(租金/押金/赔付金/违约金/寄还运费)
  • $amount — 支付金额

返回值:

  • 成功:返回支付结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:658

订单查询

php
// 订单查询(含账单/物流/在途支付信息)
$result = $rentServices->query($orderId);

参数说明:

  • $orderId — 订单ID

返回值:

  • 成功:返回订单信息
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:461

订单取消

php
// 订单取消(审核不通过等)
$result = $rentServices->close($orderId, $reasonCode);

参数说明:

  • $orderId — 订单ID
  • $reasonCode — 关单原因代码

返回值:

  • 成功:返回取消结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:495

订单修改

php
// 订单修改(租期/地址/退货地址/发货信息)
$result = $rentServices->modify($orderId, $params);

参数说明:

  • $orderId — 订单ID
  • $params — 修改参数

返回值:

  • 成功:返回修改结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:516

履约订单商家审核通过

php
// 履约订单商家审核通过
$result = $rentServices->approve($orderId);

参数说明:

  • $orderId — 订单ID

返回值:

  • 成功:返回审核结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1075

履约订单物流发货

php
// 履约订单物流发货
$result = $rentServices->send($orderId, $deliveryInfo);

参数说明:

  • $orderId — 订单ID
  • $deliveryInfo — 物流信息

返回值:

  • 成功:返回发货结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1096

履约订单确认收货

php
// 履约订单确认收货
$result = $rentServices->receive($orderId);

参数说明:

  • $orderId — 订单ID

返回值:

  • 成功:返回确认结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1155

履约订单完成

php
// 履约订单完成(归还/提前归还/其他)
$result = $rentServices->finish($orderId, $finishType);

参数说明:

  • $orderId — 订单ID
  • $finishType — 完成类型(归还/提前归还/其他)

返回值:

  • 成功:返回完成结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1182

售后创建

php
// 履约订单售后创建(取消/赔付)
$result = $rentServices->aftersaleCreate($orderId, $type, $params);

参数说明:

  • $orderId — 订单ID
  • $type — 售后类型(取消/赔付)
  • $params — 售后参数

返回值:

  • 成功:返回售后创建结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1213

售后处理

php
// 租赁订单售后处理(同意/拒绝)
$result = $rentServices->aftersaleConfirm($orderId, $type, $opType, $record);

参数说明:

  • $orderId — 订单ID
  • $type — 售后类型
  • $opType — 操作类型(同意/拒绝)
  • $record — 售后记录

返回值:

  • 成功:返回处理结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1309

短租续租追加

php
// 短租续租追加租期计划
$result = $rentServices->reletAppend($orderId, $reletTimes);

参数说明:

  • $orderId — 订单ID
  • $reletTimes — 续租次数

返回值:

  • 成功:返回续租结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:1360

支付退款

php
// 支付退款
$result = $rentServices->payRefund($orderId, $refundAmount, $outRequestNo);

参数说明:

  • $orderId — 订单ID
  • $refundAmount — 退款金额
  • $outRequestNo — 退款请求号

返回值:

  • 成功:返回退款结果
  • 失败:抛出异常

代码来源:app/services/alipay/CommerceRentServices.php:911

回调处理

订单变更消息处理

php
// 租赁订单变更消息处理(签约/状态变更)
$rentServices->orderNotify($notify);

处理逻辑:

  1. 解析消息类型
  2. 更新订单状态
  3. 触发后续业务

代码来源:app/services/alipay/CommerceRentServices.php:1429

支付消息通知处理

php
// 租赁订单支付消息通知处理
$rentServices->payNotify($notify);

处理逻辑:

  1. 解析支付结果
  2. 更新支付记录
  3. 更新分期状态
  4. 触发后续业务

代码来源:app/services/alipay/CommerceRentServices.php:1532

售后消息通知处理

php
// 租赁售后订单消息通知处理
$rentServices->aftersaleNotify($notify);

处理逻辑:

  1. 解析售后结果
  2. 更新售后状态
  3. 触发后续业务

代码来源:app/services/alipay/CommerceRentServices.php:1670

合同回传

确认收货后回传已签合同(RENT_CONTRACT)

履约订单确认收货后,系统通过队列异步将该单已签署的合同 PDF 上传并回传至支付宝:

receive() 确认收货

OrderCreateAfterJob::uploadContractToAlipay(队列)

openFileUploadForRent(已签署合同PDF) → file_id

rentAdditionalUpload(trade_component_order_id, [{type: RENT_CONTRACT, value: file_id}])

回写 eb_store_order_lease.contract_detail.alipay_rent = {file_id, result}

代码来源:

  • app/services/alipay/CommerceRentServices.php:1208(确认收货时触发回传)
  • app/jobs/order/OrderCreateAfterJob.php:438(队列执行回传)
  • app/services/alipay/AlipayServices.phpopenFileUploadForRent / rentAdditionalUpload

合同模板违规整改回传(RENT_CONTRACT_TEMPLATE)

2026-08 支付宝通知线上合同模板不合规。更换正式服模板 public/uploads/contract/esign_sdk3_tempalte.pdf 后,需对存量已回传过合同的未完结租赁订单重新回传整改后的模板。与常驻回传的差异:

对比项常驻回传整改回传
触发方式确认收货(队列,每单一次)一次性命令批量执行
回传文件每单已签署合同 PDF新模板 PDF 原件(上传 1 次,全单复用 file_id)
media typeRENT_CONTRACTRENT_CONTRACT_TEMPLATE
附加参数item 内 origin_contract_file_id(该单首次回传获得的 file_id)
回写节点alipay_rent.{file_id, result}追加 alipay_rent.rectify = {file_id, origin_file_id, result, time},保留原 file_id

整改命令:

bash
php think rent:rectify-contract              # 全量整改(code=10000 才回写 rectify 节点,失败可重跑补传)
php think rent:rectify-contract --dry-run    # 仅统计(待整改/已整改/人工核查),不调接口不写库
php think rent:rectify-contract --only=<oid> # 仅处理指定订单(正式环境试单)
php think rent:rectify-contract --sleep=<ms> # 单间隔限速,默认 200ms

筛选口径:check_type=3 + 主订单 status != 6 + trade_component_order_id 非空 + contract_detail.alipay_rent.file_id 非空 + 无 rectify 节点(据此实现可重入)。

执行记录(2026-08-11):整改成功 399 单;1 单(待发货)被支付宝 ORDER_STATUS_ERROR 拒绝,订单推进后重跑补传即可;另有 21 单"已收货但从未成功回传"清单交人工核查。

代码来源:app/command/RentRectifyContract.php

关单原因

系统支持以下关单原因:

原因代码说明操作方
3103用户租赁计划有变管理员
3104用户订单信息错误管理员
3105用户测试或误操作管理员
3106用户重复下单管理员
3107用户不接电话管理员
3108租金扣款失败管理员
3109用户不愿意预付租金管理员
3110用户不愿意付押金管理员
3111用户对价格不认可管理员
3132用户担心非正品管理员
3133用户担心商品损坏管理员
3134用户不要监管机管理员
3135收货地区不支持发货管理员
3136已购买同款商品管理员
3137用户电话空号/关机管理员
3112用户提供虚假信息管理员
3113用户不配合补充审核资料管理员
3114用户资质问题管理员
3115智安盾高风险用户管理员
3116发货时间来不及管理员
3117商品缺货管理员

代码来源:app/services/alipay/CommerceRentServices.php:54-77

常见问题

Q: 租赁订单创建失败怎么办?

A: 检查以下条件:

  1. 订单信息是否完整
  2. 商品信息是否正确
  3. 用户信息是否完整
  4. 支付宝接口是否正常

Q: 签约失败怎么办?

A: 检查以下条件:

  1. 用户是否完成免押
  2. 订单状态是否正确
  3. 签约参数是否完整
  4. 支付宝接口是否正常

Q: 代扣失败怎么办?

A: 检以下条件:

  1. 代扣时间是否在 7:00-22:00 之间
  2. 用户支付宝余额是否充足
  3. 代扣协议是否已签署
  4. 支付宝接口是否正常

承信租多门店租赁商城系统官方文档