feat: 真实支付配置 + 修复 yansongda 配置结构 bug + 后台 AI 实时进度

- 支付设置:支付宝/微信各自支持正式/沙箱网关环境,凭据字段补全(支付宝公钥、微信商户证书私钥/平台证书 PEM),密钥可直接粘贴 PEM 文本(yansongda 支持字符串)
- 修复关键 bug:yansongda 配置结构错误(app_id 等在 default 租户外,真实网关拿不到配置),现按 alipay.default / wechat.default 正确传入,并用 _force 保证每次调用生效
- 后台 AI 设置页新增 WebSocket 实时审核进度(ai.moderation.* 事件),未连接时降级提示
- 部署文档:明确 queue:work 与 workerman:serve 等价、dev:watch 用法
- 测试:支付宝/微信配置结构回归 + AI 设置页加载
This commit is contained in:
ak
2026-08-12 03:31:08 +08:00
parent 88bba6eba3
commit 22df17f02a
6 changed files with 203 additions and 23 deletions
+1
View File
@@ -54,6 +54,7 @@ class AdminPagesTest extends TestCase
{
$this->actingAs($this->admin)->get('/admin/plugins')->assertOk();
$this->actingAs($this->admin)->get('/admin/payments')->assertOk();
$this->actingAs($this->admin)->get('/admin/ai-settings')->assertOk();
}
public function test_guest_is_redirected_to_login(): void
@@ -0,0 +1,54 @@
<?php
declare(strict_types=1);
namespace Tests\Feature;
use App\Models\Setting;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Plugins\Neatstudio\Payment\Services\PaymentManager;
use Tests\TestCase;
class PaymentGatewayConfigTest extends TestCase
{
use RefreshDatabase;
public function test_alipay_config_lands_in_default_tenant(): void
{
Setting::set('pay_alipay_mode', 'sandbox');
Setting::set('pay_alipay_app_id', '2021000000000000');
Setting::set('pay_alipay_app_secret', "-----BEGIN PRIVATE KEY-----\nAAAA\n-----END PRIVATE KEY-----");
Setting::set('pay_alipay_public_key', "-----BEGIN PUBLIC KEY-----\nBBBB\n-----END PUBLIC KEY-----");
app(PaymentManager::class)->alipay();
$config = \Yansongda\Pay\get_provider_config('alipay');
$this->assertSame(\Yansongda\Pay\Pay::MODE_SANDBOX, $config['mode']);
$this->assertSame('2021000000000000', $config['app_id']);
$this->assertStringContainsString('PRIVATE KEY', $config['app_secret_cert']);
$this->assertStringContainsString('PUBLIC KEY', $config['alipay_public_cert_path']);
$this->assertStringContainsString('pay/notify', $config['notify_url']);
}
public function test_wechat_config_lands_in_default_tenant(): void
{
Setting::set('pay_wechat_mode', 'normal');
Setting::set('pay_wechat_mch_id', '1900000001');
Setting::set('pay_wechat_mch_secret', 'api-v3-key');
Setting::set('pay_wechat_mch_cert', "-----BEGIN PRIVATE KEY-----\nCCCC\n-----END PRIVATE KEY-----");
Setting::set('pay_wechat_platform_cert', "-----BEGIN PUBLIC KEY-----\nDDDD\n-----END PUBLIC KEY-----");
Setting::set('pay_wechat_app_id', 'wx123456');
app(PaymentManager::class)->wechat();
$config = \Yansongda\Pay\get_provider_config('wechat');
$this->assertSame(\Yansongda\Pay\Pay::MODE_NORMAL, $config['mode']);
$this->assertSame('1900000001', $config['mch_id']);
$this->assertSame('api-v3-key', $config['mch_secret_key']);
$this->assertStringContainsString('PRIVATE KEY', $config['mch_secret_cert']);
$this->assertStringContainsString('PUBLIC KEY', $config['mch_public_cert_path']);
$this->assertSame('wx123456', $config['mp_app_id']);
}
}