支持自动提现多商户轮换:配置入库、打款单强制记 mch_id、收款失败自动换号。
- 新增 wechat_pay_mch_config 表,迁移时从 settings 种子默认商户 - TixianAutoRecord 增加 mch_id;查单/回调解密后按记录对齐 - 后台接口 wxmchlb/wxmchbj/wxmchscwj(权限 8080a)与证书上传 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
70
peizhi/migrations/0022_wechat_pay_mch_config.py
Normal file
70
peizhi/migrations/0022_wechat_pay_mch_config.py
Normal file
@@ -0,0 +1,70 @@
|
||||
# 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),
|
||||
]
|
||||
Reference in New Issue
Block a user