refactor(pay): 统一流水号,移除订单/流水/提现三类号码前缀
订单号、资金流水号、提现单号此前各自带前缀配置,同一笔业务在不同界面会
呈现多个号码口径,对账与客诉排查都要先做一次前缀换算。现收敛为单一流水号
分配器,不再按业务类型区分号码形态。
- 删除 payment_order_prefix / payment_flow_prefix /
payment_withdrawal_prefix 三项配置项及其生成、校验链路
- BusinessNumber::allocate() 成为唯一入口,输出 {YmdHis}{6 位随机},
共 20 位无前缀,满足 VARCHAR(32) 与网关 out_trade_no ≤ 32 的限制
- 订单、资金流水、提现、卡密渠道交易号四处生成点全部改走该分配器
- 后台支付中心表头「订单号 / 提现单号」统一为「流水号」
- 前台用户中心与订单卡片文案同步统一;前台订单详情合并为单行流水号,
账本流水号不再下发到前台,避免同一单据出现两个对外号码
- 同步更新 financial-flow / pay-card / card-pass-order-numbers 契约测试
与 BusinessNumberTest 断言
按用户要求不做双路逻辑与数据迁移,直接替换为统一方案,历史行不做转换。
验证:node --test tests/**/*.test.cjs 362/364 通过,新增 37 项契约;失败的
2 项在改动前的干净 HEAD 基线上同样失败(基线 327 项 / 失败 2 项),分别命中
遗留的 fa fa- 标记与 FA 版本号断言,与本次改动无关。phpunit 44 项 / 103
断言全部通过;php -l 全部改动的 PHP 文件通过。
This commit is contained in:
@@ -4,16 +4,24 @@ use AKSRT\Finance\BusinessNumber;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class BusinessNumberTest extends TestCase {
|
||||
public function test_prefix_is_uppercased_filtered_and_limited(): void {
|
||||
self::assertSame('AK', BusinessNumber::normalize_prefix('', 'AK'));
|
||||
self::assertSame('TX_TEST-9', BusinessNumber::normalize_prefix(' tx_测test-9 ', 'TX'));
|
||||
self::assertSame('ABCDEFGHIJKL', BusinessNumber::normalize_prefix('abcdefghijklmnop', 'AK'));
|
||||
self::assertSame('TX', BusinessNumber::normalize_prefix('中文', 'TX'));
|
||||
public function test_allocate_uses_site_time_and_six_digit_random_suffix(): void {
|
||||
$time = new DateTimeImmutable('2026-08-25 13:14:15', new DateTimeZone('Asia/Shanghai'));
|
||||
self::assertSame('20260825131415000007', BusinessNumber::allocate($time, 7));
|
||||
self::assertSame('20260825131415999999', BusinessNumber::allocate($time, 999999));
|
||||
}
|
||||
|
||||
public function test_candidate_uses_supplied_site_time_and_six_digit_random_suffix(): void {
|
||||
public function test_allocate_is_prefix_free_and_within_gateway_limit(): void {
|
||||
$time = new DateTimeImmutable('2026-08-25 13:14:15', new DateTimeZone('Asia/Shanghai'));
|
||||
self::assertSame('AK20260825131415000007', BusinessNumber::candidate('ak', $time, 7));
|
||||
self::assertMatchesRegularExpression('/^TX\d{14}\d{6}$/', BusinessNumber::candidate('TX', $time, 999999));
|
||||
$number = BusinessNumber::allocate($time, 0);
|
||||
self::assertSame('20260825131415000000', $number);
|
||||
// 订单号 / 流水号 / 提现单号共用同一长度,须同时满足 VARCHAR(32) 与网关 out_trade_no ≤32。
|
||||
self::assertSame(20, strlen($number));
|
||||
self::assertLessThanOrEqual(32, strlen($number));
|
||||
}
|
||||
|
||||
public function test_allocate_clamps_out_of_range_random_suffix(): void {
|
||||
$time = new DateTimeImmutable('2026-01-01 00:00:00', new DateTimeZone('Asia/Shanghai'));
|
||||
self::assertSame('20260101000000999999', BusinessNumber::allocate($time, 1000000));
|
||||
self::assertSame('20260101000000000000', BusinessNumber::allocate($time, -5));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user