Python Zeep调用发票API Login接口缺SESSION_ID报错如何解决
zeep调用发票API报Missing element SESSION_ID解决方案
该错误是因为你调用的Login方法根据WSDL定义,必须传入包含SESSION_ID字段的REQUEST_HEADER参数,你当前只传了用户名和密码,缺少该必填参数。可按照以下步骤解决:
步骤1:确认Login方法的完整参数结构
先运行如下代码打印Login方法的参数定义,确认参数顺序、参数名以及REQUEST_HEADER的结构:
import zeep wsdl = '你的WSDL地址' client = zeep.Client(wsdl=wsdl) # 打印Login方法的参数说明 print(client.service.Login.__doc__) # 也可以查看所有类型定义,找到REQUEST_HEADER的所属命名空间 # print(client.wsdl.types)
步骤2:构造REQUEST_HEADER对象
根据打印出的类型定义构造请求头,大部分发票API首次登录时SESSION_ID允许传入空字符串,登录成功后会返回有效SESSION_ID供后续接口使用:
# 注意命名空间前缀ns0要和你实际打印的WSDL命名空间一致 RequestHeaderType = client.get_type('ns0:REQUEST_HEADER') request_header = RequestHeaderType(SESSION_ID='')
步骤3:传入完整参数调用Login方法
按照参数定义传入所有必填参数,注意参数名要和WSDL定义完全一致(比如用户名密码的参数名可能是USERNAME/PASSWORD而不是小写):
# 按参数名传入,避免顺序错误 login_result = client.service.Login( REQUEST_HEADER=request_header, USERNAME='你的用户名', PASSWORD='你的密码' ) # 调用成功后可从返回结果中获取SESSION_ID,后续接口调用使用 # session_id = login_result.RESPONSE_HEADER.SESSION_ID
可选排查方案
如果还是报错,可以打印实际发出的SOAP请求内容,核对参数是否正确:
with client.settings(raw_response=True): resp = client.service.Login( REQUEST_HEADER=request_header, USERNAME='你的用户名', PASSWORD='你的密码' ) # 打印实际请求的XML内容 print(resp.content.decode('utf-8'))
注意事项
- 如果
REQUEST_HEADER是定义在SOAP头中而不是请求体中,可以用如下方式设置全局请求头后再调用:client.set_default_soapheaders([request_header]) - 如果空字符串不被允许,请参考对应发票API的官方文档确认
SESSION_ID的获取规则。
内容的提问来源于stack exchange,提问作者codbop
相关产品推荐
相关产品推荐

