From b4783ae528b3d505da0d0eaad220176a02a3a6a5 Mon Sep 17 00:00:00 2001 From: limeng <1131177064@qq.com> Date: Fri, 13 Nov 2026 09:57:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BC=BA=E5=B0=91=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E8=BA=AB=E4=BB=BD=E6=97=B6=E6=8B=92=E7=BB=9D=E6=8C=89=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=B8=BB=E4=BD=93=E6=8E=A8=E9=80=81=E6=98=93=E7=AD=BE?= =?UTF-8?q?=E5=AE=9D=20(#1145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/Esign/EsignConfiguration.php | 4 ++-- docs/esign-agreement-integration.md | 2 +- .../CourierAgreementSignatureWorkflowTest.php | 13 +++++++++++-- .../Business/CourierQuoteSignatureWorkflowTest.php | 12 +++++++++++- tests/Unit/EsignConfigurationTest.php | 11 +++++++++-- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/Services/Esign/EsignConfiguration.php b/app/Services/Esign/EsignConfiguration.php index 93d6f376..c2ee8b13 100644 --- a/app/Services/Esign/EsignConfiguration.php +++ b/app/Services/Esign/EsignConfiguration.php @@ -123,11 +123,11 @@ final class EsignConfiguration if (! is_array($accounts)) { throw new RuntimeException('E 签宝发起身份配置格式无效,请联系管理员。'); } - if ($accounts === [] && $this->defaultInitiator === '') { + $name = trim((string) $organizationName) ?: $this->defaultInitiator; + if ($accounts === [] && $name === '') { return null; } - $name = trim((string) $organizationName) ?: $this->defaultInitiator; $account = $accounts[$name] ?? null; if (! is_array($account) || ! is_string($account['org_id'] ?? null) || ! is_string($account['psn_id'] ?? null) || trim($account['org_id']) === '' || trim($account['psn_id']) === '') { diff --git a/docs/esign-agreement-integration.md b/docs/esign-agreement-integration.md index 5d6484a7..261ba501 100644 --- a/docs/esign-agreement-integration.md +++ b/docs/esign-agreement-integration.md @@ -44,7 +44,7 @@ ESIGN_INITIATOR_ACCOUNTS='{"示例发起企业":{"org_id":"企业实名账号ID" 协议和报价确认单按页面选择的 `signing_subject` 查找对应身份;旧报价推送入口未选择主体时使用配置中的默认企业。每个企业必须单独核对认证、有效的 `org_initiate_sign` 授权及经办人的 `psn_initiate_sign` 授权,不能使用对方快递经办人的账号。真实企业和经办人 ID 只保存在私有配置中。 -启用对应关系后,缺少所选企业或经办人配置时会在上传前拒绝推送,不再静默使用应用所属企业。未启用时保持应用自身发起的接入方式。配置只用于新建流程,不切换 App ID/AppSecret,历史流程的查询、回调和归档继续使用原应用。 +只要页面选择了签署主体,缺少该企业或经办人配置时就会在上传前拒绝推送;即使全部发起身份配置为空,也不能静默使用应用所属企业。仅未选择主体、且未配置默认发起企业的旧接入方式继续由应用自身发起。配置只用于新建流程,不切换 App ID/AppSecret,历史流程的查询、回调和归档继续使用原应用。 e签宝要求高级版通过“关联企业”开通,生态伙伴版通过企业和经办人授权;套餐能力以e签宝实际开通结果为准。参考[指定合同发起方](https://open.esign.cn/doc/opendoc/pdf-sign3/su5g42)。 diff --git a/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php b/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php index 1140566c..bc222eba 100644 --- a/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php +++ b/tests/Feature/Business/CourierAgreementSignatureWorkflowTest.php @@ -85,9 +85,13 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase $this->assertSame(1, CourierAgreementSignature::query()->count()); } - public function test_missing_selected_initiator_fails_before_upload_without_unknown_status(): void + /** @dataProvider missingInitiatorConfigurations */ + public function test_missing_selected_initiator_fails_before_upload_without_unknown_status(string $defaultInitiator): void { - config(['services.esign.initiator_accounts' => '{}']); + config([ + 'services.esign.initiator_accounts' => '{}', + 'services.esign.default_initiator' => $defaultInitiator, + ]); Http::fake(); $this->withExceptionHandling()->loginAs() @@ -102,6 +106,11 @@ class CourierAgreementSignatureWorkflowTest extends FeatureTestCase $this->assertStringContainsString('所选签署主体未配置完整', $signature->last_error); } + public static function missingInitiatorConfigurations(): array + { + return ['default configured' => ['默认企业'], 'all settings absent' => ['']]; + } + public function test_authorized_business_user_can_push_without_becoming_an_administrator(): void { $this->user->syncRoles([Role::where('name', 'user')->firstOrFail()->id]); diff --git a/tests/Feature/Business/CourierQuoteSignatureWorkflowTest.php b/tests/Feature/Business/CourierQuoteSignatureWorkflowTest.php index 77a7975a..2cf3451b 100644 --- a/tests/Feature/Business/CourierQuoteSignatureWorkflowTest.php +++ b/tests/Feature/Business/CourierQuoteSignatureWorkflowTest.php @@ -134,8 +134,13 @@ class CourierQuoteSignatureWorkflowTest extends FeatureTestCase }); } - public function test_unmapped_quote_initiator_stops_before_upload(): void + /** @dataProvider missingInitiatorConfigurations */ + public function test_unmapped_quote_initiator_stops_before_upload(string $defaultInitiator): void { + config([ + 'services.esign.initiator_accounts' => '{}', + 'services.esign.default_initiator' => $defaultInitiator, + ]); $signature = $this->createPreparedSignature(); Http::fake(); @@ -158,6 +163,11 @@ class CourierQuoteSignatureWorkflowTest extends FeatureTestCase $this->assertNull($signature->fresh()->esign_sign_flow_id); } + public static function missingInitiatorConfigurations(): array + { + return ['default configured' => ['默认企业'], 'all settings absent' => ['']]; + } + public function test_tampered_source_pdf_is_not_sent(): void { $signature = $this->createPreparedSignature(); diff --git a/tests/Unit/EsignConfigurationTest.php b/tests/Unit/EsignConfigurationTest.php index 124b6ce3..1e75d619 100644 --- a/tests/Unit/EsignConfigurationTest.php +++ b/tests/Unit/EsignConfigurationTest.php @@ -72,9 +72,16 @@ class EsignConfigurationTest extends TestCase $this->assertSame('org-default', $configuration->signFlowInitiator()['orgInitiator']['orgId']); } - public function test_unconfigured_installations_keep_the_application_initiator(): void + public function test_unconfigured_legacy_requests_without_a_selected_company_keep_the_application_initiator(): void { - $this->assertNull($this->configuration()->signFlowInitiator('旧企业')); + $this->assertNull($this->configuration()->signFlowInitiator()); + } + + public function test_selected_company_requires_its_identity_even_without_any_initiator_configuration(): void + { + $this->expectExceptionMessage('所选签署主体未配置完整'); + + $this->configuration()->signFlowInitiator('所选企业'); } public function test_unmapped_company_cannot_silently_use_the_default_initiator(): void