From 26e259812566f7a99b90e4b1d9482eab40f5d7f8 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 15 Dec 2025 15:34:12 +0800 Subject: [PATCH] bugfix --- unipay/init.py | 4 ++- unipay/payfee.py | 73 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/unipay/init.py b/unipay/init.py index 260aa57..50c997b 100644 --- a/unipay/init.py +++ b/unipay/init.py @@ -4,7 +4,7 @@ from appPublic.log import debug,exception from ahserver.serverenv import ServerEnv from .notify import get_provider, get_provider_channel from .paylog import PaymentLog -from .payfee import get_pay_fee, sor_get_pay_fee +from .payfee import get_pay_fee, sor_get_pay_fee, get_paychannels, get_pay_feerate # 从 env 或配置载入 provider conf(这里只示例) CONF = { @@ -137,6 +137,8 @@ def load_unipay(): PROVIDERS["alipay"] = get_provider("alipay", CONF["alipay"]), PROVIDERS["stripe"] = get_provider("stripe", CONF["stripe"]) env = ServerEnv() + env.get_paychannels = get_paychannels + env.get_pay_feerate = get_pay_feerate env.payment_notify = payment_notify env.create_payment = create_payment env.query_payment = query_payment diff --git a/unipay/payfee.py b/unipay/payfee.py index b69fda1..d73ad46 100644 --- a/unipay/payfee.py +++ b/unipay/payfee.py @@ -1,6 +1,7 @@ # payfee from ahserver.serverenv import ServerEnv from sqlor.dbpools import DBPools + async def get_pay_fee(providerid, amount): db = DBPools() env = ServerEnv() @@ -9,10 +10,70 @@ async def get_pay_fee(providerid, amount): return await sor_get_pay_fee(sor, providerid, amount) return None -async def sor_get_pay_fee(sor, providerid, amount): - sql = """select * from payfee where id=${providerid}$""" - recs = await sor.sqlExe(sql, {'id': providerid}) - if len(recs) < 1: - return None - return amount * recs[0].fee_rate * amount +async def get_paychannels(): + env = ServerEnv() + db = DBPools() + dbname = env.get_module_dbname('unipay') + async with db.sqlorContext(dbname) as sor: + return await sor_get_paychannels(sor) + return None + +async def sor_get_paychannels(sor): + env = ServerEnv() + dbname = env.get_module_dbname('unipay') + biz_date = env.get_business_date(sor) + sql = """select +a.id, a.name, b.fee_rate +from paychannel a left join payfee b + on a.id = b.channelid +where + a.enabled_date <= ${biz_date}$ + and a.expired_date >= ${biz_date}$ + and b.enabled_date <= ${biz_date}$ + and b.expired_date >= ${biz_date}$ +""" + recs = await sor.sqlExe(sql, {'channelid': channelid, + 'biz_date': biz_date}) + return recs + +async def get_pay_feerate(sor, channelid): + env = ServerEnv() + db = DBPools() + dbname = env.get_module_dbname('unipay') + async with db.sqlorContext(dbname) as sor: + return await sor_get_pay_feerate(sor, channelid) + return None +async def sor_get_pay_feerate(sor, channelid): + env = ServerEnv() + dbname = env.get_module_dbname('unipay') + biz_date = env.get_business_date(sor) + sql = """select +a.id, a.name, b.fee_rate +from paychannel a left join payfee b + on a.id = b.channelid +where + a.enabled_date <= ${biz_date}$ + and a.expired_date >= ${biz_date}$ + and b.enabled_date <= ${biz_date}$ + and b.expired_date >= ${biz_date}$ + and a.id = ${channelid}$ +""" + recs = await sor.sqlExe(sql, {'channelid': channelid, + 'biz_date': biz_date}) + if len(recs) > 0: + return recs[0] + return None + +async def sor_get_pay_fee(sor, providerid, amount): + rec = await sor_get_pay_feerate(sor, providerid) + if rec is None: + e = Exception(f'{providerid} pay channel not found') + exception(f'Exception:{e}') + raise e + if rec.fee_rate is None: + e = Exception(f'{providerid} channel has not defined fee rate') + exception(f'Exception:{e}') + raise e + + return rec.fee_rate * amount