市场按流量计费 API

当发布者为要在合作伙伴中心发布的产品/服务创建自定义计量维度时,应使用按流量计费 API。 如果购买的任何产品/服务具有一项或多项计划包含用于发出使用事件的自定义维度,则需要与按流量计费 API 集成。

重要

必须跟踪代码中的使用情况,并且仅针对高于基准费用的使用量向 Microsoft 发送使用情况事件。

要详细了解如何创建适用于 SaaS 的自定义计量维度,请参阅 SaaS 按流量计费

要详细了解如何使用托管应用计划为 Azure 应用程序产品/服务创建自定义计量维度,请参阅配置 Azure 应用程序产品/服务设置详细信息

强制使用 TLS 1.2 说明

我们强制要求使用 TLS 1.2 版本作为 HTTPS 通信的最低版本。 请确保在代码中使用此 TLS 版本。 TLS 1.0 和 1.1 版本已弃用,连接尝试将被拒绝。

按流量计费的单一使用事件

发布者应调用使用事件 API,以针对为特定客户所购计划(订阅的)活动资源发出使用事件。 发布产品/服务时,将为发布者定义的计划的每个自定义维度分别发出使用事件。

在一个日历日中,针对每个资源和维度每小时只可发出一个使用事件。 如果在一小时内使用了多个单位,则累积该小时内使用的所有单位,然后在一个事件中将其发出。 只能发出最近 24 小时内的使用事件。 如果在 8:00 到 8:59:59 之间的任何时刻发出一个使用事件(且它被接受)然后在当天 8:00 到 8:59:59 之间又发送了一个事件,它将因为重复而被拒绝。

POST: https://marketplaceapi.microsoft.com/api/usageEvent?api-version=<ApiVersion>

查询参数

参数 建议
ApiVersion 使用 2018-08-31。

请求标头:

Content-type 使用 application/json
x-ms-requestid 用于跟踪来自客户端的请求的唯一字符串值,最好是 GUID。 如果未提供此值,则系统会生成一个值,并在响应标头中提供该值。
x-ms-correlationid 客户端上的操作的唯一字符串值。 此参数将来自客户端操作的所有事件与服务器端的事件关联起来。 如果未提供此值,将在响应标头中生成并提供一个值。
authorization 唯一的访问令牌,用于标识发出此 API 调用的 ISV。 格式是 "Bearer <access_token>" 发布者检索令牌值时,如 所述

请求正文示例:

{
  "resourceId": <guid>, // unique identifier of the resource against which usage is emitted. 
  "quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
  "dimension": "dim1", // custom dimension identifier
  "effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, from now and until 24 hours back
  "planId": "plan1", // id of the plan purchased for the offer
}

对于 Azure 应用程序托管应用计划,resourceId 是托管应用 resource group Id。 可在使用 Azure 管理的标识令牌中找到用于提取它的示例脚本。

对于 SaaS 产品/服务,resourceId 是 SaaS 订阅 ID。 有关 SaaS 订阅的更多详细信息,请参阅列出订阅

响应

代码:200
没问题。 Microsoft 端已接受并记录发出的使用情况,供进一步处理和计费。

响应有效负载示例:

{
  "usageEventId": <guid>, // unique identifier associated with the usage event in Microsoft records
  "status": "Accepted" // this is the only value in case of single usage event
  "messageTime": "2020-01-12T13:19:35.3458658Z", // time in UTC this event was accepted
  "resourceId": <guid>, // unique identifier of the resource against which usage is emitted. For SaaS it's the subscriptionId.
  "quantity": 5.0, // amount of emitted units as recorded by Microsoft
  "dimension": "dim1", // custom dimension identifier
  "effectiveStartTime": "2018-12-01T08:30:14", // time in UTC when the usage event occurred, as sent by the ISV
  "planId": "plan1", // id of the plan purchased for the offer
}

代码:400
请求错误。

  • 未提供请求数据或提供了无效数据。
  • effectiveStartTime 是在 24 小时前。 事件已过期。
  • SaaS 订阅未处于“已订阅”状态。

响应有效负载示例:

{
  "message": "One or more errors have occurred.",
  "target": "usageEventRequest",
  "details": [
    {
      "message": "The resourceId is required.",
      "target": "ResourceId",
      "code": "BadArgument"
    }
  ],
  "code": "BadArgument"
}

代码:403

已禁止。 未提供授权令牌,令牌无效或已过期。 或者,该请求尝试访问使用与用于创建授权令牌的套餐不同的Microsoft Entra 应用 ID 发布的套餐的订阅。

代码:409
冲突。 已成功报告了指定资源 ID、有效使用日期和时间的使用事件。

响应有效负载示例:

{
  "additionalInfo": {
    "acceptedMessage": {
      "usageEventId": "<guid>", //unique identifier associated with the usage event in Microsoft records
      "status": "Duplicate",
      "messageTime": "2020-01-12T13:19:35.3458658Z",
      "resourceId": "<guid>", //unique identifier of the resource against which usage is emitted.
      "quantity": 1.0,
      "dimension": "dim1",
      "effectiveStartTime": "2020-01-12T11:03:28.14Z",
      "planId": "plan1"
    }
  },
  "message": "This usage event already exist.",
  "code": "Conflict"
}

按流量计费的批量使用事件

通过批量使用事件 API,可一次性发出多项已购资源的使用事件。 它还允许你为同一资源发出多个使用事件,前提是它们适用于不同的日历小时数。 一个批次中的最大事件数为 25。

POST: https://marketplaceapi.microsoft.com/api/batchUsageEvent?api-version=<ApiVersion>

查询参数

参数 建议
ApiVersion 使用 2018-08-31。

请求标头:

Content-type 使用 application/json
x-ms-requestid 用于跟踪来自客户端的请求的唯一字符串值,最好是 GUID。 如果未提供此值,则系统会生成一个值,并在响应标头中提供该值。
x-ms-correlationid 客户端上的操作的唯一字符串值。 此参数将来自客户端操作的所有事件与服务器端的事件关联起来。 如果未提供此值,则系统会生成一个值,并在响应标头中提供该值。
authorization 唯一的访问令牌,用于标识发出此 API 调用的 ISV。 格式是 Bearer <access_token> 发布者检索令牌值时,如 所述

注意

在请求正文中,资源标识符对于 SaaS 应用和发出自定义计量的 Azure 托管应用具有不同的含义。 SaaS 应用的资源标识符是 resourceID。 Azure 应用程序托管应用计划的资源标识符是 resourceUri。 有关资源标识符的详细信息,请参阅 Azure 市场计量计费- 在提交使用情况事件时选取正确的 ID

对于 SaaS 产品/服务,resourceId 是 SaaS 订阅 ID。 有关 SaaS 订阅的更多详细信息,请参阅列出订阅

SaaS 应用的请求正文示例:

{
  "request": [ // list of usage events for the same or different resources of the publisher
    { // first event
      "resourceId": "<guid1>", // Unique identifier of the resource against which usage is emitted. 
      "quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
      "dimension": "dim1", //Custom dimension identifier
      "effectiveStartTime": "2018-12-01T08:30:14",//Time in UTC when the usage event occurred, from now and until 24 hours back
      "planId": "plan1", // id of the plan purchased for the offer
    },
    { // next event
      "resourceId": "<guid2>", 
      "quantity": 39.0, 
      "dimension": "email", 
      "effectiveStartTime": "2018-11-01T23:33:10
      "planId": "gold", // id of the plan purchased for the offer
    }
  ]
}

对于 Azure 应用程序托管应用计划,resourceUri 是托管应用程序 resourceUsageId。 可在使用 Azure 管理的标识令牌中找到用于提取它的示例脚本。

Azure 应用程序托管应用的请求正文示例:

{
  "request": [ // list of usage events for the same or different resources of the publisher
    { // first event
      "resourceUri": "<fullyqualifiedname>", // Unique identifier of the resource against which usage is emitted. 
      "quantity": 5.0, // how many units were consumed for the date and hour specified in effectiveStartTime, must be greater than 0 or a double integer
      "dimension": "dim1", //Custom dimension identifier
      "effectiveStartTime": "2018-12-01T08:30:14",//Time in UTC when the usage event occurred, from now and until 24 hours back
      "planId": "plan1", // id of the plan purchased for the offer
    }
  ]
}

响应

代码:200
没问题。 Microsoft 端已接受并记录批量发出的使用情况,供进一步处理和计费。 返回的响应列表中包含该批次中每个事件的状态。 你应遍历响应有效负载,了解在批量事件中发送的各个使用事件的响应。

响应有效负载示例:

{
  "count": 2, // number of records in the response
  "result": [
    { // first response
      "usageEventId": "<guid>", // unique identifier associated with the usage event in Microsoft records
      "status": "Accepted" // see list of possible statuses below,
      "messageTime": "2020-01-12T13:19:35.3458658Z", // Time in UTC this event was accepted by Microsoft,
      "resourceId": "<guid1>", // unique identifier of the resource against which usage is emitted.
      "quantity": 5.0, // amount of emitted units as recorded by Microsoft 
      "dimension": "dim1", // custom dimension identifier
      "effectiveStartTime": "2018-12-01T08:30:14",// time in UTC when the usage event occurred, as sent by the ISV
      "planId": "plan1", // id of the plan purchased for the offer
    },
    { // second response
      "status": "Duplicate",
      "messageTime": "0001-01-01T00:00:00",
      "error": {
        "additionalInfo": {
          "acceptedMessage": {
            "usageEventId": "<guid>",
            "status": "Duplicate",
            "messageTime": "2020-01-12T13:19:35.3458658Z",
            "resourceId": "<guid2>",
            "quantity": 1.0,
            "dimension": "email",
            "effectiveStartTime": "2020-01-12T11:03:28.14Z",
            "planId": "gold"
          }
        },
        "message": "This usage event already exist.",
        "code": "Conflict"
      },
      "resourceId": "<guid2>",
      "quantity": 1.0,
      "dimension": "email",
      "effectiveStartTime": "2020-01-12T11:03:28.14Z",
      "planId": "gold"
    }
  ]
}

BatchUsageEvent API 响应中引用状态代码的说明:

状态代码 说明
Accepted 已接受。
Expired 使用已过期。
Duplicate 提供了重复的使用情况。
Error 错误代码。
ResourceNotFound 提供的使用资源无效。
ResourceNotAuthorized 你无权为此资源提供使用情况。
ResourceNotActive 资源已挂起或从未激活。
InvalidDimension 用于传递使用情况的维度对于此产品/服务或计划无效。
InvalidQuantity 传递的数量小于或等于 0。
BadArgument 缺少输入,或输入格式不正确。

代码:400
请求错误。 该批次中包含的使用事件超过 25 个。

代码:403
已禁止。 未提供授权令牌,令牌无效或已过期。 或者,该请求尝试访问使用与用于创建授权令牌的套餐不同的Microsoft Entra 应用 ID 发布的套餐的订阅。

按流量计费检索使用情况事件

你可以调用使用情况事件 API 来获取使用情况事件的列表。 ISV 可以使用此 API 来查看在特定的可配置时间段内已发布的使用情况事件,以及在调用 API 时这些事件的状态。

GET:https://marketplaceapi.microsoft.com/api/usageEvents

查询参数

参数 建议
ApiVersion 使用 2018-08-31。
usageStartDate ISO8601 格式的日期/时间。 例如,2020-12-03T15:00 或 2020-12-03
UsageEndDate(可选) ISO8601 格式的日期/时间。 默认值 = 当前日期
offerId(可选) 默认值 = 所有可用项
planId(可选) 默认值 = 所有可用项
dimension(可选) 默认值 = 所有可用项
azureSubscriptionId(可选) 默认值 = 所有可用项
reconStatus(可选) 默认值 = 所有可用项

reconStatus 的可能值

ReconStatus 说明
已提交 尚未由 PC Analytics 进行处理
已接受 已使用 PC Analytics 进行匹配
已拒绝 已在管道中被拒绝。 请联系 Microsoft 支持部门来调查原因。
不匹配 MarketplaceAPI 和合作伙伴中心分析数量均为非零值,但不匹配

请求标头:

内容类型 使用 application/json
x-ms-requestid 唯一字符串值(最好是 GUID),用于跟踪来自客户端的请求。 如果未提供此值,将在响应标头中生成并提供一个值。
x-ms-correlationid 客户端上的操作的唯一字符串值。 此参数将来自客户端操作的所有事件与服务器端的事件关联起来。 如果未提供此值,将在响应标头中生成并提供一个值。
授权 唯一的访问令牌,用于标识发出此 API 调用的 ISV。 如果令牌值是由发布者检索的,则格式为 Bearer <access_token>。 有关详细信息,请参阅:

响应

响应有效负载示例:

*已接受

[
  {
    "usageDate": "2020-11-30T00:00:00Z",
    "usageResourceId": "11111111-2222-3333-4444-555555555555",
    "dimension": "tokens",
    "planId": "silver",
   "planName": "Silver",
    "offerId": "mycooloffer",
    "offerName": "My Cool Offer",
    "offerType": "SaaS",
    "azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
    "reconStatus": "Accepted",
    "submittedQuantity": 17.0,
    "processedQuantity": 17.0,
    "submittedCount": 17
  }
]

已提交

[
  {
    "usageDate": "2020-11-30T00:00:00Z",
    "usageResourceId": "11111111-2222-3333-4444-555555555555",
    "dimension": "tokens",
    "planId": "silver",
    "planName": "",
    "offerId": "mycooloffer",
    "offerName": "",
    "offerType": "SaaS",
    "azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
    "reconStatus": "Submitted",
    "submittedQuantity": 17.0,
    "processedQuantity": 0.0,
    "submittedCount": 17
  }
]

失 配

[
  {
    "usageDate": "2020-11-30T00:00:00Z",
    "usageResourceId": "11111111-2222-3333-4444-555555555555",
    "dimension": "tokens",
    "planId": "silver",
    "planName": "Silver",
    "offerId": "mycooloffer",
    "offerName": "My Cool Offer",
    "offerType": "SaaS",
    "azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
    "reconStatus": "Mismatch",
    "submittedQuantity": 17.0,
    "processedQuantity": 16.0,
    "submittedCount": 17
  }
]

已拒绝

[
  {
    "usageDate": "2020-11-30T00:00:00Z",
    "usageResourceId": "11111111-2222-3333-4444-555555555555",
    "dimension": "tokens",
    "planId": "silver",
    "planName": "",
    "offerId": "mycooloffer",
    "offerName": "",
    "offerType": "SaaS",
    "azureSubscriptionId": "12345678-9012-3456-7890-123456789012",
    "reconStatus": "Rejected",
    "submittedQuantity": 17.0,
    "processedQuantity": 0.0,
    "submittedCount": 17
  }
]

状态代码

代码:403 禁止。 未提供授权令牌,令牌无效或已过期。 或者,该请求尝试访问使用与用于创建授权令牌的套餐不同的Microsoft Entra 应用 ID 发布的套餐的订阅。

开发和测试最佳做法

要测试自定义计量的发出情况,请实现与计量 API 的集成,为已发布的 SaaS 产品/服务创建计划并定义自定义维度,其中每单位价格为零。 然后将此产品/服务作为预览版发布,以便只有有限数量的用户能够访问和测试集成。

还可对现有的有效产品/服务使用专用计划,在测试期间只有有限数量的用户可访问该计划。

获取支持

请遵照合作伙伴中心商业市场计划的支持中的说明,了解发布者支持选项并使用 Microsoft 启动支持工单。

要详细了解计量服务 API,请参阅市场计量服务 API 常见问题解答