Quellcode durchsuchen

feat(contract): 支持 e签宝多环境配置并备份清理合同数据

Co-authored-by: Cursor <cursoragent@cursor.com>
天空之城 vor 12 Stunden
Ursprung
Commit
2cfa14e162

+ 14 - 0
.env.dev

@@ -30,7 +30,21 @@ STORE_BASE_URL=http://127.0.0.1:8001
 CONTRACT_BASE_URL=http://127.0.0.1:8002
 
 # e签宝
+ESIGN_HOST=https://smlopenapi.esign.cn
+ESIGN_APP_ID=7439100277
+ESIGN_APP_SECRET=fda5f9e9652571066631f7ba938092e1
+ESIGN_ORG_ID=f25ca92b44a34b2c94289e0afec2518b
 ESIGN_CALLBACK_URL=http://120.26.186.130:33333/api/contract/esign/callback
+ESIGN_DEVELOPER_CALLBACK_URL=http://120.26.186.130:33333/api/contract/esign/callback
+ESIGN_REDIRECT_URL=https://www.esign.cn/
+ESIGN_TEMPLATE_STORE_AGREEMENT=266369d0efd94e14a78035b881e8cb93
+ESIGN_TEMPLATE_LAWYER_AGREEMENT=28f8c0337b044ca0acb6e3559f526d95
+ESIGN_TEMPLATE_ALIPAY_AUTH=f42e72f59bb648c280ec4c3e937e0c26
+ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT=18ecbd5a85cc4a0ba190a010a79bf8da
+ESIGN_TEMPLATE_FILE_STORE_AGREEMENT=U店在这-商户入驻协议
+ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT=U店在这-律所入驻协议
+ESIGN_TEMPLATE_FILE_ALIPAY_AUTH=U店在这-支付宝授权函
+ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT=U店在这-微信支付承诺函
 
 # 阿里云短信
 ALIYUN_SMS_SIGN_NAME_CONTRACT=爱丽恩严大连商务科技

+ 15 - 1
.env.example

@@ -57,10 +57,24 @@ LAWYER_PORT=8004
 STORE_BASE_URL=http://127.0.0.1:8001
 CONTRACT_BASE_URL=http://127.0.0.1:8002
 
-# -------------------- e签宝回调地址 --------------------
+# -------------------- e签宝 --------------------
+# 沙箱: https://smlopenapi.esign.cn
+# 正式: https://openapi.esign.cn
+ESIGN_HOST=
+ESIGN_APP_ID=
+ESIGN_APP_SECRET=
+ESIGN_ORG_ID=
 ESIGN_CALLBACK_URL=
 ESIGN_DEVELOPER_CALLBACK_URL=
 ESIGN_REDIRECT_URL=https://www.esign.cn/
+ESIGN_TEMPLATE_STORE_AGREEMENT=
+ESIGN_TEMPLATE_LAWYER_AGREEMENT=
+ESIGN_TEMPLATE_ALIPAY_AUTH=
+ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT=
+ESIGN_TEMPLATE_FILE_STORE_AGREEMENT=U店在这-商户入驻协议
+ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT=U店在这-律所入驻协议
+ESIGN_TEMPLATE_FILE_ALIPAY_AUTH=U店在这-支付宝授权函
+ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT=U店在这-微信支付承诺函
 
 # -------------------- 阿里云短信 --------------------
 ALIYUN_SMS_SIGN_NAME_CONTRACT=

+ 13 - 0
.env.produ

@@ -42,8 +42,21 @@ STORE_BASE_URL=http://127.0.0.1:48001
 CONTRACT_BASE_URL=http://127.0.0.1:8002
 
 # e签宝(生产域名)
+ESIGN_HOST=https://openapi.esign.cn
+ESIGN_APP_ID=5112070183
+ESIGN_APP_SECRET=5395b8126e466fabcea34a7ae896566a
+ESIGN_ORG_ID=418f407d75104d52a2f563ba2daecb98
 ESIGN_CALLBACK_URL=https://prod.ailien.shop/api/contract/esign/callback
 ESIGN_DEVELOPER_CALLBACK_URL=https://prod.ailien.shop/api/contract/esign/callback
+ESIGN_REDIRECT_URL=https://www.esign.cn/
+ESIGN_TEMPLATE_STORE_AGREEMENT=669f4ecc21094c5a9601b2bb9a627f3e
+ESIGN_TEMPLATE_LAWYER_AGREEMENT=b6428c23abac4e889c937f9ed0722481
+ESIGN_TEMPLATE_ALIPAY_AUTH=04bd38e8c928400190cc655c556e4405
+ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT=662fe139959f40fe9d2a7272392f2740
+ESIGN_TEMPLATE_FILE_STORE_AGREEMENT=U店在这-商户入驻协议
+ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT=U店在这-律所入驻协议
+ESIGN_TEMPLATE_FILE_ALIPAY_AUTH=U店在这-支付宝授权函
+ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT=U店在这-微信支付承诺函
 
 # 阿里云短信
 ALIYUN_SMS_SIGN_NAME_CONTRACT=爱丽恩严大连商务科技

+ 14 - 0
.env.sit

@@ -30,7 +30,21 @@ STORE_BASE_URL=http://127.0.0.1:8001
 CONTRACT_BASE_URL=http://127.0.0.1:8002
 
 # e签宝
+ESIGN_HOST=https://smlopenapi.esign.cn
+ESIGN_APP_ID=7439100277
+ESIGN_APP_SECRET=fda5f9e9652571066631f7ba938092e1
+ESIGN_ORG_ID=f25ca92b44a34b2c94289e0afec2518b
 ESIGN_CALLBACK_URL=http://120.26.186.130:33333/api/contract/esign/callback
+ESIGN_DEVELOPER_CALLBACK_URL=http://120.26.186.130:33333/api/contract/esign/callback
+ESIGN_REDIRECT_URL=https://www.esign.cn/
+ESIGN_TEMPLATE_STORE_AGREEMENT=266369d0efd94e14a78035b881e8cb93
+ESIGN_TEMPLATE_LAWYER_AGREEMENT=28f8c0337b044ca0acb6e3559f526d95
+ESIGN_TEMPLATE_ALIPAY_AUTH=f42e72f59bb648c280ec4c3e937e0c26
+ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT=18ecbd5a85cc4a0ba190a010a79bf8da
+ESIGN_TEMPLATE_FILE_STORE_AGREEMENT=U店在这-商户入驻协议
+ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT=U店在这-律所入驻协议
+ESIGN_TEMPLATE_FILE_ALIPAY_AUTH=U店在这-支付宝授权函
+ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT=U店在这-微信支付承诺函
 
 # 阿里云短信
 ALIYUN_SMS_SIGN_NAME_CONTRACT=爱丽恩严大连商务科技

+ 14 - 0
.env.uat

@@ -33,7 +33,21 @@ STORE_BASE_URL=http://127.0.0.1:8001
 CONTRACT_BASE_URL=http://127.0.0.1:8002
 
 # e签宝
+ESIGN_HOST=https://openapi.esign.cn
+ESIGN_APP_ID=5112070183
+ESIGN_APP_SECRET=5395b8126e466fabcea34a7ae896566a
+ESIGN_ORG_ID=418f407d75104d52a2f563ba2daecb98
 ESIGN_CALLBACK_URL=https://uat.ailien.shop/api/contract/esign/callback
+ESIGN_DEVELOPER_CALLBACK_URL=https://uat.ailien.shop/api/contract/esign/callback
+ESIGN_REDIRECT_URL=https://www.esign.cn/
+ESIGN_TEMPLATE_STORE_AGREEMENT=669f4ecc21094c5a9601b2bb9a627f3e
+ESIGN_TEMPLATE_LAWYER_AGREEMENT=b6428c23abac4e889c937f9ed0722481
+ESIGN_TEMPLATE_ALIPAY_AUTH=04bd38e8c928400190cc655c556e4405
+ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT=662fe139959f40fe9d2a7272392f2740
+ESIGN_TEMPLATE_FILE_STORE_AGREEMENT=U店在这-商户入驻协议
+ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT=U店在这-律所入驻协议
+ESIGN_TEMPLATE_FILE_ALIPAY_AUTH=U店在这-支付宝授权函
+ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT=U店在这-微信支付承诺函
 
 # 阿里云短信
 ALIYUN_SMS_SIGN_NAME_CONTRACT=爱丽恩严大连商务科技

+ 39 - 0
alembic/versions/e6f1a2b3c4d5_backup_and_clear_contract_center_tables.py

@@ -0,0 +1,39 @@
+"""backup and clear contract center tables
+
+Revision ID: e6f1a2b3c4d5
+Revises: d8a7a6a4581c
+Create Date: 2026-06-11 18:21:00.000000
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+
+revision: str = "e6f1a2b3c4d5"
+down_revision: Union[str, Sequence[str], None] = "d8a7a6a4581c"
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    op.execute("CREATE TABLE `contract_bundle_backup` LIKE `contract_bundle`")
+    op.execute("INSERT INTO `contract_bundle_backup` SELECT * FROM `contract_bundle`")
+
+    op.execute("CREATE TABLE `contract_document_backup` LIKE `contract_document`")
+    op.execute("INSERT INTO `contract_document_backup` SELECT * FROM `contract_document`")
+
+    op.execute("CREATE TABLE `contract_event_backup` LIKE `contract_event`")
+    op.execute("INSERT INTO `contract_event_backup` SELECT * FROM `contract_event`")
+
+    op.execute("DELETE FROM `contract_event`")
+    op.execute("DELETE FROM `contract_document`")
+    op.execute("DELETE FROM `contract_bundle`")
+
+    op.execute("ALTER TABLE `contract_event` AUTO_INCREMENT = 1")
+    op.execute("ALTER TABLE `contract_document` AUTO_INCREMENT = 1")
+    op.execute("ALTER TABLE `contract_bundle` AUTO_INCREMENT = 1")
+
+
+def downgrade() -> None:
+    # 数据清理不可逆。备份表保留,不自动回灌,避免覆盖回滚后产生的正式数据。
+    pass

+ 44 - 15
alien_contract/infrastructure/esign/esign_config.py

@@ -1,26 +1,55 @@
-
 import os
+from pathlib import Path
+
+
+APP_ENV = os.getenv("APP_ENV", "dev")
+ROOT_DIR = Path(__file__).resolve().parents[3]
+ENV_FILE = ROOT_DIR / f".env.{APP_ENV}"
+
+
+def _load_env_file(path: Path) -> None:
+    if not path.exists():
+        return
+    for raw_line in path.read_text(encoding="utf-8").splitlines():
+        line = raw_line.strip()
+        if not line or line.startswith("#") or "=" not in line:
+            continue
+        key, value = line.split("=", 1)
+        key = key.strip()
+        if not key or key in os.environ:
+            continue
+        os.environ[key] = value.strip().strip("\"'")
+
+
+_load_env_file(ENV_FILE)
+
+
+def _required_env(name: str) -> str:
+    value = os.getenv(name)
+    if not value:
+        raise RuntimeError(f"缺少 e签宝环境变量: {name}")
+    return value
 
 
 class Config:
     def __init__(self):
-        self.appId = "7439100277"
-        self.scert = "fda5f9e9652571066631f7ba938092e1"
-        self.host = "https://smlopenapi.esign.cn"
-        self.ordid = "f25ca92b44a34b2c94289e0afec2518b"
-        self.templates_id = "266369d0efd94e14a78035b881e8cb93"
+        self.appId = _required_env("ESIGN_APP_ID")
+        self.scert = _required_env("ESIGN_APP_SECRET")
+        self.host = _required_env("ESIGN_HOST").rstrip("/")
+        self.ordid = _required_env("ESIGN_ORG_ID")
         self.templates_map = {
-            "store_agreement": "266369d0efd94e14a78035b881e8cb93",
-            "lawyer_agreement": "28f8c0337b044ca0acb6e3559f526d95",
-            "alipay_auth": "f42e72f59bb648c280ec4c3e937e0c26",
-            "wechat_pay_commitment": "18ecbd5a85cc4a0ba190a010a79bf8da",
+            "store_agreement": _required_env("ESIGN_TEMPLATE_STORE_AGREEMENT"),
+            "lawyer_agreement": _required_env("ESIGN_TEMPLATE_LAWYER_AGREEMENT"),
+            "alipay_auth": _required_env("ESIGN_TEMPLATE_ALIPAY_AUTH"),
+            "wechat_pay_commitment": _required_env("ESIGN_TEMPLATE_WECHAT_PAY_COMMITMENT"),
         }
+        self.templates_id = self.templates_map["store_agreement"]
         self.template_file_names = {
-            "store_agreement": "U店在这-商户入驻协议",
-            "lawyer_agreement": "U店在这-律所入驻协议",
-            "alipay_auth": "U店在这-支付宝授权函",
-            "wechat_pay_commitment": "U店在这-微信支付承诺函",
+            "store_agreement": _required_env("ESIGN_TEMPLATE_FILE_STORE_AGREEMENT"),
+            "lawyer_agreement": _required_env("ESIGN_TEMPLATE_FILE_LAWYER_AGREEMENT"),
+            "alipay_auth": _required_env("ESIGN_TEMPLATE_FILE_ALIPAY_AUTH"),
+            "wechat_pay_commitment": _required_env("ESIGN_TEMPLATE_FILE_WECHAT_PAY_COMMITMENT"),
         }
-        self.callback_url = os.getenv("ESIGN_CALLBACK_URL", "http://120.26.186.130:33333/api/contract/esign/callback")
+        self.callback_url = _required_env("ESIGN_CALLBACK_URL")
         self.developer_callback_url = os.getenv("ESIGN_DEVELOPER_CALLBACK_URL", self.callback_url)
         self.redirect_url = os.getenv("ESIGN_REDIRECT_URL", "https://www.esign.cn/")