使用合作伙伴中心 API 为客户创建订单

适用于:合作伙伴中心 | 由世纪互联运营的合作伙伴中心 | Microsoft Cloud for US Government 合作伙伴中心

为 Azure 虚拟机预留实例产品创建订单仅适用于

  • 合作伙伴中心

有关当前可供销售的内容的信息,请参阅云解决方案提供商计划中的合作伙伴产品/服务

先决条件

  • 合作伙伴中心身份验证中所述的凭据。 此方案支持使用独立应用和 App+User 凭据进行身份验证。

  • 客户 ID (customer-tenant-id)。 如果不知道客户的 ID,可以通过选择“客户”工作区,然后从客户列表中选择客户,然后选择“帐户”,在合作伙伴中心查找该 ID。 在客户的“帐户”页上,在“客户帐户信息”部分查找 Microsoft ID Microsoft ID 与客户 ID (customer-tenant-id) 相同。

  • 产品/服务标识符。

C#

为客户创建订单:

  1. 实例化 Order 对象,并将 ReferenceCustomerID 属性设置为客户 ID 以记录客户。

  2. 创建 OrderLineItem 对象列表,并将该列表分配给订单的 LineItems 属性。 每个订单明细项目都包含一种套餐的购买信息。 必须具有至少一个订单明细项目。

  3. 获取用于对操作进行排序的接口。 首先,使用客户 ID 调用 IAggregatePartner.Customers.ById 方法以标识客户。 接下来,从 Orders 属性检索接口。

  4. 调用 Create CreateAsync 方法并传入 Order 对象。

  5. 若要完成证明并包括其他经销商,请参阅以下示例请求和响应示例:

请求示例

{
    "PartnerOnRecordAttestationAccepted":true, 
    "lineItems": [
        {
            "offerId": "CFQ7TTC0LH0Z:0001:CFQ7TTC0K18P",
            "quantity": 1,
            "lineItemNumber": 0,
            "PartnerIdOnRecord": "873452",
            "AdditionalPartnerIdsOnRecord":["4847383","873452"]
        }
    ],
    "billingCycle": "monthly"
}

响应示例

{
    "id": "5cf72f146967",
    "alternateId": "5cf72f146967",
    "referenceCustomerId": "f81d98dd-c2f4-499e-a194-5619e260344e",
    "billingCycle": "monthly",
    "currencyCode": "USD",
    "currencySymbol": "$",
    "lineItems": [
        {
            "lineItemNumber": 0,
            "offerId": "CFQ7TTC0LH0Z:0001:CFQ7TTC0K18P",
            "subscriptionId": "fcddfa52-1da8-4529-d347-50ea51e1e7be",
            "termDuration": "P1M",
            "transactionType": "New",
            "friendlyName": "AI Builder Capacity add-on",
            "quantity": 1,
            "partnerIdOnRecord": "873452",
            "additionalPartnerIdsOnRecord": [
                "4847383",
                "873452"
            ],
            "links": {
                "product": {
                    "uri": "/products/CFQ7TTC0LH0Z?country=US",
                    "method": "GET",
                    "headers": []
                },
                "sku": {
                    "uri": "/products/CFQ7TTC0LH0Z/skus/0001?country=US",
                    "method": "GET",
                    "headers": []
                },
                "availability": {
                    "uri": "/products/CFQ7TTC0LH0Z/skus/0001/availabilities/CFQ7TTC0K18P?country=US",
                    "method": "GET",
                    "headers": []
                }
            }
        }
    ],
    "creationDate": "2021-08-17T18:13:11.3122226Z",
    "status": "pending",
    "transactionType": "UserPurchase",
    "links": {
        "self": {
            "uri": "/customers/f81d98dd-c2f4-499e-a194-5619e260344e/orders/5cf72f146967",
            "method": "GET",
            "headers": []
        },
        "provisioningStatus": {
            "uri": "/customers/f81d98dd-c2f4-499e-a194-5619e260344e/orders/5cf72f146967/provisioningstatus",
            "method": "GET",
            "headers": []
        },
        "patchOperation": {
            "uri": "/customers/f81d98dd-c2f4-499e-a194-5619e260344e/orders/5cf72f146967",
            "method": "PATCH",
            "headers": []
        }
    },
    "client": {},
    "attributes": {
        "objectType": "Order"
    }
}

IAggregatePartner partnerOperations;
string customerId;
string offerId;

var order = new Order()
{
    ReferenceCustomerId = customerId,
    LineItems = new List<OrderLineItem>()
    {
        new OrderLineItem()
        {
            OfferId = offerId,
            FriendlyName = "new offer purchase",
            Quantity = 1,
            ProvisioningContext = new Dictionary<string, string>
            {
                { "subscriptionId", "5198C069-3DAA-403A-8660-5BE11BFD12EE" },
                { "scope", "shared" },
                { "duration", "3Years" }
            }
        }
    }
};

var createdOrder = partnerOperations.Customers.ById(customerId).Orders.Create(order);

示例控制台测试应用项目:合作伙伴中心 SDK 示例 :CreateOrder.cs

REST 请求

请求语法

方法 请求 URI
POST {baseURL}/v1/customers/{customer-id}/orders HTTP/1.1

URI 参数

请使用以下路径参数来标识客户。

名称 类型​​ 必需 说明
customer-id string 标识客户的 GUID 格式的客户 ID。

请求标头

有关详细信息,请参阅合作伙伴中心 REST 标头

请求正文

订单

下表描述了 请求正文中的 Order 属性。

properties 类型 必需 描述
id string 成功创建订单时提供的订单标识符。
referenceCustomerId string 客户标识符。
billingCycle string 指示合作伙伴为此订单计费的频率。 支持的值是在 BillingCycleType 中找到的成员名称。 在创建订单时,默认值为“Monthly”或“OneTime”。 成功创建订单时,将应用此字段。
lineItems OrderLineItem 资源的数组 客户正在购买的产品/服务的项化列表,包括数量。
currencyCode string 只读。 下订单时使用的货币。 成功创建订单时应用。
creationDate datetime 只读。 订单的创建日期,格式为日期-时间。 成功创建订单时应用。
状态 string 只读。 订单的状态。 支持的值是在 OrderStatus 中找到的成员名称。
链接 OrderLinks 与 Order 对应的资源链接。
attributes ResourceAttributes 对应于 Order 的元数据属性。
PartnerOnRecordAttestationAccepted 布尔 确认证明完成

OrderLineItem

下表描述了 请求正文中的 OrderLineItem 属性。

注意

仅当间接提供商代表间接经销商下订单时,才应提供 partnerIdOnRecord。 它仅用于存储间接经销商的 PartnerID(从不存储间接提供商的 ID)。

名称 类型​​ 必需 说明
lineItemNumber int 集合中的每个明细项目都将获得一个唯一的行号,行号的范围为从 0 到 count-1。
offerId string 套餐标识符。 确保产品/服务的可用性适用于正确的细分市场。
subscriptionId string 订阅标识符。
parentSubscriptionId string 可选。 附加产品套餐中的父订阅的 ID。 仅适用于 PATCH。
friendlyName string 可选。 合作伙伴定义的订阅的友好名称,以帮助消除歧义。
quantity int 基于许可证的订阅的许可证数量。
customTermEndDate 日期时间 新订阅的第一个计费期限的结束日期。
partnerIdOnRecord string 当间接提供商代表间接经销商下订单时,仅使用间接经销商的 PartnerID 填充此字段(从不为间接提供商的 ID)。 这可以确保正确地针对奖励进行记账。
provisioningContext 字典<字符串,字符串> 为目录中的某些项目预配所需的信息。 SKU 中的 provisioningVariables 属性指示目录中特定项需要哪些属性。
链接 OrderLineItemLinks 只读。 与“订单”行项对应的资源链接。
attributes ResourceAttributes 对应于 OrderLineItem 的元数据属性。
renewsTo 对象数组 RenewsTo 资源的数组
AttestationAccepted bool 指示提供或 SKU 条件的协议。 仅适用于 SkuAttestationProperties 或 OfferAttestationProperties 强制实施Attestation 的套餐或 SKU。
AdditionalPartnerIdsOnRecord 字符串 当间接提供商代表间接经销商下订单时,仅使用附加间接经销商的 PartnerID 填充此字段(从不为间接提供商的 ID)。 奖励不适用于这些额外的经销商。 最多只能输入 5 个间接经销商。 这只是欧盟/EFTA 国家/地区内交易的适用合作伙伴。
RenewsTo

下表描述了 请求正文中的 RenewsTo 属性。

properties 类型 必需 说明
termDuration string 续订期限持续时间的 ISO 8601 表示形式。 当前支持的值是 P1M (1 个月)和 P1Y (1 年)。

请求示例

POST https://api.partnercenter.microsoft.com/v1/customers/b0d70a69-4c42-4b27-b17b-91a835d8686a/orders HTTP/1.1
Authorization: Bearer <token>
Host: api.partnercenter.microsoft.com
Content-Length: 691
Content-Type: application/json

{
  "BillingCycle": "one_time",
  "CurrencyCode": "USD",
  "LineItems": [
    {
      "LineItemNumber": 0,
      "ProvisioningContext": {
        "subscriptionId": "3D5ECED6-1151-44C7-AEE6-70A4BB725666",
        "scope": "shared",
        "duration": "1Year"
      },
      "OfferId": "DZH318Z0BQ4B:0047:DZH318Z0DSM8",
      "FriendlyName": "A_sample_Azure_RI",
      "Quantity": 1
    }
  ]
}

REST 响应

如果成功,该方法在响应正文中返回 Order 资源。

如果订单包含一个或多个订阅,则仅在 API 调用时预配相应的订阅时,相应的订阅 ID 值才会显示在 REST 响应中。 预配订阅以异步方式发生,因此,创建订单调用的 REST 响应中可能不会始终显示订阅 ID 值。 但是,预配相应的订阅后,可以通过“获取订单”和“按 ID API 调用获取订单”来访问其订阅 ID 值。

响应的成功和错误代码

每个响应都带有一个 HTTP 状态代码,用于指示成功或失败以及其他调试信息。 请使用网络跟踪工具来读取此代码、错误类型和其他参数。 有关完整列表,请参阅 合作伙伴中心错误代码

响应示例

HTTP/1.1 201 Created
Content-Length: 788
Content-Type: application/json; charset=utf-8
MS-CorrelationId: b593cbb7-b358-4b31-81fc-e60b9c277a7f
MS-RequestId: 025f4c19-217f-49d6-a056-391902c62fb3
Date: Thu, 15 Mar 2018 22:30:02 GMT

{
  "id": "Cs_jyTxubLpvdJXdo8xcQZN6I2RsLrgZ1",
  "referenceCustomerId": "b0d70a69-4c42-4b27-b17b-91a835d8686a",
  "billingCycle": "one_time",
  "currencyCode": "USD",
  "lineItems": [
    {
        "lineItemNumber": 0,
        "offerId": "84A03D81-6B37-4D66-8D4A-FAEA24541538",
        "friendlyName": "A_sample_Azure_RI",
        "quantity": 1,
        "links": {
            "sku": {
                "uri": "/products/DZH318Z0BQ4B/skus/0047?country=US",
                "method": "GET",
                "headers": []
            }
        }
    } ],
    "creationDate": "2018-03-15T22:30:02.085152Z",
    "status": "pending",
    "links": {
        "provisioningStatus": {
            "uri": "/customers/b0d70a69-4c42-4b27-b17b-91a835d8686a/orders/Cs_jyTxubLpvdJXdo8xcQZN6I2RsLrgZ1/provisioningstatus",
            "method": "GET",
            "headers": []
        },
        "self": {
            "uri": "/customers/b0d70a69-4c42-4b27-b17b-91a835d8686a/orders/Cs_jyTxubLpvdJXdo8xcQZN6I2RsLrgZ1",
            "method": "GET",
            "headers": []
        }
    },
    "attributes": {
        "objectType": "Order"
    }
}