Python调用DHL SOAP API创建运单获取面单的实现求助
DHL API 调用修复方案
端点配置说明
你本地存储的WSDL文件默认内置了DHL生产环境的请求端点,若要使用沙箱环境测试,需要手动覆盖请求地址,无需修改WSDL文件内容。
现有问题修复
错误1:SOAP认证头命名空间不匹配
你当前构造认证头使用的是测试命名空间http://test.python-zeep.org,不符合DHL接口要求,需要替换为官方cis命名空间http://dhl.de/webservice/cisbase。
错误2:请求体参数缺失
Missing Element Version报错是由于调用createShipmentOrder方法时未传入任何请求参数,接口要求的必填字段全部为空,按照你提供的测试XML结构构造字典参数传入即可。
修复后完整代码
from requests import Session from requests.auth import HTTPBasicAuth from zeep import Client, xsd from zeep.transports import Transport # 认证信息 gateway_user = "my_user_name" gateway_password = "my_password" api_user = "2222222222_01" # 官方文档提供的测试用户 api_signature = "pass" # 官方文档提供的测试签名 test_account_number = "22222222220101" # 替换为你自己的V62WP产品对应测试账号 # 本地WSDL路径 wsdl = "./geschaeftskundenversand-api-3.1.8.wsdl" # DHL沙箱端点 dhl_sandbox_endpoint = "https://cig.dhl.de/services/sandbox/soap" session = Session() # 网关基础认证 session.auth = HTTPBasicAuth(gateway_user, gateway_password) client = Client(wsdl, transport=Transport(session=session)) # 配置沙箱端点 client.set_options(address=dhl_sandbox_endpoint) # 构造正确命名空间的认证头 header = xsd.Element( '{http://dhl.de/webservice/cisbase}Authentification', xsd.ComplexType([ xsd.Element('{http://dhl.de/webservice/cisbase}user', xsd.String()), xsd.Element('{http://dhl.de/webservice/cisbase}signature', xsd.String()), ]) ) header_value = header(user=api_user, signature=api_signature) # 构造请求体参数,完全对应你提供的测试XML结构 request_data = { "Version": { "majorRelease": 3, "minorRelease": 1 }, "ShipmentOrder": [ { "sequenceNumber": "", "Shipment": { "ShipmentDetails": { "product": "V62WP", "accountNumber": test_account_number, "customerReference": "123456", "shipmentDate": "2021-09-03", "costCentre": "", "ShipmentItem": { "weightInKG": 1, "lengthInCM": 25, "widthInCM": 15, "heightInCM": 1 }, "Service": {}, "Notification": { "recipientEmailAddress": "empfaenger@test.de" } }, "Shipper": { "Name": { "name1": "Absender Zeile 1", "name2": "Absender Zeile 2", "name3": "Absender Zeile 3" }, "Address": { "streetName": "Vegesacker Heerstr.", "streetNumber": "111", "zip": "28757", "city": "Bremen", "Origin": { "country": "", "countryISOCode": "DE" } }, "Communication": { "phone": "+49421987654321", "email": "absender@test.de", "contactPerson": "Kontaktperson Absender" } }, "Receiver": { "name1": "Name", "Address": { "name2": "Empfänger Zeile 2", "name3": "Empfänger Zeile 3", "streetName": "Street", "streetNumber": "Number", "zip": "zipCode", "city": "City", "Origin": { "country": "", "countryISOCode": "DE" } }, "Communication": { "phone": "+49421123456789", "email": "empfaenger@test.de", "contactPerson": "Kontaktperson Empfänger" } } }, "PrintOnlyIfCodeable": {"active": 1} } ], "labelResponseType": "URL", "groupProfileName": "", "labelFormat": "", "labelFormatRetoure": "", "combinedPrinting": 0 } # 发起请求 response = client.service.createShipmentOrder( **request_data, _soapheaders=[header_value] ) # 打印返回结果 print(response) # 可以从response中提取状态、运单号、面单URL
内容的提问来源于stack exchange,提问作者Georg
相关产品推荐
相关产品推荐

