Files
along_django/a_long_dianjing/settings.py
XingQue 685c65691f 支持自动提现多商户轮换:配置入库、打款单强制记 mch_id、收款失败自动换号。
- 新增 wechat_pay_mch_config 表,迁移时从 settings 种子默认商户
- TixianAutoRecord 增加 mch_id;查单/回调解密后按记录对齐
- 后台接口 wxmchlb/wxmchbj/wxmchscwj(权限 8080a)与证书上传

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 02:44:38 +08:00

633 lines
20 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Django settings for a_long_dianjing project.
开发环境配置 - 参照旧项目结构精简
"""
from pathlib import Path
from datetime import timedelta
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
SECRET_KEY = 'django-insecure-9+xu)m%#!#qblgby5sq!sjyg5nj9lir78+&*f$28$459#yktej' # 开发环境可暂用,生产必须改
DEBUG = False # 开发环境为 True
ALLOWED_HOSTS = ['localhost', '127.0.0.1','xingquewangluo.site','ios808.top','6ccy.top','wenhe.nmslb.com'] # 根据开发前端地址可添加
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 第三方应用 (根据 requirements.txt 已安装的)
'rest_framework',
'rest_framework_simplejwt',
'corsheaders',
'django_celery_results',
# 你的自定义应用 (按已创建的拼音命名)
'celery',
'yonghu',
'dingdan',
'shangpin',
'peizhi',
'houtai',
# 'games', # 【待确认】你提到 games 还没创建,暂不添加
'utils',
'shangdian',
'dengji',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 跨域中间件放最前
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 默认开启如API无需可注释
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'guanapi.middleware.OpLogMiddleware', # 【待确认】这是旧项目的自定义中间件,新项目需要吗?
]
ROOT_URLCONF = 'a_long_dianjing.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'a_long_dianjing.wsgi.application'
# Database
# 根据你提供的信息配置 (本地开发端口3307)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#'NAME': 'a_long91', # 你创建的数据库名
'NAME': 'wenhe_dianjing',
'USER': 'root', # 你的本地MySQL用户名
#'PASSWORD': 'a_long999911111', # 你的本地MySQL密码
#'PASSWORD': 'ujedr783w4rfjsr8734fe4',
'PASSWORD': 'shgdy273tahsgd62u3tGHFY',
'HOST': '172.17.0.7',
#'HOST': 'sh-cdb-ga6oxm4s.sql.tencentcdb.com',
'PORT': '3306', # 注意端口是3307
#'PORT': '20263',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET time_zone='+08:00'", # 保持与旧项目一致
}
}
}
# Password validation
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
LANGUAGE_CODE = 'zh-Hans' # 使用中文
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = False # 保持与旧项目一致不使用UTC时区
# Static files (CSS, JavaScript, Images)
STATIC_URL = 'static/'
# 开发环境静态文件目录,可参照旧项目添加 MEDIA 配置
# MEDIA_URL = 'media/'
# MEDIA_ROOT = BASE_DIR / 'media'
# Default primary key field type
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# ==================== 以下为第三方库及自定义配置 ====================
# settings.py
# 修改SIMPLE_JWT配置
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=36500),
'REFRESH_TOKEN_LIFETIME': timedelta(days=36500),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
# 修改这里使用yonghuid而不是id
'USER_ID_FIELD': 'yonghuid',
'USER_ID_CLAIM': 'yonghuid',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
}
# 添加自定义认证后端
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
]
# 必须指定用户模型即使它不继承AbstractBaseUser
AUTH_USER_MODEL = 'yonghu.UserMain'
# DRF配置也非常简单
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'utils.jwt_auth.YonghuidJWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle', # 匿名用户限制
'rest_framework.throttling.UserRateThrottle', # 登录用户限制
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/minute', # 匿名用户每分钟100次
'user': '1000/minute', # 登录用户每分钟1000次
},
# 🔥 关键:使用自定义异常处理器
'EXCEPTION_HANDLER': 'utils.exception_handler.custom_exception_handler',
# 🔥 生产环境只返回JSON不返回HTML更安全
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
}
# CORS settings
CORS_ALLOWED_ORIGINS = [
"http://localhost:8080", # 假设前端开发服务器地址
"http://127.0.0.1:8080",
"http://121.4.54.129",
"https://wenhe.nmslb.com:9187",
"https://wenhe.nmslb.com:4321",
"http://localhost:5173",
"http://localhost:5174"
]
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = (
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS",
)
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
]
# 【待确认】自定义用户模型,你需要在 yonghu/models.py 中创建 class Yonghu
#AUTH_USER_MODEL = 'yonghu.Yonghu'
# OSS配置
COS_SECRET_ID ='AKIDU6WikZBcz96xesxpVM3XoslS3TjogLDx'
COS_SECRET_KEY ='qcJzVqLdkeKyXwKckjV5SCmncFfrqdu2'
COS_REGION = 'ap-guangzhou'
#COS_BUCKET = 'julebu-1361527063'
COS_BUCKET = 'wenhedskjdshjshfjshjfjksdnk236-1404472910'
COS_SCHEME = 'https' # 使用HTTPS
COS_DOMAIN = f'https://{COS_BUCKET}.cos.{COS_REGION}.myqcloud.com'
# settings.py - 在COS配置部分添加
COS_APPID = '1404472910' # 你的腾讯云APPIDjulebu-1361527063中的数字部分
COS_STS_DURATION = 7200 # STS临时凭证有效期
# ==================== 业务相关配置 (值先空着,结构可保留) ====================
# 微信小程序配置 (开发环境可先留空或使用测试号)
#WEIXIN_APPID = 'wx0e4be86faac4a8d1' # 你的小程序APPID
WEIXIN_APPID = 'wx568f9b618bfa7578' # 你的小程序APPID
WEIXIN_SECRET = '269dbb2a81fa843ef92f0cee8857c841'
# 微信虚拟支付配置
VP_OFFER_ID = '1450521456' # 虚拟支付应用ID
VP_APPKEY = '4cQkc13i7rkFNbubUJ63ijP2MMCrpB45' # 正式环境密钥
VP_APPKEY_SANDBOX = 'zlMiTaXppd6OtgLNKKOqmUGnJZuPPq5G' # 沙箱环境密钥
VP_ENV = 0 # 1=沙箱(测试), 0=正式(上线改这里)
VP_PRODUCT_ID = 'spgm1001' # 在后台道具管理中创建并发布后获取
# 原有微信配置保持不变WEIXIN_APPID, WEIXIN_SECRET
# 🆕【新增】服务号配置
WEIXIN_OFFICIAL_APPID = 'wx49a7cfa8dc2ecc49' # 服务号APPID
WEIXIN_OFFICIAL_SECRET = 'ba1bba743756058edbea99f13ae5bac1' # 服务号SECRET
WEIXIN_OFFICIAL_TOKEN = 'u7623ghdwegftr763dhgwe' # 服务号Token
WEIXIN_OFFICIAL_ENCODING_AES_KEY = 'y9bSP14ujdqJvrx1LAnYSEftaJ3yuwNixSHJef4DdRd' # 可选
WEIXIN_TEMPLATE_ID = 'Ngs1sT9TPyFaN4cA108YyMV_0nnutTynPQFXoOdNZZE' # 模板ID
# 🆕【新增】模板消息配置
WEIXIN_TEMPLATE_MAX_PER_MINUTE = 950 # 每分钟最大发送量留50缓冲
WEIXIN_TEMPLATE_BATCH_SIZE = 100 # 每批发送数量
WEIXIN_BROADCAST_ENABLED = True # 服务号订单广播总开关
WEIXIN_BROADCAST_WORKERS = 30 # Celery 任务内并发推送线程数(勿过大,避免触发微信频控)
# 打手无邀请码一键注册(须与小程序 default-invite-code.js 保持一致)
DASHOU_DEFAULT_INVITE_CODE = '0000008U3Ck4267NmxuY'
# 默认邀请码在库中查不到时,回退到该管事 yonghuid请确保该账号在库中存在且为管事
DASHOU_DEFAULT_GUANSHI_YONGHUID = '0000008'
WEIXIN_MCHID = '1746784529' # 商户号,支付功能需要紧急
WEIXIN_SHANGHUMIYAO = 'thgnfbdyhd4536dbvgf7dgfhcvdgfh58'# 商户密钥,支付功能需要紧急
#WEIXIN_SECRET = '3c3673cf052571dea9e3bea88e198434' # 你的小程序SECRET
#WEIXIN_MCHID = '1731500296' # 商户号,支付功能需要
#WEIXIN_MCHID = '1103593250' # 商户号,支付功能需要
#WEIXIN_SHANGHUMIYAO = 'Dujieduze53631383771411017633490'
#WEIXIN_SHANGHUMIYAO = 'abc12345asgjhasklsasdcndcsdklcns'# 商户密钥,支付功能需要
# 罚款缴纳微信支付配置
FAKUAN_PAY_DESCRIPTION = '罚款缴纳' # 支付描述
FAKUAN_PAY_NOTIFY_URL = 'https://wenhe.nmslb.com/hqhd/yonghu/fk_huitiao' # 微信支付回调地址(根据实际域名调整)
WEIXIN_NOTIFY_URL = 'https://wenhe.nmslb.com/hqhd/dingdan/pay-notify/' # 支付回调地址http://你的域名/api/pay/callback/
# settings.py 或相应配置文件中
WEIXIN_PAY_DESCRIPTION = "阿龙电竞" # 支付描述
# 押金充值相关配置
YAJIN_PAY_DESCRIPTION = "打手押金充值" # 押金支付描述
YAJIN_PAY_NOTIFY_URL = "https://wenhe.nmslb.com/hqhd/shangpin/yajinhuitiao" # 押金支付回调地址
# 积分充值相关配置
JIFEN_PAY_DESCRIPTION = "打手积分补充" # 积分支付描述
JIFEN_PAY_NOTIFY_URL = "https://wenhe.nmslb.com/hqhd/shangpin/jifenhuitiao" # 积分支付回调地址
# 会员充值相关配置
HUIYUAN_PAY_DESCRIPTION = "打手会员充值" # 会员支付描述
HUIYUAN_PAY_NOTIFY_URL = "https://wenhe.nmslb.com/hqhd/shangpin/huiyuanhuitiao" # 会员支付回调地址
# 考核支付配置
KAOHE_PAY_DESCRIPTION = '考核金牌-缴纳考核费'
KAOHE_PAY_NOTIFY_URL = 'https://wenhe.nmslb.com/hqhd/yonghu/kh_huitiao' # 替换为实际回调地址
KAOHE_PAY_DEFAULT_FEE = 5.00 # 未配置费用时的默认金额
WEIXIN_CERT_PATH = '/opt/1panel/apps/openresty/openresty/www/sites/119.28.221.247.1199/tuikuanzhengshu/apiclient_cert.pem' # 证书文件路径
WEIXIN_KEY_PATH = '/opt/1panel/apps/openresty/openresty/www/sites/119.28.221.247.1199/tuikuanzhengshu/apiclient_key.pem' # 密钥文件路径
# settings.py
SHANGJIA_CZ_PREFIX = "CzSJ" # 商家充值订单前缀
SHANGJIA_CZ_PAY_DESCRIPTION = "阿龙电竞-商家余额充值"
SHANGJIA_CZ_PAY_NOTIFY_URL = "https://wenhe.nmslb.com/hqhd/shangpin/sjhuitiao"
SHANGJIA_CZ_MIN_AMOUNT = 1
SHANGJIA_CZ_MAX_AMOUNT = 10000
# 订单ID前缀配置
ORDER_PREFIX = {
'yajin': 'CzYJ', # 押金订单前缀
'jifen': 'CzJF', # 积分订单前缀
'huiyuan': 'CzHY', # 会员订单前缀
}
# 腾讯云即时通讯 (IM) - 开发环境可暂不配置
TENCENT_IM_CONFIG = {
'SDK_APP_ID': 0, # 整数
'SECRET_KEY': '',
}
# 阿里云短信 - 开发环境可暂不配置
ALIYUN_SMS_CONFIG = {
'ACCESS_KEY_ID': '',
'ACCESS_KEY_SECRET': '',
'SIGN_NAME': '',
'TEMPLATE_CODE': '',
'REGION_ID': 'cn-hangzhou',
}
# HashID (用于加密ID旧项目有新项目需要吗)
# HASHID_FIELD_SALT = 'a_long_dianjing_2025_salt' # 【待确认】请设置你的盐值
# settings.py 尾部添加
# settings.py
# settings.py
# settings.py 中添加配置
#GOEASY_APPKEY = 'BC-32e2991c69bc47e1b538e73aaed37fc1' # 你的AppKey
GOEASY_APPKEY = 'BC-03d6d588e8a047fc8170ac29ec54220f' # 你的AppKey(阿龙)
#GOEASY_SECRET = 'A469ABAA3cc34D64' # 从GoEasy控制台获取
GOEASY_SECRET = '42c38958a09348e7' # 从GoEasy控制台获取(阿龙)
GOEASY_REST_URL = 'https://rest-hz.goeasy.io/v2/im/message' #正式环境
# settings.py
# H5静态页面域名配置
H5_DOMAIN = 'https://wenhe.nmslb.com:9187' # 生产环境
# H5_DOMAIN = 'https://test-h5.yourdomain.com' # 测试环境
"""
阿龙电竞 - Django设置文件中的Celery配置部分
请在您的settings.py中添加以下配置
"""
# ==================== Celery配置 ====================
# Redis作为消息代理和结果后端
# 生产环境请修改这里的Redis连接信息
REDIS_HOST = '172.19.0.2' # Redis服务器IP
REDIS_PORT = 6379
REDIS_PASSWORD = 'a_long919191' # 如果有密码,替换为你的密码
REDIS_DB_CELERY = 0
REDIS_DB_RESULT = 1
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/2',
'TIMEOUT': 300,
'OPTIONS': {
# 不需要 CLIENT_CLASS
}
}
}
# 构建Redis连接字符串
if REDIS_PASSWORD:
CELERY_BROKER_URL = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_CELERY}'
CELERY_RESULT_BACKEND = f'redis://:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_RESULT}'
else:
CELERY_BROKER_URL = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_CELERY}'
CELERY_RESULT_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_RESULT}'
# 任务接受的内容类型
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# 时区设置
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True
# settings.py 末尾添加(在其他 Celery 配置之后)
CELERY_IMPORTS = ('dingdan.tongzhi_tasks',)
# 生产硬性开关:仅允许新订单服务号广播 Celery 任务,其余一律禁止执行
CELERY_ONLY_ORDER_BROADCAST = True
# 任务超时设置
CELERY_TASK_TIME_LIMIT = 300 # 任务最大执行时间300秒
CELERY_TASK_SOFT_TIME_LIMIT = 240 # 软超时240秒
# Worker并发设置
CELERY_WORKER_CONCURRENCY = 4 # 根据服务器CPU核心数调整
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
# 任务确认设置
CELERY_TASK_ACKS_LATE = True
CELERY_WORKER_DISABLE_RATE_LIMITS = True
# 队列配置
CELERY_TASK_DEFAULT_QUEUE = 'default'
CELERY_TASK_QUEUES = {
'default': {
'exchange': 'default',
'routing_key': 'default',
},
'order_tasks': {
'exchange': 'order_tasks',
'routing_key': 'order_tasks',
},
'periodic_tasks': {
'exchange': 'periodic_tasks',
'routing_key': 'periodic_tasks',
},
'broadcast': {
'exchange': 'broadcast',
'routing_key': 'broadcast',
},
}
CELERY_TASK_ROUTES = {
'dingdan.tongzhi_tasks.dingdan_guangbo': {'queue': 'broadcast'},
}
# ==================== 定时任务时间配置 ====================
# 所有时间配置都在这里,方便修改
# 订单超时时间(秒) - 48小时
ORDER_EXPIRE_SECONDS = 48 * 60 * 60 # 172800秒
# 订单自动结算Celery 延时任务 + 定时补偿)是否启用
ORDER_AUTO_SETTLE_ENABLED = False
# 每日任务执行时间24小时制
DAILY_TASK_HOUR = 0 # 0点
DAILY_TASK_MINUTE = 0 # 0分
# 每月任务执行时间
MONTHLY_TASK_DAY = 1 # 每月1日
MONTHLY_TASK_HOUR = 0 # 0点
MONTHLY_TASK_MINUTE = 0 # 0分
# 订单检查频率(分钟)
ORDER_CHECK_INTERVAL = 5 # 每5分钟检查一次
# ==================== 跨平台订单互通配置 ====================
# 接口认证令牌(双方约定,用于简单验证)
CROSS_PLATFORM_TOKEN = 'jdjdjshwjqk'
# 对方平台接口基础URL需根据实际部署修改
PARTNER_BASE_URL = 'https://www.abas.asia/hqhd'
# 对方平台各接口路径(可根据实际情况调整,但双方需保持一致)
PARTNER_SYNC_ORDER_URL = '/dingdan/partner_sync_order' # 接收派单
PARTNER_CHECK_CLAIM_URL = '/dingdan/partner_check_claim' # 抢单询问
PARTNER_NOTIFY_CLAIM_URL = '/dingdan/partner_notify_claim' # 抢单成功通知
PARTNER_REFUND_NOTIFY_URL = '/dingdan/partner_refund_notify' # 退款通知
# 我方代表对方发单的商家ID需在数据库中存在且具有商家扩展表
AGENT_SHANGJIA_ID = '5438898'
# 用于验证的会员ID根据业务约定
CROSS_PLATFORM_MEMBER_ID = 'VC7CTU'
# 默认游戏类型ID当对方未传递时使用
CROSS_PLATFORM_GAME_TYPE_ID = 2
# 允许跨平台的商家ID列表白名单
CROSS_PLATFORM_WHITELIST = ['001']
# settings.py
ALLOW_INCREASE_ADMINS = ['15552331414','19053065029','13206038845','16686411550','15555555555','13191651805'] # 示例手机号
# ========== 管理员批量链接白名单 ==========
ADMIN_BATCH_LINK_ALLOWED_PHONES = [
'15552331414',
'19053065029',
]
BATCH_LINK_DEFAULT_COUNT = 1
BATCH_LINK_MAX_COUNT = 100
# ==================== 日志配置(终端输出,便于生产排查) ====================
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[{asctime}] {levelname} {name} {pathname}:{lineno}{message}',
'style': '{',
},
'simple': {
'format': '[{asctime}] {levelname} {name}{message}',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'level': 'INFO',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'django.request': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
'yonghu': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'dingdan': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'utils': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
},
}
WECHAT_PAY_V3_CONFIG = {
'MCHID': '1746784529', # 商户号
'APPID': 'wx568f9b618bfa7578', # 小程序APPID
'API_V3_KEY': 'askldskjd783y827Jjksdnhfj3489439', # APIv3密钥32字节
'PRIVATE_KEY_PATH': '/opt/1panel/apps/openresty/openresty/www/sites/119.28.221.247.1199/huizhifuzhengshu/apiclient_key.pem', # 商户私钥文件路径
'CERT_SERIAL_NO': '69B157D89C273CF07A3E233B3BCC84A94D142FB5', # 商户证书序列号
'PLATFORM_CERT_DIR': '/opt/1panel/apps/openresty/openresty/www/sites/119.28.221.247.1199/huizhifuzhengshu/pub_key.pem', # 存放微信平台证书公钥的目录(文件名:序列号.pem
'NOTIFY_URL': 'https://wenhe.nmslb.com/hqhd/yonghu/tixiancallback', # 回调地址
'TRANSFER_SCENE_ID': '1005', # 替换为你的实际场景ID
}
# 多商户证书上传根目录(每个商户一个子目录:{BASE}/{mch_id}/
WECHAT_MCH_CERT_BASE_DIR = '/opt/1panel/apps/openresty/openresty/www/sites/119.28.221.247.1199/huizhifuzhengshu'
CROSS_PLATFORM_SYNC_TOKEN = 'xK9mP2vL8qW5rT7y'