Appearance
概述
在 EBAOZU 系统中,支付宝小程序端的租赁业务覆盖了从售前下单、风控核身、商家履约发货,到租期管理、到期归还、质检定损及最终完结解冻的完整闭环生命周期。
本架构基于支付宝官方租赁行业交易组件(Commerce Rent)、芝麻信用免押风控、周期性代扣协议与**第三方电子合同存证(e签宝/爱签)**深度融合打造。本文档详细梳理该全流程业务链路的架构设计、数据表结构、接口契约、服务端核心业务逻辑及各阶段状态机流转。
租赁全生命周期架构与状态机
全生命周期端到端时序图
mermaid
sequenceDiagram
autonumber
actor User as 用户 (Uni-app)
participant Server as 后端服务 (StoreOrder)
participant Rent as 租赁服务 (CommerceRent)
participant Admin as 商家管理后台 (Admin)
participant Alipay as 支付宝开放平台 (组件/芝麻)
participant Third as 第三方 (顺丰/电子合同)
Note over User, Alipay: 阶段一:下单与创单签约
User->>Server: 1. 确认订单与实时算费 (confirm / computed)
Server->>Third: 顺丰时效与运费预估
Third-->>Server: 返回运费与时效
Server-->>User: 返回包含分期预览与运费的 orderKey
User->>Server: 2. 提交订单 (orderCreate)
Server->>Server: 校验实名与库存,事务落库多表
Server-->>User: 返回订单 ID (oid)
User->>Rent: 3. 支付宝创单 (rentCreate)
Rent->>Alipay: alipay.commerce.rent.order.create
Alipay-->>Rent: 返回 trade_component_order_id
User->>Rent: 4. 免押签约请求 (rentSign)
Rent->>Alipay: alipay.commerce.rent.order.sign
Alipay-->>User: 唤起芝麻免押评估与代扣签署
Alipay-->>Server: 网关异步通知签约成功 (SIGNED)
User->>Alipay: 5. 支付首期租金 (若 first_rent > 0)
Alipay-->>Server: 网关异步通知支付成功,核销第1期
Note over User, Admin: 阶段二:风控核身、审核与发货履约
User->>Third: 6. 人脸活体核身 & 签署电子合同
Third-->>Server: 回调保存合同 PDF 存证
Admin->>Rent: 7. 商家后台审核通过 (approve)
Rent->>Alipay: alipay.commerce.rent.order.approve
Admin->>Rent: 8. 物流打包发货 (send)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.send (MERCHANT_DELIVERY_SEND)
User->>Rent: 9. 确认收货 (receive)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.receive (MERCHANT_DELIVERY_RECEIVED)
Rent->>Alipay: 10. 异步队列回传合同 PDF (RENT_CONTRACT)
Note over User, Admin: 阶段三:租期代扣、归还质检与完结解冻
loop 租期内每期代扣
Server->>Rent: 到期执行代扣 (RENT_DEDUCT)
Rent->>Alipay: 周期性扣款并核销分期账单
end
User->>Server: 11. 申请租完归还 (returnGoods)
User->>Third: 12. 顺丰上门取件预约 (createSFOrder)
Third-->>Server: 生成寄回运单号
Server->>Alipay: 13. 同步寄回物流 (USER_DELIVERY_SEND)
Admin->>Server: 14. 商家收货检测 (confirmReturn)
Server->>Alipay: 同步归还收货 (USER_DELIVERY_RECEIVED)
alt 存在商品破损
Admin->>Server: 发起货损赔付 (damagePay)
User->>Server: 支付赔偿金后方可结案
end
Server->>Rent: 15. 订单完结 (endOrder / finish)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.finish (USER_RETURNED)
Server->>Alipay: 16. 全额解冻剩余预授权押金 (cancelFreeze)订单核心状态流转对照
| 阶段步骤 | 主订单状态 (eb_store_order.status) | 租赁履约状态 (eb_store_order_lease.lease_status) | 支付宝状态 (zhima_status / 交易组件状态) | 说明 |
|---|---|---|---|---|
| 1. 订单落库 | 0 (待发货/待处理) | 0 (待签约) | INIT | 数据库落库,生成 al 与 zl 订单 |
| 2. 免押签约 | 0 | 0 | SIGNED | 支付宝免押预授权冻结及代扣协议绑定成功 |
| 3. 首期支付 | 0 (paid=1) | 1 (待审核) | SIGNED | 第一期账单核销,进入商家审核队列 |
| 4. 审核通过 | 0 | 2 (待发货) | MERCHANT_APPROVED | 管理员审核资质通过 |
| 5. 商家发货 | 1 (待收货) | 2 (待发货/已寄出) | MERCHANT_DELIVERY_SEND | 同步顺丰/物流运单号及发货凭证材料 |
| 6. 用户收货 | 2 (已收货/租赁中) | 3 (租赁中) | RENTING | 用户确认收货,租期开始,触发合同回传 |
| 7. 申请归还 | 2 | 5 (待归还) | RETURN_DELIVERED | 用户发起归还并生成寄回预约单 |
| 8. 用户寄回 | 2 | 6 (归还中) | USER_DELIVERY_SEND | 用户上门揽收或自行寄出,同步寄回物流 |
| 9. 商家收货 | 6 (已完结) | 7 (已归还) | USER_DELIVERY_RECEIVED | 商家开箱质检确认商品无损 |
| 10. 履约完结 | 6 (已完结) | 4 (已完结) | FINISH / USER_RETURNED | 支付宝履约单完结,全额解冻剩余预授权押金 |
核心数据结构与数据表关系
主订单表(eb_store_order)
记录基础交易信息、支付流水及全局状态。
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 订单主键 ID |
order_id | varchar(32) | 系统订单号(支付宝小程序端以 al 开头) |
uid | int | 用户 ID |
trade_component_order_id | varchar(64) | 支付宝租赁行业交易组件单号 |
trade_no | varchar(64) | 支付宝交易流水号 |
is_lease | tinyint | 是否租赁订单:1=是,0=否 |
total_price | decimal(8,2) | 订单总金额(总租金 + 运费 + 增值服务 + 卡项费用) |
pay_price | decimal(8,2) | 用户下单应付金额(即首期应付金额) |
order_deposit | decimal(8,2) | 订单押金/买断价 |
freight_price | decimal(8,2) | 运费金额(顺丰快递费用) |
added_service_amount | decimal(8,2) | 增值服务总金额 |
card_amount | decimal(8,2) | 关联卡项权益费用 |
paid | tinyint | 支付状态:0=未支付,1=已支付 |
status | tinyint | 状态:0=待发货, 1=待收货, 2=已收货/租赁中, 6=已完结 |
shipping_type | tinyint | 配送方式:1=快递,2=自提,3=门店配送,5=同城闪送 |
delivery_id | varchar(64) | 商家发货快递单号 |
delivery_name | varchar(64) | 商家发货快递公司名称 |
back_id | int | 关联归还配送预约单 ID (eb_store_delivery_order.id) |
租赁订单扩展表(eb_store_order_lease)
记录租赁专属风控参数、免押状态、人脸认证、电子合同与履约进度。
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 租赁主键 ID |
oid | int | 关联 eb_store_order.id |
order_id | varchar(32) | 租赁单号(以 zl 开头) |
check_type | tinyint | 签约模式:1=芝麻免押(原), 2=蚂蚁链, 3=支付宝租赁行业交易/纯代扣 |
deposit | decimal(8,2) | 实际冻结/支付押金金额 |
custom_deposit | decimal(8,2) | 设定的免押额度/评估押金 |
first_rent | decimal(8,2) | 首期租金金额 |
buyout_money | decimal(8,2) | 到期买断价/买断总金额 |
day_price | decimal(8,2) | 日租金 |
lease_days | int | 租赁总天数 |
lease_num | int | 租赁总期数(含首期) |
lease_num_paid | int | 已支付租金期数 |
start_time / end_time | int | 租期起止时间戳 |
withhold_plan | tinyint | 代扣方案:1=第1期代扣,2=第2期开始代扣(长租首期不代扣) |
risk_permit | tinyint | 纯代扣模式标识:1=跳过预授权仅代扣 |
zhima_status | varchar(32) | 支付宝租赁状态(INIT / SIGNED / RENTING / RETURN_DELIVERED 等) |
face_auth_status | tinyint | 人脸核身状态:0=未认证, 1=扫描中, 2=认证成功, 3=认证失败 |
face_auth_detail | text | 人脸识别认证详情 JSON |
contract_detail | text | 电子合同详情 JSON(含本地 PDF 路径及支付宝 file_id 节点) |
return_delivery_type | tinyint | 归还方式:1=快递寄回,2=到店,3=其他 |
return_delivery_id | varchar(64) | 归还运单号 |
return_delivery_name | varchar(64) | 归还快递公司名称 |
rent_freight_sync | tinyint | 顺丰寄回运费同步状态:1=已同步 |
租赁分期账单表(eb_store_order_installment)
拆分每期的租金账单与周期性代扣计划。
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 分期账单 ID |
oid | int | 关联 eb_store_order.id |
order_id | varchar(32) | 关联主订单号 |
num | int | 账单期数(1, 2, 3...) |
amount | decimal(8,2) | 当期应付金额(租金 + 均摊增值费用) |
dead_line | int | 当期支付截止时间戳(计划代扣执行时间) |
status | tinyint | 账单状态:0=未支付,1=已支付,2=逾期,3=已取消 |
paid_time | int | 实际支付时间戳 |
is_deduct | tinyint | 代扣执行状态:0=未代扣,1=代扣成功,2=代扣失败 |
全生命周期流程详细拆解
阶段一至三:下单、创单与免押签约
mermaid
sequenceDiagram
autonumber
actor User as 用户 (Uni-app)
participant API as StoreOrder 控制器
participant Computed as StoreOrderComputed 服务
participant OrderCreate as StoreOrderCreate 服务
participant Rent as CommerceRent 服务
participant Alipay as 支付宝开放平台
User->>API: POST /api/order/confirm (cartId, addressId, shipping_type)
API->>API: 校验运费模板,提取商品规格与配件
API->>API: 初算分期列表并存入 Redis 缓存 user_order_uid_orderKey
API-->>User: 返回 orderKey 与分期预览数据
User->>API: POST /api/order/computed/:key (切换地址/优惠券/起租日)
API->>Computed: computedOrder()
Computed->>Computed: 请求顺丰 OpenAPI 预估运费及送达时间
Computed->>Computed: 精确计算优惠抵扣、总租金、首期租金与押金
Computed-->>User: 返回包含顺丰时效与金额明细
User->>API: POST /api/order/create/:key (payType=alipay, cno, tag)
API->>OrderCreate: createOrder() (加分布式锁 api_order_create_uid_key)
OrderCreate->>OrderCreate: 强制校验用户实名认证 (card_id, real_name)
OrderCreate->>OrderCreate: CacheService::popStock 预扣商品库存
OrderCreate->>OrderCreate: 开启数据库事务,写入主单/租赁表/分期表
OrderCreate->>OrderCreate: 核销优惠券,删除 Redis 购物车缓存并释放锁
OrderCreate-->>User: 返回订单创建结果 (oid, order_id, key)
User->>API: POST /api/rent/create/:oid (source_id, path)
API->>Rent: create()
Rent->>Alipay: alipay.commerce.rent.order.create (上报分期、成色、免押评估额)
Alipay-->>Rent: 返回 trade_component_order_id
Rent->>Rent: 回写 eb_store_order.trade_component_order_id
Rent-->>User: 返回组件单号
User->>API: POST /api/rent/sign/:oid
API->>Rent: sign()
Rent->>Alipay: alipay.commerce.rent.order.sign
Alipay-->>Rent: 返回签约字符串
Rent-->>User: 返回签约参数,Uni-app 拉起支付宝免押与代扣组件
User->>Alipay: 用户确认授权免押并签署代扣
Alipay-->>API: 网关异步通知 alipay.commerce.rent.order.changed (SIGNED)
API->>API: 更新 eb_store_order_lease.zhima_status = SIGNED订单确认 (order/confirm)
- 路由 & 控制器:
POST /api/order/confirm→ [StoreOrder::confirm](file:///www/wwwroot/ebaozu_v4/app/controller/api/v1/order/StoreOrder.php#L259) - Uni-app API:
orderConfirm(cartId, news, addressId, shippingType, store_id, couponId) - 核心处理:
- 校验默认租赁运费模板
RentShippingTemplatesServices; - 调用
StoreCartServices::getUserProductCartListV1获取有效商品列表,提取租金、买断价、押金、配件包kit_id等; - 初算增值服务费
addServicePrice与卡项费用cardAmount,生成分期账单预览; - 生成唯一 32 位 MD5 字符串
$orderKey,将订单数据写入 Redis:user_order_{uid}{orderKey}(TTL 30 分钟)。
- 校验默认租赁运费模板
实时算费 (order/computed/:key)
- 路由 & 控制器:
POST /api/order/computed/:key→ [StoreOrder::computedOrder](file:///www/wwwroot/ebaozu_v4/app/controller/api/v1/order/StoreOrder.php#L296) - Uni-app API:
postOrderComputed(key, data) - 核心处理:
- 读取 Redis 下单缓存;
- 若配送方式为快递(
shipping_type == 1),根据收发货地址调用顺丰 OpenAPISFExpress::getSFEexpressTime动态计算预估运费及送达时间; - 精确计算 SVIP 会员折扣、优惠券抵扣、积分抵扣,确定总租金、首期租金
first_rent及最终押金custom_deposit。
订单落库 (order/create/:key)
- 路由 & 控制器:
POST /api/order/create/:key→ [StoreOrder::create](file:///www/wwwroot/ebaozu_v4/app/controller/api/v1/order/StoreOrder.php#L449) - 服务层实现:[
StoreOrderCreateServices::createOrder](file:///www/wwwroot/ebaozu_v4/app/services/order/StoreOrderCreateServices.php#L150) - Uni-app API:
orderCreate(key, data) - 核心处理:
- 防并发锁:加 Redis 分布式锁
api_order_create_{uid}_{key}(10s 超时); - 强制实名认证:校验
userInfo.card_id与userInfo.real_name,未实名认证直接阻断; - 库存原子预扣:
CacheService::popStock预扣商品库存; - 数据库事务落库:写入主订单
eb_store_order、租赁扩展记录eb_store_order_lease(check_type=3)、租赁分期表eb_store_order_installment、商品快照eb_store_order_cart_info及卡项关系; - 清理 Redis 缓存
user_order_{uid}{key}并释放锁。
- 防并发锁:加 Redis 分布式锁
支付宝租赁创单 (v2/rent/create/:id)
- 路由 & 控制器:
POST /api/rent/create/:id→ [Common::rentCreate](file:///www/wwwroot/ebaozu_v4/app/controller/api/v2/alipay/Common.php#L80) - 服务层实现:[
CommerceRentServices::create](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L153) - Uni-app API:
tradeCreate({ oid }) - 核心处理:调用支付宝 OpenAPI
alipay.commerce.rent.order.create上报商品成色、分期计划、芝麻信用服务与退货地址;创单成功后回写eb_store_order.trade_component_order_id。
芝麻免押与代扣签约 (v2/rent/sign/:id)
- 路由 & 控制器:
POST /api/rent/sign/:id→ [Common::rentSign](file:///www/wwwroot/ebaozu_v4/app/controller/api/v2/alipay/Common.php#L122) - 服务层实现:[
CommerceRentServices::sign](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L629) - Uni-app API:
zhimaCreate({ oid }) - 核心处理:调用支付宝 OpenAPI
alipay.commerce.rent.order.sign返回签约凭证,小程序端拉起芝麻信用免押评估与代扣协议签署弹窗。用户确认后网关接收alipay.commerce.rent.order.changed(SIGNED)。
首期租金支付
- 若首期租金
first_rent > 0,拉起首期支付; - 支付宝推送支付成功通知
alipay.commerce.rent.order.pay.notify; - 服务端 [
CommerceRentServices::payNotify](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L1532) 核销第 1 期账单(status=1),标记主订单已支付(paid=1)。
阶段四至五:风控核身、审核发货与收货
mermaid
sequenceDiagram
autonumber
actor User as 用户 (Uni-app)
participant Admin as 商家管理后台
participant Server as 系统服务 / 异步队列
participant Rent as CommerceRent 服务
participant Alipay as 支付宝开放平台
participant Esign as 电子合同平台 (e签宝/爱签)
Note over User, Esign: 风控核身与合同签署
User->>Server: 上传人脸活体识别结果 (updateFaceAuth)
Server->>Server: 更新 face_auth_status = 2 (认证成功)
Server->>Esign: 填充租期/设备/分期数据,发起电子合同签署
User->>Esign: 在小程序端完成手写印章签署
Esign-->>Server: 回调通知,本地保存合同 PDF (dstPdfFile)
Note over Admin, Alipay: 商家审核与物流发货
Admin->>Rent: 商家后台审核通过 (approve)
Rent->>Alipay: alipay.commerce.rent.order.approve
Alipay-->>Rent: 返回成功,更新 lease_status = 2 (待发货)
Admin->>Rent: 打包发货,录入顺丰运单号 (send)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.send (MERCHANT_DELIVERY_SEND)
Alipay-->>Rent: 同步物流单号及补充凭证材料成功
Rent->>Server: 更新主订单 status = 1 (已发货待收货)
Note over User, Alipay: 用户收货与合同回传
User->>Server: 用户点击确认收货 (orderTake)
Server->>Rent: receive(oid, 1)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.receive (MERCHANT_DELIVERY_RECEIVED)
Alipay-->>Rent: 状态流转为 RENTING (租赁中)
Rent->>Server: 触发异步队列 OrderCreateAfterJob::uploadContractToAlipay
Server->>Alipay: openFileUploadForRent 上传本地合同 PDF 获取 file_id
Server->>Server: 回写 contract_detail.alipay_rent: file_id 和 result人脸活体核身
- 调用 [
StoreOrderLeaseServices::updateFaceAuth](file:///www/wwwroot/ebaozu_v4/app/services/order/StoreOrderLeaseServices.php#L148) 校验用户活体认证结果,并将认证详情存储至eb_store_order_lease.face_auth_detail,更新face_auth_status=2(认证成功)。
电子合同签署与存证
- 对接 e签宝(Esign) 或 爱签(Asign),自动填充订单信息、甲乙双方身份、设备 IMEI 及分期还款计划;
- 用户在前端小程序完成签名并生成正式 PDF 存证文件,本地路径记录至
contract_detail.dstPdfFile。
商家后台审核 (approve / close)
- 审核通过:调用 [
CommerceRentServices::approve($oid)](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L1126) 同步alipay.commerce.rent.order.approve,更新租赁状态为待发货(lease_status=2)。 - 审核拒绝:调用 [
CommerceRentServices::close($oid, $reasonCode)](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L495) 关闭支付宝订单并全额解冻预授权押金。
商家物流发货 (send)
- 服务层实现:[
CommerceRentServices::send($oid, 1)](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L1147); - 映射标准阿里物流编码(
TradeComponentServices::getDeliveryId),调用alipay.commerce.rent.order.fulfillment.send(MERCHANT_DELIVERY_SEND),同步物流单号及补充凭证材料(AdditionMediaServices); - 更新主订单状态为已发货(
status=1)。
用户确认收货与合同回传 (receive)
- 用户确认收货触发 [
CommerceRentServices::receive($oid, 1)](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L1206)(MERCHANT_DELIVERY_RECEIVED),订单进入租赁中状态(主订单status=2,租赁lease_status=3); - 自动回传合同 PDF:触发异步队列 [
OrderCreateAfterJob::uploadContractToAlipay](file:///www/wwwroot/ebaozu_v4/app/jobs/order/OrderCreateAfterJob.php#L438),上传已签合同 PDF 至支付宝文件平台并回传关联存证(RENT_CONTRACT)。
阶段六至七:租期代扣、归还质检与完结解冻
mermaid
sequenceDiagram
autonumber
actor User as 用户 (Uni-app)
participant Cron as 定时代扣任务
participant Admin as 商家管理后台
participant Server as 系统服务 (StoreOrder)
participant Rent as CommerceRent 服务
participant Alipay as 支付宝开放平台
participant SF as 顺丰速运 API
Note over Cron, Alipay: 租期周期性自动代扣
loop 每日扫描待扣账单
Cron->>Rent: pay(oid, num, 0, [], 'RENT_DEDUCT')
Rent->>Alipay: 发起代扣扣款 (07:00-23:00)
Alipay-->>Server: 网关通知 pay.notify,核销对应期数账单
end
Note over User, SF: 到期归还与顺丰预约
User->>Server: 结清账单,申请租完归还 (returnGoods)
Server->>Server: 更新 lease_status = 5 (待归还),生成预约单
User->>SF: 预约顺丰上门取件 (createSFOrder)
SF-->>Server: 揽收成功,回调落库并投递即时同步任务
Server->>Rent: send(oid, 2)
Rent->>Alipay: fulfillmentSend (USER_DELIVERY_SEND 同步寄回物流)
Server->>Server: 更新 lease_status = 6 (归还中)
Server->>Rent: paySync(oid, -2)
Rent->>Alipay: 同步 RETURN_FREIGHT 归还运费
Note over Admin, Alipay: 商家质检与完结解冻
Admin->>Server: 收到包裹,开箱检测确认无损 (confirmReturn)
Server->>Rent: receive(oid, 2) (USER_DELIVERY_RECEIVED)
Server->>Server: 回退商品库存,关联设备配件入库 (KitServices)
alt 发现设备损坏或配件缺失
Admin->>Server: 发起货损赔付单 (saveOrderDamage)
User->>Server: 支付赔偿金 (damagePay)
end
Server->>Rent: 完结订单 endOrder() -> finish(oid, USER_RETURNED)
Rent->>Alipay: alipay.commerce.rent.order.fulfillment.finish
Server->>Alipay: cancelFreezeOrder() 全额解冻剩余预授权押金
Alipay-->>Server: 押金解冻成功
Server->>Server: 更新主订单 status = 6 (已完结),lease_status = 4 (已完结)周期性租金代扣
- 队列每日扫描待扣分期账单,调用 [
CommerceRentServices::pay($oid, $num, 0, [], 'RENT_DEDUCT')](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L685) 发起代扣(代扣时间限每日 07:00-23:00),成功后核销账单。
申请租完归还与顺丰预约 (returnGoods / createSFOrder)
- 结清分期账单后,用户发起归还调用 [
StoreOrderServices::returnGoods](file:///www/wwwroot/ebaozu_v4/app/services/order/StoreOrderServices.php#L10772),生成寄回预约单(eb_store_delivery_order); - 用户选择顺丰上门取件,顺丰回调确认揽收后投递
RentReturnFreightSyncJob,异步按send($oid, 2)(USER_DELIVERY_SEND)→paySync($oid, -2)顺序同步支付宝;6小时定时任务继续扫描未完成记录作为兜底。
商家收货检测与定损 (confirmReturn)
- 商家收到寄回商品后开箱质检;
- 无损状态下在后台执行确认归还 [
StoreOrderServices::confirmReturn](file:///www/wwwroot/ebaozu_v4/app/services/order/StoreOrderServices.php#L8695),调用CommerceRentServices::receive($oid, 2)(USER_DELIVERY_RECEIVED),回退商品库存并执行配件设备入库(KitServices); - 若有损坏则创建货损赔付单(
StoreOrderDamageServices),处理完成后结案。
履约完结与全额解冻押金 (endOrder / finish)
- 服务层实现:[
StoreOrderServices::endOrder](file:///www/wwwroot/ebaozu_v4/app/services/order/StoreOrderServices.php#L8893); - 若存在未收取的账单,调用
CommerceRentServices::paySync进行账单同步关闭; - 调用 [
CommerceRentServices::finish($oid, $endType)](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CommerceRentServices.php#L1240)(alipay.commerce.rent.order.finish,传入USER_RETURNED)完结支付宝履约单; - 调用 [
CreditZhimaServices::cancelFreezeOrder](file:///www/wwwroot/ebaozu_v4/app/services/alipay/CreditZhimaServices.php) 全额解冻预授权押金,更新主订单status=6(已完结),租赁状态lease_status=4。
全生命周期接口速查表
| 阶段 | HTTP 方法 | 路由路径 | 服务端处理方法 | 对应 Uni-app / 后台操作 | 功能说明 |
|---|---|---|---|---|---|
| 下单 | POST | order/confirm | StoreOrder::confirm | orderConfirm() | 确认订单,预估分期并写入 Redis 缓存 |
| 下单 | POST | order/computed/:key | StoreOrder::computedOrder | postOrderComputed() | 动态计算顺丰时效、运费与优惠明细 |
| 下单 | POST | order/create/:key | StoreOrder::create | orderCreate() | 校验实名与库存,事务落库多表 |
| 创单 | POST | rent/create/:id | Common::rentCreate | tradeCreate() | 支付宝创建租赁行业交易组件订单 |
| 免押 | POST | rent/sign/:id | Common::rentSign | zhimaCreate() | 支付宝发起芝麻免押预授权与代扣签约 |
| 支付 | POST | order/pay | StoreOrder::pay | orderPay() | 支付首期租金 |
| 审核 | POST | adminapi/order/approve/:id | CommerceRentServices::approve | 后台审核通过按钮 | 商家审核通过,同步支付宝履约状态 |
| 发货 | POST | adminapi/order/delivery/:id | CommerceRentServices::send(1) | 后台发货提交 | 同步商家发货运单号与发货凭证材料 |
| 收货 | POST | order/take | CommerceRentServices::receive(1) | orderTake() | 用户确认收货,触发已签合同 PDF 回传 |
| 归还 | POST | order/return_goods/:id | StoreOrderServices::returnGoods | 移动端申请归还按钮 | 申请租完归还,生成寄回预约单 |
| 寄回 | POST | order/create_sf_order | StoreOrder::createSFOrder | 预约顺丰上门取件 | 顺丰预约揽件,同步寄回物流到支付宝 |
| 质检 | POST | adminapi/order/confirm_return/:id | StoreOrderServices::confirmReturn | 后台确认归还按钮 | 商家收货检测,同步归还收货状态 |
| 完结 | POST | adminapi/order/end_order/:id | StoreOrderServices::endOrder | 系统自动/手动完结 | 完结支付宝履约单,全额解冻预授权押金 |
关键设计与异常防护
幂等控制与分布式防并发
- 下单防重:Redis 锁
api_order_create_{uid}_{key}(10s 超时保护); - 组件创单防重入:若订单已存在
trade_component_order_id,再次调用创单直接返回已有单号,防止重复向支付宝发起创单; - 异步网关幂等:所有支付宝应用网关回调均基于
out_trade_no或trade_component_order_id做已处理状态校验。
合同回传机制与存量整改
- 确认收货常驻回传:收货成功后通过异步队列
OrderCreateAfterJob::uploadContractToAlipay将已签署的合同 PDF 上传并回传至支付宝(RENT_CONTRACT); - 模板合规整改回传:针对历史未完结订单,支持通过命令行工具
php think rent:rectify-contract批量整改并回传模板 PDF(RENT_CONTRACT_TEMPLATE)。
顺丰寄回运费同步限制
- 支付宝侧限制寄回运费最多同步 1 次,系统通过
eb_store_order_lease.rent_freight_sync标记位进行防重保护与存量自愈。
押金安全解冻兜底
- 订单进入终态前,系统在
StoreOrderServices::endOrder中严格检查rest_amount并调用CreditZhimaServices::cancelFreezeOrder进行全额解冻,杜绝押金未释放导致的用户客诉。