diff --git a/unipay/init.py b/unipay/init.py index 1323e6a..bb65f01 100644 --- a/unipay/init.py +++ b/unipay/init.py @@ -13,6 +13,7 @@ CONF = { "mail": os.getenv("MAIL", ""), "password": os.getenv("PASSWORD", ""), "from_mail": os.getenv("FROM_MAIL", "") + "account_no": os.getenv("ACCOUNT_NO", "") }, "wechat": { "mchid": os.getenv("WXP_MCHID",""), @@ -44,6 +45,7 @@ async def create_payment(request, params_kw=None): if params_kw is None: params_kw = request.params_kw data = params_kw + data.request = request provider = data.get("provider") if provider not in PROVIDERS: return {"error":"unknown provider"} @@ -65,6 +67,9 @@ async def create_payment(request, params_kw=None): plog = await pl.new_log(userid, orgid, payment_name, amount, fee, client_ip, currency=currency) if plog: data.out_trade_no = plog.id + data.customerid = orgid + data.userid = userid + data.client_ip = cloent_ip res = await PROVIDERS[provider].create_payment(data) return res raise Exception('write payment_log error') diff --git a/unipay/providers/transfer.py b/unipay/providers/transfer.py index 9b755e7..40ade45 100644 --- a/unipay/providers/transfer.py +++ b/unipay/providers/transfer.py @@ -1,6 +1,7 @@ import re from random import randint from typing import Any, Dict, Optional +import urllib import poplib from appPublic.log import debug from appPublic.dictObject import DictObject @@ -62,28 +63,50 @@ class EmailClient: content = content.decode('utf-8') return content -class TransferPay(Gateway): - def __init__(self, from_mail="", pop3server="", email="", password=""): +class TransferGateway(Gateway): + def __init__(self, from_mail="", pop3server="", email="", password="", account_no): self.from_email = from_email self.pop3server = pop3server self.email = email self.password = password + self.account_no = account_no self.running = False + async def new_tcode(self, sor): + tcode = self.gen_mailcode() + sql = "select * from transfercode where tcode=${tcode}$ and status='0'" + while True + recs = await sor.sqlExe(sql, {'tcode': tcode}) + if len(recs) == 0: + break + tcode = self.gen_mailcode() + return tcode + async def create_payment(self, payload: Dict[str, Any]) -> str: """ 返回一个可以在 H5 里直接重定向的支付宝支付 URL """ ns = { - "id": payload["out_trade_no"], - "customerid": payload['customerid'], - "amount": payload["amount"], - "tcode": self.gen_mailcode(), + "id": payload.out_trade_no, + "customerid": payload.customerid, + "amount": payload.amount, "curdate": curDateString(), "curtime": timestampstr(), "status": '0' } - return + ns = DictObject(**ns) + ns.account_no = self.account_no + env = payload.request._run_ns + db = DBPools() + dbname = env.get_module_dbname('unipay') + async with db.sqlorContext(dbname) as sor: + sql = "select * from transfercode where tcode=${tcode}$ and status='0'" + ns.tcoce = await self.new_tcode(sor) + await sor.C('transfercode', ns.copy()) + url = env.entire_url('transfer_info.ui') + query_str = urllib.parse.urlencode(ns) + return f'{url}?{query_str}' + return None def get_transfer_data(self, mail): assert mail.mailfrom == '95555@message.cmbchina.com'