feat: 完善支付通道和收款监听链路

新增 ChannelNotifyPayloadInterface 等支付插件通知契约,规范 pay_no 定位和插件返回校验。

新增微信、支付宝、收钱吧、Postar 个人收款插件适配,支持余额识别与备注识别。

新增 receipt-watcher 后端进程、Redis 队列 job 和平台事件监听,覆盖收款流水通知、商户通知、退款派发、转账派发与清算完成。

补齐个人收款监听相关系统配置、仓储、服务费冻结明细、订单后台操作和通道测试能力。

重构支付单创建、回调、费用、风控、结算和通道统计链路,统一状态流转与幂等处理。
This commit is contained in:
技术老胡
2026-05-11 16:28:48 +08:00
parent 0e5de50337
commit fd1f53f2ee
136 changed files with 14416 additions and 3992 deletions

View File

@@ -44,7 +44,6 @@ class MerchantAccountLedger extends BaseModel
'frozen_after',
'idempotency_key',
'remark',
'ext_json',
];
/**
@@ -62,11 +61,9 @@ class MerchantAccountLedger extends BaseModel
'available_after' => 'integer',
'frozen_before' => 'integer',
'frozen_after' => 'integer',
'ext_json' => 'array',
'created_at' => 'datetime',
];
}

View File

@@ -6,7 +6,7 @@ use app\common\base\BaseModel;
/**
* 商户对外接口凭证模型。
* 保存商户 API 凭证、商户公钥、签名类型、启用状态和最近使用时间。
* 保存商户 API 凭证、商户公钥、启用状态和最近使用时间。
*/
class MerchantApiCredential extends BaseModel
{
@@ -24,7 +24,6 @@ class MerchantApiCredential extends BaseModel
*/
protected $fillable = [
'merchant_id',
'sign_type',
'api_key',
'merchant_public_key',
'status',
@@ -47,7 +46,6 @@ class MerchantApiCredential extends BaseModel
*/
protected $casts = [
'merchant_id' => 'integer',
'sign_type' => 'integer',
'status' => 'integer',
'last_used_at' => 'datetime',
'created_at' => 'datetime',

View File

@@ -0,0 +1,64 @@
<?php
namespace app\model\merchant;
use app\common\base\BaseModel;
/**
* 商户资金冻结明细模型。
*
* 一条记录代表一笔冻结占用,可关联支付单,也可作为后续人工指定金额冻结的载体。
*/
class MerchantFundFreeze extends BaseModel
{
/**
* 数据表名
*
* @var mixed
*/
protected $table = 'ma_merchant_fund_freeze';
/**
* 可批量赋值字段
*
* @var mixed
*/
protected $fillable = [
'freeze_no',
'merchant_id',
'biz_no',
'pay_no',
'trace_no',
'freeze_type',
'freeze_amount',
'remaining_amount',
'status',
'reason',
'admin_id',
'available_at',
'frozen_at',
'release_reason',
'released_by',
'released_at',
];
/**
* 字段类型转换配置
*
* @var mixed
*/
protected $casts = [
'merchant_id' => 'integer',
'freeze_type' => 'integer',
'freeze_amount' => 'integer',
'remaining_amount' => 'integer',
'status' => 'integer',
'admin_id' => 'integer',
'available_at' => 'datetime',
'frozen_at' => 'datetime',
'released_by' => 'integer',
'released_at' => 'datetime',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
}