计量事件
计量事件用于报告按用量计费的使用情况。每个事件代表特定客户和计量器的单次使用实例。然后,这些事件将被处理,从客户的信用余额中扣除。此 API 允许您报告使用事件、检索其历史记录以及获取聚合统计信息。
在报告事件之前,您应定义一个计量器。有关更多信息,请参阅 计量器 API 参考。
计量事件对象#
计量事件对象代表一个已记录的单一使用事件。它包含有关用量、客户及其处理状态的详细信息。
属性 | 类型 | 描述 |
|---|---|---|
|
| 计量事件的唯一标识符。 |
|
| 事件的名称,与已定义的计量器相对应。 |
|
| 包含事件核心详细信息的对象。 |
|
| 与此使用事件关联的客户 ID。 |
|
| 要报告的使用量。 |
|
| (可选)此用量关联的订阅 ID。 |
|
| 事件的唯一标识符,用于幂等性。防止重复提交事件。 |
|
| 事件发生时的 Unix 时间戳。 |
|
| 如果事件在生产模式下创建,则为 |
|
| 事件的处理状态。可以是 |
|
| (可选)事件成功处理时的 Unix 时间戳。 |
|
| 此事件已尝试处理的次数。 |
|
| (可选)下一次计划处理尝试的 Unix 时间戳。 |
|
| 此事件处理后消耗的信用额度。 |
|
| 此事件待消耗的信用额度。 |
|
| (可选)可以附加到事件对象的一组键值对。 |
|
| 事件的创建方式。可以是 |
|
| 事件记录的创建时间戳。 |
|
| 事件记录的最后更新时间戳。 |
创建事件#
向计量器报告一个使用事件。为确保事件不会被重复计算,您必须为每个事件提供一个唯一的 identifier。
参数
参数 | 类型 | 描述 |
|---|---|---|
|
| 您要为其报告用量的计量器的名称。 |
|
| 使用事件的详细信息。 |
|
| 触发事件的客户 ID。 |
|
| 要报告的使用数量。 |
|
| (可选)此用量应归属的订阅。 |
|
| 用于防止重复事件的唯一字符串。我们建议使用 V4 UUID。 |
|
| (可选)表示用量发生时间的 Unix 时间戳(以秒为单位)。如果未提供,则默认为当前时间。 |
|
| (可选)与事件一起存储的键值数据。 |
返回
新创建的计量事件对象。
import payment from '@blocklet/payment-js';
async function reportUsage() {
try {
const meterEvent = await payment.meterEvents.create({
event_name: 'api_calls',
identifier: 'unique-event-id-12345',
timestamp: Math.floor(Date.now() / 1000),
payload: {
customer_id: 'cus_xxxxxxxxxxxxxx',
value: '100',
subscription_id: 'sub_xxxxxxxxxxxxxx'
},
metadata: {
region: 'us-east-1'
}
});
console.log('计量事件已创建:', meterEvent.id);
} catch (error) {
console.error('创建计量事件时出错:', error.message);
}
}
reportUsage();响应示例
{
"id": "mevt_xxxxxxxxxxxxxx",
"event_name": "api_calls",
"payload": {
"customer_id": "cus_xxxxxxxxxxxxxx",
"value": "100",
"subscription_id": "sub_xxxxxxxxxxxxxx"
},
"identifier": "unique-event-id-12345",
"timestamp": 1678886400,
"livemode": false,
"status": "pending",
"processed_at": null,
"attempt_count": 0,
"next_attempt": 1678886460,
"credit_consumed": "0",
"credit_pending": "100",
"metadata": {
"region": "us-east-1"
},
"created_via": "api",
"created_at": "2023-03-15T12:00:00.000Z",
"updated_at": "2023-03-15T12:00:00.000Z"
}检索事件#
通过其唯一 ID 检索现有计量事件的详细信息。
参数
Parameter | Type | Description |
|---|---|---|
|
| 要检索的计量事件的唯一标识符。 |
返回
计量事件对象。
import payment from '@blocklet/payment-js';
async function getMeterEvent(eventId) {
try {
const meterEvent = await payment.meterEvents.retrieve(eventId);
console.log('已检索计量事件:', meterEvent);
} catch (error) {
console.error('检索计量事件时出错:', error.message);
}
}
getMeterEvent('mevt_xxxxxxxxxxxxxx');响应示例
{
"id": "mevt_xxxxxxxxxxxxxx",
"event_name": "api_calls",
"payload": {
"customer_id": "cus_xxxxxxxxxxxxxx",
"value": "100",
"subscription_id": "sub_xxxxxxxxxxxxxx"
},
"identifier": "unique-event-id-12345",
"timestamp": 1678886400,
"livemode": false,
"status": "completed",
"processed_at": 1678886405,
"attempt_count": 1,
"next_attempt": null,
"credit_consumed": "100",
"credit_pending": "0",
"metadata": {
"region": "us-east-1"
},
"created_via": "api",
"created_at": "2023-03-15T12:00:00.000Z",
"updated_at": "2023-03-15T12:00:05.000Z"
}列出事件#
返回计量事件的分页列表,可通过各种参数进行筛选。
参数
Parameter | Type | Description |
|---|---|---|
|
| (可选)按计量器名称筛选事件。 |
|
| (可选)按计量器 ID 筛选事件。 |
|
| (可选)筛选特定客户的事件。 |
|
| (可选)一个 Unix 时间戳,用于筛选在此时间或之后创建的事件。 |
|
| (可选)一个 Unix 时间戳,用于筛选在此时间之前创建的事件。 |
|
| (可选)按生产模式或测试模式筛选。 |
|
| (可选)用于筛选事件的搜索查询。 |
|
| (可选)用于分页的页码,从 1 开始。 |
|
| (可选)每页的项目数。默认为 20。 |
返回
一个分页对象,包含项目总数 count 和计量事件对象列表 list。
import payment from '@blocklet/payment-js';
async function listCustomerEvents(customerId) {
try {
const events = await payment.meterEvents.list({
customer_id: customerId,
pageSize: 5
});
console.log(`为客户找到 ${events.count} 个事件。`);
events.list.forEach(event => {
console.log(`- 事件 ID: ${event.id}, 状态: ${event.status}`);
});
} catch (error) {
console.error('列出计量事件时出错:', error.message);
}
}
listCustomerEvents('cus_xxxxxxxxxxxxxx');响应示例
{
"count": 15,
"list": [
{
"id": "mevt_xxxxxxxxxxxxxx",
"event_name": "api_calls",
"status": "completed",
"value": "100",
"timestamp": 1678886400
},
{
"id": "mevt_yyyyyyyyyyyyyy",
"event_name": "data_storage",
"status": "completed",
"value": "50",
"timestamp": 1678883200
}
]
}获取统计信息#
检索特定计量器在给定时间范围内的聚合统计信息。这对于构建仪表盘和报告非常有用。
参数
Parameter | Type | Description |
|---|---|---|
|
| 要检索统计信息的计量器 ID。 |
|
| 时间范围起点的 Unix 时间戳。 |
|
| 时间范围终点的 Unix 时间戳。 |
|
| (可选)筛选特定客户的统计信息。 |
|
| (可选)统计信息的粒度。可以是 |
返回
一个分页对象,包含 MeterEventStats 对象列表。列表中的每个对象代表指定粒度的一个数据点。
MeterEventStats 对象
属性 | 类型 | 描述 |
|---|---|---|
|
| 聚合数据点的日期(例如 '2023-03-15')。 |
|
| 该时段开始的 Unix 时间戳。 |
|
| 此期间内的事件总数。 |
|
| 此期间内所有事件 |
import payment from '@blocklet/payment-js';
async function getMeterStats(meterId) {
try {
const oneMonthAgo = Math.floor(Date.now() / 1000) - 30 * 24 * 60 * 60;
const now = Math.floor(Date.now() / 1000);
const stats = await payment.meterEvents.stats({
meter_id: meterId,
start: oneMonthAgo,
end: now,
granularity: 'day'
});
console.log('过去 30 天的每日统计:');
stats.list.forEach(stat => {
console.log(`${stat.date}: 来自 ${stat.event_count} 个事件的 ${stat.total_value} 用量`);
});
} catch (error) {
console.error('获取计量器统计信息时出错:', error.message);
}
}
getMeterStats('mtr_xxxxxxxxxxxxxx');响应示例
{
"count": 30,
"list": [
{
"date": "2023-03-15",
"timestamp": "1678838400",
"event_count": 120,
"total_value": "12000"
},
{
"date": "2023-03-14",
"timestamp": "1678752000",
"event_count": 110,
"total_value": "11000"
}
]
}获取待处理金额#
计算给定客户或订阅的待处理计量事件的总价值,按货币分组。
参数
Parameter | Type | Description |
|---|---|---|
|
| (可选)用于筛选的订阅 ID。 |
|
| (可选)用于筛选的客户 ID。 |
|
| (可选)用于计算待处理金额的货币。 |
返回
一个 PendingAmountSummary 对象。
PendingAmountSummary 对象
属性 | 类型 | 描述 |
|---|---|---|
|
| 待处理金额的货币。 |
|
| 所有待处理事件的总价值。 |
|
| 待处理事件的数量。 |
import payment from '@blocklet/payment-js';
async function checkPendingAmount(subscriptionId) {
try {
const summary = await payment.meterEvents.pendingAmount({
subscription_id: subscriptionId
});
console.log(`订阅的待处理金额: ${summary.total_pending} ${summary.currency_id}`);
} catch (error) {
console.error('获取待处理金额时出错:', error.message);
}
}
checkPendingAmount('sub_xxxxxxxxxxxxxx');响应示例
{
"currency_id": "ucrd_xxxxxxxx",
"total_pending": "500",
"count": 5
}通过计量事件报告用量后,您可以通过信用额度管理客户如何支付此用量。要了解如何向客户发放信用额度,请参阅 信用额度发放 API 参考。