unipay — 统一支付模块

多渠道统一支付微信支付Native/H5、支付宝、PayPal、Stripe、银行转账码。 凭据全部走环境变量(不落库、不进 git渠道初始化失败自动降级为 disabled不影响宿主启动。

数据表models/*.json

说明 关键字段
paychannel 支付渠道 id, name, enabled_date, expired_date
payfee 支付费率(挂渠道) id, channelid, fee_rate, enabled_date, expired_date
payment_log 支付流水 id, customerid, channelid, channel_trade_id, payment_name, amount_total, pay_feerate, pay_fee, currency, payment_status, init_timestamp, payed_timestamp, cancel_timestamp, userid, payer_client_ip
transfercode 银行转账码(线下打款对账) id, customerid, amount, tcode, curtime, curdate, status

CRUD 定义在 json/paychannel/payfee/payment_log/transfercode由宿主 build.sh 的 xls2ui 生成页面。

环境变量凭据CONF_ENV 映射unipay/init.py

渠道 环境变量
wechat WXP_MCHIDWXP_SERIAL(证书序列号)、WXP_PRIVKEY(私钥 pem 文件路径)、WXP_API_V3_KEY
alipay ALIPAY_APPIDALIPAY_PRIV(应用私钥文件路径)、ALIPAY_PUB(支付宝公钥文件路径)
paypal PP_IDPP_SECRETsandbox=True 为静态默认)
stripe STRIPE_KEY
transfer 无凭据(转账码为平台自管)

缺失凭据的渠道在 load_unipay() 里初始化为 Nonedisabled运行期调用会得到明确的渠道不可用错误。

注册到 ServerEnv 的函数(宿主/dspy 调用面)

load_unipay()unipay/init.py:244向 ServerEnv 注册:

  • get_paychannels() / get_pay_feerate(sor, channelid) / get_pay_fee(providerid, amount) / sor_get_pay_fee(...) — 渠道与费率查询payfee.py
  • create_payment / query_payment / refund_payment — 支付生命周期core.py
  • PaymentLog — 流水记录类paylog.py
  • PROVIDERS — 渠道实例字典 {transfer, wechat, paypal, alipay, stripe}

另有 add_startup(setup_callback_path) 注册回调路径notify.pyget_provider_channel(name)get_provider(name, conf))。

前端入口wwwroot/

  • recharge.ui/.dspyuser_recharge.dspy — 用户充值
  • manual_recharge.ui/.dspytransfer_check.dspytransfer_info.ui — 转账码人工核对(手动按钮触发,不自动轮询)
  • refund.ui/.dspy — 退款
  • usermenu.ui — 用户菜单挂载

providers/ 下按渠道一个文件wechat.py、alipay.py、paypal.py、stripe.py、transfer.py。

宿主集成

  • build.sh 第 5/6 步clone + pip install pkgs/unipay/(普通 install 非 editable改代码后必须重装
  • 宿主 init() 里调用 load_unipay()wwwroot symlink 由 build.sh 第 8 步统一挂

部署注意

  • 凭据文件(私钥 pem路径由环境变量给出文件本身不入仓库
  • payment_log 金额字段落库前经 payfee 计算(费率×金额),改费率逻辑需回归 get_pay_fee
  • 转账码核对是人工动作manual_recharge不要恢复自动轮询
Description
No description provided
Readme 756 KiB
Languages
Python 99.9%
Shell 0.1%