如何在单个 App ID 下追踪各客户的交易用量?
结论
如果所有请求都使用同一个 App ID,而 HERE 的用量报表又没有客户维度,就无法仅凭汇总数据准确区分各客户的交易量。
App ID 用来标识应用或项目,无法标识最终客户。多个客户共用一套凭据时,HERE 会将这些请求归入同一个计费主体。按客户结算时,最好为每位客户分配独立凭据。合同或平台配置不允许这样做的,则要在自己的系统中记录客户身份和调用情况。
为客户分配独立凭据
先向 HERE 的商务或技术支持确认,当前合同是否允许在同一账户或合同下创建多个 App ID、API key 或项目。如果允许,建议为每位客户分配独立凭据:
customer-a -> credential-a
customer-b -> credential-b
customer-c -> credential-c
这样可以直接按凭据汇总用量。发生凭据泄露、客户停用或异常流量时,也可以单独处理对应的凭据。
能否创建多个凭据、每套凭据是否会单独出现在用量报表中,以及这是否会影响许可费用,都应以合同约定和 HERE 当前控制台提供的功能为准。
必须共用 App ID 时如何处理
如果所有客户必须共用一个 App ID,就要在自己的业务系统中记录客户级用量。
每次请求至少应记录:
- 内部
tenantId或customerId - HERE 服务类型
- 请求时间
- 请求结果
- 应用生成的唯一请求编号
- 是否发生重试
- 对账所需的计费分类
检索、路径规划等由后端发起的请求,可以统一通过自己的服务端调用 HERE。例如,可以使用下面这个简化的 Node.js 包装函数:
import { randomUUID } from 'node:crypto';
async function callHere({
tenantId,
service,
url,
init = {}
}) {
const usageId = randomUUID();
const startedAt = new Date();
try {
const response = await fetch(url, init);
await usageLog.write({
usageId,
tenantId,
service,
startedAt,
finishedAt: new Date(),
httpStatus: response.status,
outcome: 'response'
});
return response;
} catch (error) {
await usageLog.write({
usageId,
tenantId,
service,
startedAt,
finishedAt: new Date(),
outcome: 'network_error',
errorName: error.name
});
throw error;
}
}
调用时,应从经过认证的服务端会话中读取 tenantId,不要直接采用浏览器提交的客户编号:
const response = await callHere({
tenantId: req.auth.tenantId,
service: 'routing',
url: hereRequestUrl,
init: {
method: 'GET'
}
});
一条 HTTP 请求未必对应一个 HERE 计费 transaction。HERE 可能根据接口、资源类型、请求结果或合同约定采用不同的计算方式。因此,usageLog 的统计规则应按合同中的 transaction 定义配置,不能直接把请求总数作为账单数量。
JavaScript 地图请求的限制
HERE Maps API for JavaScript 通常由浏览器直接请求地图资源。如果请求没有经过业务后端,服务端包装函数就无法记录每次实际调用。
前端可以记录地图初始化、页面打开和客户会话等业务事件:
navigator.sendBeacon(
'/telemetry/map-session',
JSON.stringify({
tenantId,
event: 'map_initialized',
occurredAt: new Date().toISOString()
})
);
这些数据可以用来分析客户活跃度,但不能直接作为 HERE 的计费 transaction。浏览器缓存、地图平移和缩放、资源重试及 SDK 的内部加载策略,都可能导致业务事件数与计费数量不一致。前端上报也可能被拦截或篡改,因此不适合作为唯一的结算依据。
也不要自行给 HERE 请求添加 customerId 查询参数,并认定它会出现在 HERE 的计费报表中。除非 HERE 明确支持将该参数作为报表维度,否则它可能被忽略、被拒绝,或者只被当作普通请求参数处理。
对账方式
如果只能取得 App ID 级别的账单,可以按计费周期核对内部日志和 HERE 汇总数据:
内部记录总量 = customer-a + customer-b + customer-c
HERE 账单总量 = 该 App ID 的计费 transactions
如果两者不一致,应检查缓存、失败请求、自动重试、客户端直连流量和 transaction 的计算口径。
也可以按照内部计数的占比分摊总账单:
客户分摊量 = HERE 账单总量 × 客户内部计数 ÷ 所有客户内部计数
这只是一种成本分摊模型。内部计数与 HERE 的计费规则一致时,分摊结果才可能接近实际交易量,不能将其视为 HERE 提供的精确客户级统计。
注意事项
- 先确认合同中 transaction 的准确定义,以及失败请求、缓存命中、地图资源加载和重试是否计费。
- 客户身份应以服务端认证结果为准,不要使用客户端可随意修改的
customerId。 - 日志中不要保存非必要的坐标、搜索词或个人信息。
- 记录完整的重试链路,以免同一业务操作被重复计费。
- 除非 HERE 的许可条款和技术方案明确允许,否则不要为了统计用量而代理地图资源。
- 前端凭据无法像服务端密钥一样保密。应使用平台支持的来源限制、域名限制或其他凭据保护措施。这些措施只能降低滥用风险,无法实现客户级计量。
- 如果客户级数据会直接用于开票,独立凭据通常比共用 App ID 后自行估算更便于审计。
备注:内容仅供参考。
