壳牌 B2B 移动通行费交易数据 API - 快速入门指南
API 版本: 1.0.0 | 身份验证: OAuth 2.0 | 状态: 生产环境
概述
壳牌 B2B 移动出行过路费交易数据 API 是一个基于 REST 的 API,为壳牌移动出行客户提供对过路费交易记录及相关数据的全面访问权限。 该 API 使开发人员能够通过编程方式检索、筛选和分析通行费交易数据,以满足账户对账、账单核验、费用管理及合规要求。
主要功能
- 按账号检索通行费交易数据
- 按日期范围(起始日期和结束日期)筛选交易
- 按发票状态和车辆登记号(VRN) (车辆登记号)
- 支持按多个字段进行高级排序
- 支持对大型数据集进行分页
- 灵活的字段筛选功能,可优化响应负载
- 包括进出点在内的全面通行费详情
- 支持多个收费网络和运营商
身份验证
OAuth 2.0(标准身份验证方法)
Shell 收费交易数据 API 使用 OAuth 2.0 客户端凭据流程 进行安全身份验证。
OAuth 2.0 流程
步骤 1: 获取访问令牌
向 OAuth 令牌端点请求访问令牌:
POST /oauth/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials&client_id=您的客户端 ID&client_secret=您的客户端密钥
步骤 2:在 API 请求中使用访问令牌
Authorization: Bearer Content-Type: application/json RequestId: eb621f45-a543-4d9a-a934-2f223b263c42
令牌管理
令牌管理最佳实践:
- 访问令牌的有效期有限(通常为 15 分钟)
- 实现令牌缓存以避免不必要的令牌请求
- 在过期前刷新令牌,以确保服务不中断
- 切勿泄露 client_secret 或将其嵌入客户端代码
运行环境
该 API 提供两种运行环境:
| 环境 | 基础 URL | 用途 |
|---|---|---|
| 生产环境 | https://api.shell.com/toll-data/v1 | 正式生产环境 |
| 测试(UAT) | https://api-test.shell.com/toll-data/v1 | 测试与开发环境 |
OAuth 令牌 URL:
| 环境 | 令牌 URL |
|---|---|
| 生产环境 | https://api.shell.com/v2/oauth/token |
| 测试(UAT) | https://api-test.shell.com/v2/oauth/token |
提示: 在将系统迁移到生产环境之前,请务必在 测试环境 中测试您的集成。
快速入门
1. 获取您的 OAuth 凭据
- 联系 Shell 技术支持
- 申请 OAuth 2.0 凭据(client_id 和 client_secret)
- 查看 服务条款
2. 获取访问令牌
首先,获取您的 OAuth 访问令牌:
cURL 示例:
curl -X POST https://api-test.shell.com/v2/oauth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=您的客户端 ID&client_secret=您的客户端密钥"
响应:
{
"access_token": "eyJhbGciOi*******5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 899
}3. 发送您的第一个 API 请求
示例: 查询通行费交易
cURL 示例:
curl -X POST https://api-test.shell.com/toll-data/v1/transactions/search \
-H "Authorization: Bearer eyJhbGci******NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-H "RequestId: eb621f45-a543-4d9a-a934-2f223b263c42" \
-d '{
"Filters": {
"ColCoCode": 86,
"PayerNumber": "NL20016398",
"AccountNumber": "NL20027701",
"Filter": "All",
"FromDate": "2026-01-01",
"ToDate": "2026-01-31"
},
"Page": 1,
"PageSize": 10
}'响应示例:
{
"RequestId": "eb621f45-a543-4d9a-a934-2f223b263c42",
"Status": "SUCCESS",
"Page": 1,
"TotalRecords": 150,
"TotalPages": 15,
"PageSize": 10,
"Data": [
{
"NetworkDescription": "Societa Autostradali",
"TollChargerCode": "410|610",
"DelcoCode": "714",
"DelcoName": "Shell Fleet Solutions Consorzio",
"网络代码": "TLI",
"网络": "euroShell Consortio",
"购买国家": "意大利",
"购买国家代码": "IT",
"卡号": "707737*******334272",
"卡号": 123456789,
"卡组名称": "Shell Fleet Solutions Consorzio",
"车辆注册号": "KN 00000",
"成本中心": "100",
"系统录入日期": "20260123",
"系统录入时间": "13:14:25",
"交易日期": "20260120",
"交易时间": "10:30:00",
"过账日期": "20260123",
"过账时间": "00:00:00",
"付款人编号": "NL20016398",
"账号": "NL20027701",
"账户名称": "测试账户名称",
"开始日期": "20260120",
"开始时间": "06:47:41",
"结束日期": "20260120",
"结束时间": "07:30:15",
"收费站入口": "ROMA NORD",
"收费站出口": "BRENNERO",
"行驶距离": "71.6",
"路线描述": "ROMA NORD - BRENNERO",
"交易类型": "道路税",
"产品代码": "14",
"产品描述": "道路税",
"交易净金额": "127.1",
"交易税额": "0.0",
"交易总金额": "127.1",
"交易货币代码": "EUR",
"交易状态": "报送中",
"发票编号": "8600397548",
"发票日期": "20260125",
"发票状态": "已开票",
"支付方式": "后付费",
"OBU序列号": "00049000000836932426",
"排放标准": "欧6",
"合同ID": "fb75eb53-46eb-450b-862e-6045002c3fa8",
"ShellTransactionID": "04176c5c-e7b2-49c8-bcb3-23d07ba583f2",
"TollOperator": "Toll4Europe",
"TollDomain": "Toll4Europe",
"TariffRelevantInformation": "车辆类别:2,轴数:2,道路类别:高速公路",
"AdditionalTransactionInfo": "位置:1",
"TCInvoiceNumber": "12343343",
"TCInvoiceDate": "20260123"
}
]
}API 端点参考
通行费交易
| 端点 | 方法 | 描述 |
|---|---|---|
| /toll-data/v1/transactions/search | POST | 通过灵活的筛选和分页功能检索通行费交易数据 |
常见用例:
- 按日期范围检索通行费交易记录
- 按发票状态筛选(已开票、未开票、全部)
- 按车辆注册号 (VRN) 搜索
- 按卡组筛选
- 按多个条件排序交易记录
- 选择特定字段以优化响应大小
常见用例
本节将常见业务场景与 API 使用模式进行映射,以帮助您快速确定如何根据 API以满足您的具体需求。
用例 1:每日通行费交易对账
场景: 出于会计核算目的,您需要每天对车队中的所有通行费交易进行对账。
推荐API: /toll-data/v1/transactions/search
为何选择此 API: 该端点提供全面的通行费交易详情,支持灵活的日期筛选,同时涵盖已开票和未开票交易,并针对大型数据集提供分页功能。非常适合日常对账工作流程。
关键参数:
FromDate和ToDate- 进行每日对账时,请设置为昨天的日期Search.InvoiceStatus- 选择“全部”以同时包含已开票和未开票的交易PageSize- 设置为 100 以实现高效的数据检索Filter- 选择“全部”以获取完整的交易详情
用例 2:发票验证与核查
场景: 您收到一张发票,需要核查所有通行费交易详情及收费情况。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 提供详细的通行费交易信息,包括发票编号、日期、金额和通行费网络详情。 由于其结构与发票格式完全匹配,因此非常适合用于发票验证。
关键参数:
Search.InvoiceStatus- 设置为“Invoiced”仅检索已开具发票的交易FromDate和ToDate- 设置为发票周期日期筛选- 指定“InvoiceNumber、InvoiceDate、TransactionGrossAmount”等字段以进行针对性验证
用例 3:车队车辆过路费使用情况分析
场景: 您需要分析车队中特定车辆的过路费使用模式,以优化路线并降低过路费成本。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 支持按车辆登记号 (VRN) 进行筛选,并提供包括进出站、行驶里程和过路费在内的详细路线信息。非常适合进行车辆级别的分析。
关键参数:
Search.VehicleRegistrationNumber- 指定待分析的 VRN起始日期和结束日期- 设置为分析时间段(例如,最近 30 天)排序选项- 选择 1(按交易日期升序)进行时间顺序分析筛选条件- 包含“RouteDescription、DistanceDriven、TollGateEntry、 TollGateExit、TransactionGrossAmount”等字段
用例 4:卡组费用追踪
场景: 您管理多个卡组,需要按卡组追踪过路费支出,以便进行预算分配和成本中心报表编制。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 支持按卡组筛选,并包含成本中心信息,非常适合在卡组层面进行费用追踪和报表编制。
关键参数:
Search.CardGroup- 指定卡组名称,或使用“All”查询所有卡组起始日期和结束日期- 设置为报表周期筛选条件- 包含“CardGroupName、CostCenter、TransactionGrossAmount、TransactionNetAmount、TransactionTax”排序选项- 采用“ (按交易金额升序)进行费用分析
用例 5:多账户通行费报表
场景: 您管理多个账户,需要生成涵盖所有账户的合并通行费报表。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 支持在单次请求中查询多个账户(建议 2-5 个),从而减少 API 调用次数,并提升多账户场景下的性能
关键参数:
AccountNumber- 提供以逗号分隔的账户号码(为获得最佳性能,建议数量为2-5个)FromDate和ToDate- 设置为报表周期PageSize- 为获得更佳性能,请使用较大的页长(例如 100-500)
用例 6: 未开票交易监控
场景: 您希望监控未开票的通行费交易,以预测即将开具的发票并管理现金流。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 支持按发票状态进行筛选,便于识别未开票交易并估算即将产生的费用。
关键参数:
Search.InvoiceStatus- 设置为“Uninvoiced”以获取待计费交易起始日期和结束日期- 设置为当前计费周期筛选条件- 包含“交易日期、交易总金额、账号、车辆登记号”
用例 7:收费网络使用情况分析
场景: 您需要分析车队最常使用的收费网络和运营商,以便协商更优惠的费率或优化路线。
推荐 API: /toll-data/v1/transactions/search
为何选择此 API: 该 API 提供详细的收费网络信息,包括网络描述、收费运营商、收费代码和网络代码,非常适合进行网络使用情况分析。
关键参数:
FromDate和ToDate— 设置为分析周期(例如, 季度)筛选条件- 包含“NetworkDescription、TollOperator、TollChargerCode、Network、TransactionGrossAmount”PageSize- 采用更大的页长以实现全面的数据提取
使用示例
示例 1:按账户和日期范围搜索过路费交易
请求:
POST /toll-data/v1/transactions/search
{
"Filters": {
"ColCoCode": 86,
"PayerNumber": "NL20016398",
"AccountNumber": "NL20027701",
"Filter": "All",
"FromDate": "2026-01-01",
"ToDate": "2026-01-31"
},
"Page": 1,
"PageSize": 10
}响应:
{
"RequestId": "eb621f45-a543-4d9a-a934-2f223b263c42",
"Status": "SUCCESS",
"Page": 1,
"TotalRecords": 150,
"TotalPages": 15,
"PageSize": 10,
"Data": [
{
"NetworkDescription": "Societa Autostradali",
"TollChargerCode": "410|610",
"DelcoCode": "714",
"DelcoName": "Shell Fleet Solutions Consorzio",
"NetworkCode": "TLI",
"Network": "euroShell Consortio",
"PurchasedInCountry": "Italy",
"购买国家代码": "IT",
"卡号": "707737*******334272",
"CardId": 123456789,
"CardGroupName": "Shell Fleet Solutions Consorzio",
"VehicleRegistration": "KN 00000",
"成本中心": "100",
"系统录入日期": "20260123",
"系统录入时间": "13:14:25",
"交易日期": "20260120",
"交易时间": "10:30:00",
"过账日期": "20260123",
"过账时间": "00:00:00",
"付款人编号": "NL20016398",
"账号": "NL20027701",
"账户名称": "测试账户名称",
"开始日期": "20260120",
"开始时间": "06:47:41",
"结束日期": "20260120",
"结束时间": "07:30:15",
"入口收费站": "ROMA NORD",
"出口收费站": "BRENNERO",
"行驶距离": "71.6",
"路线描述": "ROMA NORD - BRENNERO",
"交易类型": "道路税",
"产品代码": "14",
"产品描述": "道路税",
"交易净额": "127.1",
"交易税额": "0.0",
"交易总额": "127.1",
"交易货币代码": "EUR",
"交易状态": "报告中",
"发票编号": "8600397548",
"发票日期": "20260125",
"发票状态": "已开票",
"付款方式": "后付",
"OBU序列号": "00049000000836932426",
"排放标准": "欧6",
"合同ID": "fb75eb53-46eb-450b-862e-6045002c3fa8",
"ShellTransactionID": "04176c5c-e7b2-49c8-bcb3-23d07ba583f2",
"TollOperator": "Toll4Europe",
"TollDomain": "Toll4Europe",
"TariffRelevantInformation": "车辆类别:2,轴数:2,道路类别: 高速公路",
"AdditionalTransactionInfo": "位置:1",
"TCInvoiceNumber": "12343343",
"TCInvoiceDate": "20260123"
}
]
}示例 2:按车辆注册号 (VRN) 筛选交易
请求:
POST /toll-data/v1/transactions/search
{
"筛选条件": {
"ColCoCode": 86,
"PayerNumber": "NL20016398",
"AccountNumber": "NL20027701",
"Filter": "车辆注册号, 路线描述, 交易总金额, 交易日期",
"起始日期": "2026-01-01",
"结束日期": "2026-03-31",
"Search": {
"VehicleRegistrationNumber": "KN 00000",
"InvoiceStatus": "All"
}
},
"Page": 1,
"PageSize": 50
}响应:
{
"RequestId": "9d2dee33-7803-485a-a2b1-2c7538e597ee",
"Status": "SUCCESS",
"Page": 1,
"TotalRecords": 45,
"TotalPages": 1,
"PageSize": 50,
"Data": [
{
"VehicleRegistration": "KN 00000",
"RouteDescription": "ROMA NORD - BRENNERO",
"TransactionGrossAmount": "127.1",
"交易日期": "20260120"
},
{
"车辆牌照": "KN 00000",
"路线描述": "米兰东站 - 维罗纳南",
"交易总金额": "85.4",
"交易日期": "20260125"
}
]
}示例 3:按卡组搜索
请求:
POST /toll-data/v1/transactions/search
{
"Filters": {
"ColCoCode": 86,
"PayerNumber": "NL20016398",
"AccountNumber": "NL20027701",
"Filter": "CardGroupName, VehicleRegistration, TransactionGrossAmount, TransactionDate",
"FromDate": "2026-01-01",
"ToDate": "2026-01-31",
"Search": {
"CardGroup": "Shell Fleet Solutions Consorzio",
"InvoiceStatus": "All"
}
},
"Page": 1,
"PageSize": 30
}响应:
{
"RequestId": "5f1bded6-416d-4478-ab7f-33905d7b5d4b",
"Status": "SUCCESS",
"Page": 1,
"TotalRecords": 87,
"TotalPages": 3,
"PageSize": 30,
"Data": [
{
"CardGroupName": "Shell Fleet Solutions Consorzio",
"VehicleRegistration": "KN 00000",
"交易总金额": "127.1",
"交易日期": "20260120"
},
{
"CardGroupName": "Shell Fleet Solutions Consorzio",
"VehicleRegistration": "LM 11111",
"TransactionGrossAmount": "95.8",
"TransactionDate": "20260122"
}
]
}示例 4:包含特定字段的多个账户
请求:
POST /toll-data/v1/transactions/search
{
"Filters": {
"ColCoCode": 86,
"PayerNumber": "NL20016398",
"AccountNumber": "NL20027701, NL20027702",
"Filter": "AccountNumber, AccountName, TransactionDate, TransactionGrossAmount, VehicleRegistration",
"FromDate": "2026-01-01",
"ToDate": "2026-01-31"
},
"Page": 1,
"PageSize": 100
}响应:
{
"RequestId": "eb621f45-a543-4d9a-a934-2f223b263c42",
"Status": "SUCCESS",
"Page": 1,
"TotalRecords": 245,
"TotalPages": 3,
"PageSize": 100,
"Data": [
{
"AccountNumber": "NL20027701",
"AccountName": "测试账户名称",
"TransactionDate": "20260120",
"TransactionGrossAmount": "127.1",
"车辆登记号": "KN 00000"
},
{
"账号": "NL20027702",
"AccountName": "第二个账户名称",
"TransactionDate": "20260121",
"TransactionGrossAmount": "98.5",
"VehicleRegistration": "PQ 22222"
}
]
}错误处理
常见错误代码
| HTTP 状态 | 错误代码 | 描述 | 解决方案 |
|---|---|---|---|
| 200 | 不适用 | 状态:成功 | 不适用 |
| 400 | E0001 | 验证错误 | 检查请求参数,确保必填字段已提供且有效 |
| 401 | E0003 | 未授权 | 验证 OAuth 令牌是否有效且未过期 |
| 404 | E0005 | 未找到 | 请验证端点 URL 及资源是否存在 |
| 500 | E0002 | 未知错误 / 内部服务器错误 | 请携带 RequestId 联系支持团队 |
| 503 | E0012 | 服务不可用 / 连接错误 | 稍后重试,若问题仍存在请联系支持团队 |
错误响应示例
验证错误 (E0001):
{
"RequestId": "eb621f45-a543-4d9a-a934-2f223b263c42",
"Status": "FAILED",
"Errors": [
{
"Code": "E0001",
"Title": "验证错误",
"Detail": "以下字段的值缺失或无效:ColCoCode",
"AdditionalInfo": null
}
]
}未授权错误 (E0003):
{
"RequestId": "eb621f45-a543-4d9a-a934-2f223b263c42",
"Status": "FAILED",
"Errors": [
{
"Code": "E0003",
"Title": "未授权",
"Detail": "提供的凭据无效,或者用户无权执行该操作",
"AdditionalInfo": null
}
]
}最佳实践
1. 使用 OAuth 2.0 身份验证
重要提示: 请始终使用 OAuth 2.0 身份验证。实施正确的令牌管理:
- 缓存 访问令牌并重复使用直至过期
- 在令牌过期前进行刷新(建议提前 60 秒)
- 安全存储客户端凭证(使用环境变量或密钥管理器)
- 切勿在客户端端代码中记录或泄露访问令牌
2. 始终包含 RequestId
请务必在请求头中包含唯一的 RequestId(UUID 格式),以确保端到端可追溯性。这对故障排除和技术支持至关重要。
3. 实现错误处理
实现稳健的错误处理:
- 检查每个响应中的 Status 字段
- 记录 RequestId 以供故障排查
- 针对临时错误(503)实现重试逻辑
- 通过检查输入参数处理验证错误 (E0001)
支持与资源
技术支持
- 支持: Shell 技术支持
- 电子邮件: api@shell.com
文档
获取帮助
联系支持时,请提供:
- 您的 client_id(切勿透露您的 client_secret 或访问令牌)
- API 响应中的 RequestId
- 请求的时间戳
- 环境(生产/测试)
- 收到的错误代码和消息
最后更新时间: 2026年8月4日
文档版本: 1.0
API 版本: 1.0.0
