Appearance
概述
租赁行业交易是支付宝官方的租赁行业解决方案,是当前主推的租赁支付方式。本文档详细介绍租赁行业交易的架构、流程和开发细节。
架构设计
核心组件
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);处理逻辑:
- 解析消息类型
- 更新订单状态
- 触发后续业务
代码来源:app/services/alipay/CommerceRentServices.php:1429
支付消息通知处理
php
// 租赁订单支付消息通知处理
$rentServices->payNotify($notify);处理逻辑:
- 解析支付结果
- 更新支付记录
- 更新分期状态
- 触发后续业务
代码来源:app/services/alipay/CommerceRentServices.php:1532
售后消息通知处理
php
// 租赁售后订单消息通知处理
$rentServices->aftersaleNotify($notify);处理逻辑:
- 解析售后结果
- 更新售后状态
- 触发后续业务
代码来源: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.php(openFileUploadForRent/rentAdditionalUpload)
合同模板违规整改回传(RENT_CONTRACT_TEMPLATE)
2026-08 支付宝通知线上合同模板不合规。更换正式服模板 public/uploads/contract/esign_sdk3_tempalte.pdf 后,需对存量已回传过合同的未完结租赁订单重新回传整改后的模板。与常驻回传的差异:
| 对比项 | 常驻回传 | 整改回传 |
|---|---|---|
| 触发方式 | 确认收货(队列,每单一次) | 一次性命令批量执行 |
| 回传文件 | 每单已签署合同 PDF | 新模板 PDF 原件(上传 1 次,全单复用 file_id) |
| media type | RENT_CONTRACT | RENT_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: 检查以下条件:
- 订单信息是否完整
- 商品信息是否正确
- 用户信息是否完整
- 支付宝接口是否正常
Q: 签约失败怎么办?
A: 检查以下条件:
- 用户是否完成免押
- 订单状态是否正确
- 签约参数是否完整
- 支付宝接口是否正常
Q: 代扣失败怎么办?
A: 检以下条件:
- 代扣时间是否在 7:00-22:00 之间
- 用户支付宝余额是否充足
- 代扣协议是否已签署
- 支付宝接口是否正常