Files
along_django/peizhi/migrations/0022_wechat_pay_mch_config.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

71 lines
3.5 KiB
Python

# Generated manually for multi WeChat merchant transfer configs
from django.db import migrations, models
def seed_default_mch(apps, schema_editor):
WechatPayMchConfig = apps.get_model('peizhi', 'WechatPayMchConfig')
if WechatPayMchConfig.objects.exists():
return
# 运行时从 settings 导入,避免迁移环境无配置时炸掉
try:
from django.conf import settings
raw = getattr(settings, 'WECHAT_PAY_V3_CONFIG', {}) or {}
except Exception:
return
mch_id = str(raw.get('MCHID') or '').strip()
appid = str(raw.get('APPID') or '').strip()
api_v3_key = str(raw.get('API_V3_KEY') or '').strip()
private_key_path = str(raw.get('PRIVATE_KEY_PATH') or '').strip()
cert_serial_no = str(raw.get('CERT_SERIAL_NO') or '').strip()
if not all([mch_id, appid, api_v3_key, private_key_path, cert_serial_no]):
return
WechatPayMchConfig.objects.create(
mch_id=mch_id,
name='默认商户(自settings迁移)',
appid=appid,
api_v3_key=api_v3_key,
private_key_path=private_key_path,
cert_serial_no=cert_serial_no,
platform_pub_key_path=str(raw.get('PLATFORM_CERT_DIR') or '').strip(),
notify_url=str(raw.get('NOTIFY_URL') or '').strip(),
transfer_scene_id=str(raw.get('TRANSFER_SCENE_ID') or '1005').strip() or '1005',
priority=1,
enabled=True,
)
class Migration(migrations.Migration):
dependencies = [
('peizhi', '0021_withdrawconfig_dongjie_quanju_enabled'),
]
operations = [
migrations.CreateModel(
name='WechatPayMchConfig',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('mch_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='商户号')),
('name', models.CharField(blank=True, default='', max_length=100, verbose_name='备注名称')),
('appid', models.CharField(max_length=64, verbose_name='小程序AppID')),
('api_v3_key', models.CharField(max_length=64, verbose_name='APIv3密钥')),
('private_key_path', models.CharField(max_length=500, verbose_name='商户私钥pem路径')),
('cert_serial_no', models.CharField(max_length=128, verbose_name='商户证书序列号')),
('platform_pub_key_path', models.CharField(blank=True, default='', max_length=500, verbose_name='微信平台公钥pem路径')),
('notify_url', models.CharField(blank=True, default='', max_length=500, verbose_name='转账回调URL')),
('transfer_scene_id', models.CharField(default='1005', max_length=32, verbose_name='转账场景ID')),
('priority', models.IntegerField(db_index=True, default=100, verbose_name='优先级(越小越优先)')),
('enabled', models.BooleanField(db_index=True, default=True, verbose_name='是否启用')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '微信转账商户配置',
'verbose_name_plural': '微信转账商户配置',
'db_table': 'wechat_pay_mch_config',
'ordering': ['priority', 'id'],
},
),
migrations.RunPython(seed_default_mch, migrations.RunPython.noop),
]