PAYATHON 2026

pyQiwiP2P 使用 QIWI 支付时出现 TypeError

支付老李

结论

这个异常和 pay_sources 选择了 QIWI、银行卡还是手机支付没有关系,也不是 QIWI 接口返回的支付错误。程序在导入 pyqiwip2p 时就已经失败。

list[str] 是 Python 3.9 开始正式支持的内置泛型写法。如果虚拟环境使用的是 Python 3.8 或更早版本,解释器会尝试对 list 类型执行下标操作,随后抛出:

TypeError: 'type' object is not subscriptable

建议安装 Python 3.9 或更高版本,重新创建虚拟环境,再安装 pyqiwip2p。

为什么会在函数定义处报错

库中使用了类似这样的类型注解:

pay_sources: list[str] = None

在 Python 3.9 及更高版本中,这表示“由字符串组成的列表”。旧版 Python 不支持直接将内置类型写成 list[str],需要使用下面的兼容写法:

from typing import List

pay_sources: List[str] = None

解释器会在加载模块时解析类型注解。因此,异常出现在导入 QiwiP2P 的阶段,还没有执行 p2p.bill(),也没有访问 QIWI 支付接口。

可以先检查虚拟环境实际使用的 Python 版本:

python --version
python -c "import sys; print(sys.executable); print(sys.version)"

第二条命令还会显示解释器路径,可以用来判断当前运行的是否为预期虚拟环境中的 Python。

推荐解决方案:升级 Python 并重建虚拟环境

安装 Python 3.9 或更高版本后,需要重新创建虚拟环境。旧虚拟环境仍然绑定原来的解释器,不能直接继续使用。

py -3.9 -m venv venv
venv\Scripts\activate
python -m pip install --upgrade pip
python -m pip install pyqiwip2p

如果机器上安装的是其他较新的 Python 版本,把 -3.9 换成对应版本即可。安装完成后再次检查版本:

python --version

无法升级 Python 时的处理方式

如果项目必须使用 Python 3.7 或 3.8,可以安装明确支持该 Python 版本的 pyqiwip2p 旧版本。安装前应查看相应版本的兼容说明,不要只根据版本号判断。

也可以临时修改第三方库源码来避开这个错误。例如,把:

pay_sources: list[str] = None

改为:

from typing import List

pay_sources: List[str] = None

还有一种可能的兼容方法是在模块顶部加入:

from __future__ import annotations

但直接修改 site-packages 不适合长期使用。重新安装或升级依赖后,这些修改会丢失,库中也可能存在其他与旧版 Python 不兼容的语法。如果必须兼容旧环境,更合适的做法是固定已经确认兼容的版本,或者维护一个经过测试的依赖分支。

调整后的调用示例

升级解释器并正确安装依赖后,可以用下面的代码创建账单。示例中的 bill_id 必须由程序生成或由外部传入,不能使用未定义的 random_id:

from uuid import uuid4

from pyqiwip2p import QiwiP2P
from pyqiwip2p.Qiwip2p import PaymentMethods


def create_trans(amount=400, lifetime=30, comment="def"):
    p2p = QiwiP2P(auth_key="YOUR_SECRET_KEY")

    bill = p2p.bill(
        amount=amount,
        lifetime=lifetime,
        comment=comment,
        bill_id=str(uuid4()),
        pay_sources=[
            PaymentMethods.qiwi,
            PaymentMethods.card,
            PaymentMethods.mobile,
        ],
    )

    return bill

如果只允许使用 QIWI 钱包支付,可以把支付来源缩小为:

pay_sources=[PaymentMethods.qiwi]

pay_sources 只用于限制账单支持的支付渠道,无法解决解释器的语法兼容问题。

注意事项

  • 升级 Python 后需要重新创建虚拟环境。只升级 pip 不会改变 Python 版本。
  • 如果示例中的 random_id 没有提前定义,当前异常修复后还会出现 NameError。
  • bill_id 应保持唯一,并符合当前库和支付接口对该字段的要求。
  • 不要把真实的 auth_key 写入源码或提交到版本库。建议从环境变量或密钥管理服务中读取。
  • 修复 list[str] 只能解决本地导入错误。账单能否成功创建和支付,还取决于账户状态、密钥权限、接口可用性,以及 QIWI 当前在相应地区提供的服务。

备注:内容仅供参考。