mirror of
https://gitee.com/technical-laohu/mpay_v2_webman.git
synced 2026-05-17 06:20:25 +08:00
feat: 完善支付通道和收款监听链路
新增 ChannelNotifyPayloadInterface 等支付插件通知契约,规范 pay_no 定位和插件返回校验。 新增微信、支付宝、收钱吧、Postar 个人收款插件适配,支持余额识别与备注识别。 新增 receipt-watcher 后端进程、Redis 队列 job 和平台事件监听,覆盖收款流水通知、商户通知、退款派发、转账派发与清算完成。 补齐个人收款监听相关系统配置、仓储、服务费冻结明细、订单后台操作和通道测试能力。 重构支付单创建、回调、费用、风控、结算和通道统计链路,统一状态流转与幂等处理。
This commit is contained in:
@@ -27,6 +27,7 @@ class CashierValidator extends Validator
|
||||
'context' => ['biz_no'],
|
||||
'confirm' => ['biz_no', 'type'],
|
||||
'pay_order' => ['pay_no'],
|
||||
'pay_order_status' => ['pay_no'],
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -65,4 +66,16 @@ class CashierValidator extends Validator
|
||||
'pay_no' => 'required|string|max:32',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付状态查询场景。
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function scenePayOrderStatus(): static
|
||||
{
|
||||
return $this->appendRules([
|
||||
'pay_no' => 'required|string|max:32',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ class EpayV1Validator extends Validator
|
||||
'notify_url' => 'nullable|string|max:255',
|
||||
'return_url' => 'nullable|string|max:255',
|
||||
'name' => 'nullable|string|max:255',
|
||||
'money' => 'nullable|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'nullable|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'param' => 'nullable',
|
||||
'clientip' => 'nullable|ip',
|
||||
'device' => 'nullable|string|in:pc,mobile,qq,wechat,alipay,jump',
|
||||
@@ -73,7 +73,7 @@ class EpayV1Validator extends Validator
|
||||
'notify_url' => 'required|string|max:255',
|
||||
'return_url' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'sign_type' => 'required|string|in:MD5',
|
||||
'sign' => 'required|string|max:255',
|
||||
]);
|
||||
@@ -92,7 +92,7 @@ class EpayV1Validator extends Validator
|
||||
'notify_url' => 'required|string|max:255',
|
||||
'return_url' => 'nullable|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'clientip' => 'required|ip',
|
||||
'sign_type' => 'required|string|in:MD5',
|
||||
'sign' => 'required|string|max:255',
|
||||
@@ -160,7 +160,7 @@ class EpayV1Validator extends Validator
|
||||
{
|
||||
return $this->appendRules([
|
||||
'key' => 'required|string|max:128',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'trade_no' => 'nullable|string|max:64|required_without:out_trade_no',
|
||||
'out_trade_no' => 'nullable|string|max:64|required_without:trade_no',
|
||||
]);
|
||||
|
||||
@@ -14,8 +14,7 @@ class EpayV2Validator extends Validator
|
||||
protected array $rules = [
|
||||
'pid' => 'required|integer|min:1',
|
||||
'timestamp' => 'required|integer|min:1',
|
||||
// 兼容旧版 SDK 里使用的 `RSA` 简写,同时内部统一按 SHA256WithRSA 验签。
|
||||
'sign_type' => 'required|string|in:SHA256WithRSA,RSA',
|
||||
'sign_type' => 'required|string|in:RSA',
|
||||
// RSA 签名是 Base64 文本,长度会明显超过 MD5,不能沿用 255 的短限制。
|
||||
'sign' => 'required|string|max:2048',
|
||||
'type' => 'nullable|string|max:32',
|
||||
@@ -25,7 +24,7 @@ class EpayV2Validator extends Validator
|
||||
'notify_url' => 'nullable|string|max:255',
|
||||
'return_url' => 'nullable|string|max:255',
|
||||
'name' => 'nullable|string|max:255',
|
||||
'money' => 'nullable|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'nullable|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'param' => 'nullable',
|
||||
'auth_code' => 'nullable|string|max:128',
|
||||
'sub_openid' => 'nullable|string|max:128',
|
||||
@@ -104,8 +103,8 @@ class EpayV2Validator extends Validator
|
||||
'notify_url' => 'required|string|max:255',
|
||||
'return_url' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'sign_type' => 'required|string|in:SHA256WithRSA,RSA',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'sign_type' => 'required|string|in:RSA',
|
||||
'sign' => 'required|string|max:2048',
|
||||
]);
|
||||
}
|
||||
@@ -124,9 +123,9 @@ class EpayV2Validator extends Validator
|
||||
'notify_url' => 'required|string|max:255',
|
||||
'return_url' => 'nullable|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'device' => 'nullable|string|in:pc,mobile,qq,wechat,alipay',
|
||||
'sign_type' => 'required|string|in:SHA256WithRSA,RSA',
|
||||
'sign_type' => 'required|string|in:RSA',
|
||||
'sign' => 'required|string|max:2048',
|
||||
]);
|
||||
}
|
||||
@@ -139,11 +138,11 @@ class EpayV2Validator extends Validator
|
||||
public function sceneRefund(): static
|
||||
{
|
||||
return $this->appendRules([
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'trade_no' => 'nullable|string|max:64|required_without:out_trade_no',
|
||||
'out_trade_no' => 'nullable|string|max:64|required_without:trade_no',
|
||||
'out_refund_no' => 'nullable|string|max:64',
|
||||
'sign_type' => 'required|string|in:SHA256WithRSA,RSA',
|
||||
'sign_type' => 'required|string|in:RSA',
|
||||
'sign' => 'required|string|max:2048',
|
||||
]);
|
||||
}
|
||||
@@ -208,8 +207,8 @@ class EpayV2Validator extends Validator
|
||||
'type' => 'required|string|in:alipay,wxpay,qqpay,bank',
|
||||
'account' => 'required|string|max:100',
|
||||
'name' => 'required|string|max:100',
|
||||
'money' => 'required|regex:/^\d+(?:\.\d{1,2})?$/',
|
||||
'sign_type' => 'required|string|in:SHA256WithRSA,RSA',
|
||||
'money' => 'required|regex:/^(?=.*[1-9])\d+(?:\.\d{1,2})?$/',
|
||||
'sign_type' => 'required|string|in:RSA',
|
||||
'sign' => 'required|string|max:2048',
|
||||
]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user