PAYATHON 2026

支付宝商家账户卖出交易查询接口为何未包含在Python SDK中?

支付阿杰

结论

Python SDK 3.7.78 中找不到 alipay.data.bill.sell.query,并不表示 Python 无法调用这个接口。支付宝 Python SDK 主要封装开放平台的网关请求、签名和验签。部分接口可能没有生成对应的 Python Request 类,也可能未被收录在当前下载的 SDK 包中。

Python SDK 通常不会根据 API 名称创建 data 目录。应先在下面的目录中查找对应的请求类:

alipay/aop/api/request/AlipayDataBillSellQueryRequest.py

如果该文件不存在,可以前往支付宝开放平台的 SDK 下载页面,勾选这个接口后重新生成 SDK。如果重新生成后仍然没有对应类,可以自行定义兼容的 Request 类,继续使用 SDK 处理签名和网关请求。

为什么 SDK 中没有 data 目录

alipay.data.bill.sell.query

是开放平台的方法名,不表示 Python 包中必须存在以下目录:

alipay/data/

支付宝 Python SDK 通常将接口文件统一放在:

alipay/aop/api/request/

方法名转换后的类名一般是:

AlipayDataBillSellQueryRequest

因此,判断 SDK 是否收录了这个接口,应搜索该类或下面的文件,而不是查看是否有 data 目录:

AlipayDataBillSellQueryRequest.py

如果这个文件也不存在,可能有以下几种原因:

  • 下载 SDK 时没有勾选该接口;
  • 当前 SDK 生成包尚未包含该接口的 Python 请求类;
  • 接口文档已经发布,但 Python SDK 模板还没有同步;
  • 该接口属于特定业务能力,需要签约或申请权限后才能正常调用。

仅凭 “Python SDK 版本为 3.7.78” 无法判断具体原因。应结合 SDK 下载页面中的接口选择结果、接口文档里的 “调用示例” 以及应用权限列表进行确认。

优先处理方式:重新生成 SDK

先在支付宝开放平台的 SDK 下载或代码生成页面搜索:

alipay.data.bill.sell.query

如果页面允许选择该接口,把它加入接口列表并重新下载 Python SDK。生成成功后,通常可以这样调用:

import json
import logging

from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.request.AlipayDataBillSellQueryRequest import (
    AlipayDataBillSellQueryRequest,
)

config = AlipayClientConfig()
config.server_url = "https://openapi.alipay.com/gateway.do"
config.app_id = "<APP_ID>"
config.app_private_key = "<APP_PRIVATE_KEY>"
config.alipay_public_key = "<ALIPAY_PUBLIC_KEY>"

client = DefaultAlipayClient(
    alipay_client_config=config,
    logger=logging.getLogger(__name__),
)

request = AlipayDataBillSellQueryRequest()
request.biz_content = {
    # 按接口文档填写业务参数
}

response = client.execute(request)
result = json.loads(response)

print(result)

biz_content 中的字段必须以接口文档当前列出的请求参数为准。不要照搬其他账单接口的参数,名称相近的接口不一定使用相同的字段和分页规则。

SDK 没有请求类时的调用方法

如果重新生成的 SDK 中仍然没有这个类,可以自行添加一个与官方 SDK Request 对象兼容的类。下面的写法仍由 SDK 负责公共参数、RSA2 签名和 HTTP 请求:

import json
import logging

from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient


class AlipayDataBillSellQueryRequest:
    def __init__(self, biz_model=None):
        self._api_params = {}
        self._biz_content = None
        self._biz_model = biz_model
        self._terminal_type = None
        self._terminal_info = None
        self._prod_code = None
        self._notify_url = None
        self._return_url = None
        self._need_encrypt = False

    def getApiMethodName(self):
        return "alipay.data.bill.sell.query"

    def getApiVersion(self):
        return "1.0"

    def getTerminalType(self):
        return self._terminal_type

    def getTerminalInfo(self):
        return self._terminal_info

    def getProdCode(self):
        return self._prod_code

    def getNotifyUrl(self):
        return self._notify_url

    def getReturnUrl(self):
        return self._return_url

    def getNeedEncrypt(self):
        return self._need_encrypt

    def getBizContent(self):
        if self._biz_model is not None:
            return self._biz_model.to_alipay_dict()
        return self._biz_content

    def getApiParams(self):
        return self._api_params

    @property
    def biz_content(self):
        return self._biz_content

    @biz_content.setter
    def biz_content(self, value):
        self._biz_content = value


config = AlipayClientConfig()
config.server_url = "https://openapi.alipay.com/gateway.do"
config.app_id = "<APP_ID>"
config.app_private_key = "<APP_PRIVATE_KEY>"
config.alipay_public_key = "<ALIPAY_PUBLIC_KEY>"

client = DefaultAlipayClient(
    alipay_client_config=config,
    logger=logging.getLogger(__name__),
)

request = AlipayDataBillSellQueryRequest()
request.biz_content = {
    # 严格按照接口文档填写必选和可选参数
}

response = client.execute(request)
result = json.loads(response)

print(json.dumps(result, ensure_ascii=False, indent=2))

不同来源或版本的 Python SDK,Request 类的接口可能略有不同。可以打开当前 SDK 中任意一个已有的 Request 文件,例如:

alipay/aop/api/request/AlipayTradeQueryRequest.py

复制它的类结构,只将下面的内容替换为目标接口:

def getApiMethodName(self):
    return "alipay.data.bill.sell.query"

这样能避免当前 SDK 因方法名要求不同而抛出 AttributeError。

调用前还要确认权限

即使签名正确,应用没有接口权限时,调用仍然会失败。需要检查:

  • 当前应用是否已开通该接口所属的产品;
  • 调用方支付宝商家账户是否符合接口准入条件;
  • 应用与商家账户之间是否已建立正确的授权关系;
  • 第三方应用代商家调用时,是否需要传入应用授权令牌;
  • 正式环境和沙箱环境是否支持相同的业务能力。

如果响应中出现以 ISV 开头的错误码、权限不足或产品未签约,应根据 sub_code 和 sub_msg 继续排查。这类错误通常与 Python SDK 是否存在 data 目录无关。

注意事项

签名时应使用应用私钥,验签时应使用支付宝公钥或支付宝公钥证书,两者不能混用。生产环境网关通常是:

https://openapi.alipay.com/gateway.do

接口文档页面不是业务请求地址,不能直接向文档 URL 发送查询请求。

如果接口使用证书模式,还需要按照当前 SDK 的证书模式配置应用公钥证书、支付宝公钥证书和支付宝根证书,不能只设置 alipay_public_key。

建议保留支付宝网关返回的原始响应。排查问题时,重点查看以下字段:

code
msg
sub_code
sub_msg

请求成功后,再按照接口文档解析业务数据。不能只根据 HTTP 状态码判断接口是否调用成功。

备注:内容仅供参考。