Создание заказа для клиента с помощью API Центра партнеров

применимо к: Центр партнеров | Центр партнеров, управляемый 21Vianet | Центр партнеров для Microsoft Cloud для государственных организаций США

Создание заказа для продуктов экземпляра зарезервированной виртуальной машины Azure применяется только только:

  • Центр партнеров

Сведения о том, что в настоящее время доступно для продажи, см. в предложениях партнеров в программе поставщика облачных решений.

Необходимые условия

  • Учетные данные, как описано в аутентификации Центра партнеров. Этот сценарий поддерживает аутентификацию с использованием как автономных учетных данных приложения, так и учетных данных приложения и пользователя.

  • Идентификатор клиента (customer-tenant-id). Если вы не знаете идентификатор клиента, его можно найти в Центре партнеров, выбрав рабочую область клиентов, затем клиента из списка клиентов; и затем учетную запись . На странице "Учетная запись клиента" найдите идентификатор Майкрософт в разделе сведения о учетной записи клиента. Идентификатор Майкрософт совпадает с идентификатором клиента (customer-tenant-id).

  • Идентификатор предложения.

C#

Чтобы создать заказ для клиента, выполните приведенные действия.

  1. Создайте экземпляр объекта Order и задайте для свойства ReferenceCustomerID идентификатор клиента, чтобы зарегистрировать клиента.

  2. Создайте список объектов OrderLineItem и присвойте этот список свойству LineItems заказа. Каждый элемент строки заказа содержит сведения о покупке для одного предложения. Вам необходимо иметь как минимум одну позицию заказа.

  3. Получите интерфейс для упорядочивания операций. Сначала вызовите метод IAggregatePartner.Customers.ById с идентификатором клиента для идентификации клиента. Затем получите интерфейс из свойства Orders.

  4. Вызовите метод Create or 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": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
            "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", "bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f" },
                { "scope", "shared" },
                { "duration", "3Years" }
            }
        }
    }
};

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

пример: тестовое приложение для консоли. Project: примеры Partner Center SDK Class: CreateOrder.cs

Запрос REST

Синтаксис запроса

Метод URI запроса
POST {baseURL}/v1/customers/{customer-id}/orders HTTP/1.1

Параметры URI

Используйте следующий параметр пути для идентификации клиента.

Имя Тип Обязательно Описание
идентификатор клиента струна Да Идентификатор клиента в формате GUID, который идентифицирует клиента.

Заголовки запросов

Дополнительные сведения см. в заголовках Центра партнеров REST.

Текст запроса

Заказ

В этой таблице описаны свойства Order в тексте запроса.

Свойство Тип Обязательно Описание
идентификатор струна Нет Идентификатор заказа, предоставленный при успешном создании заказа.
referenceCustomerId струна Нет Идентификатор клиента.
цикл выставления счетов струна Нет Указывает частоту выставления счетов партнером за этот заказ. Поддерживаемые значения — это имена элементов, найденные в BillingCycleType. Значение по умолчанию — "Ежемесячно" или "OneTime" при создании заказа. Это поле применяется при успешном создании заказа.
lineItems массив ресурсов OrderLineItem Да Подробный список товаров, которые клиент приобретает, включая количество.
код валюты струна Нет Только для чтения. Валюта, используемая при размещении заказа. Применяется после успешного создания заказа.
датаСоздания дата и время Нет Только для чтения. Дата создания заказа в формате даты и времени. Применяется после успешного создания заказа.
статус струна Нет Только для чтения. Состояние заказа. Поддерживаемые значения — это имена элементов, найденные в OrderStatus.
ссылки OrderLinks Нет Ссылки на ресурсы, соответствующие заказу.
Атрибуты ResourceAttributes Нет Атрибуты метаданных, соответствующие заказу.
Принятие аттестации зарегистрированного партнера Булев Да Подтверждение завершения аттестации

Элемент заказа

В этой таблице описываются свойства OrderLineItem в тексте запроса.

Заметка

При оформлении заказа корзины через API элементы строки обрабатываются в том порядке, в котором они добавлены в корзину. Заказ может повлиять на соответствие рекламным акциям с ограничениями New To Offer, если в корзине есть два продукта одного типа, один с рекламным идентификатором и другим без (например, с различными условиями). Убедитесь, что товары, участвующие в акции, разместите сначала в корзине, если вы покупаете несколько товаров.

Имя Тип Обязательно Описание
номер позиции int Да Каждый элемент строки в коллекции получает уникальный номер строки, подсчитывая от 0 до count-1.
offerId струна Да Идентификатор предложения. Убедитесь, что наличие предложения соответствует правильному сегменту.
идентификатор подписки струна Нет Идентификатор подписки.
идентификатор родительской подписки струна Нет Необязательный. Идентификатор родительской подписки в предложении на дополнение. Применяется только к PATCH.
дружественное имя струна Нет Необязательный. Партнер присваивает подписке дружественное имя, чтобы помочь разрешить неоднозначность.
количество int Да Количество лицензий для подписки, основанной на лицензиях.
дата окончания пользовательского срока ДатаВремя Нет Дата окончания первого срока выставления счетов новой подписки.
partnerIdOnRecord струна Нет Когда косвенный поставщик размещает заказ от имени косвенного торгового посредника, заполните это поле только идентификатором партнера косвенного торгового посредника (никогда идентификатором косвенного поставщика). Это обеспечивает надлежащий учет стимулов.
контекст предоставления ресурсов Строка<словаря, строка> Нет Сведения, необходимые для обеспечения некоторых позиций в каталоге. Свойство provisioningVariables в номере SKU указывает, какие свойства необходимы для определенных элементов в каталоге.
ссылки OrderLineItemLinks Нет Только для чтения. Ссылки на ресурсы, соответствующие элементу строки заказа.
Атрибуты ResourceAttributes Нет Атрибуты метаданных, соответствующие OrderLineItem.
продлениеTo Массив объектов Нет Массив ресурсов RenewsTo.
Аттестация принята bool Нет Указывает согласие с условиями предложения или SKU. Требуется только для предложений или номеров skus, где SkuAttestationProperties или OfferAttestationProperties принудительное применениеAttestation имеет значение True.
ДополнительныеИдентификаторыПартнёровВЗаписи Струна Нет Если косвенный поставщик помещает заказ от имени косвенного торгового посредника, заполните это поле PartnerID только Дополнительного косвенного торгового посредника (никогда не идентификатор косвенного поставщика). Стимулы не применимы для этих других торговых посредников. Можно ввести только пять непрямых торговых посредников. Это значение применимо только для партнеров, ведущих деятельность в европейских странах или регионах.
scheduledNextTermInstructions объект Нет Определяет следующие инструкции для пробной подписки. Партнеры могут указать срок действия, частоту выставления счетов и количество, которые соответствующая платная подписка будет иметь при продлении.

Заметка

ПартнерIdOnRecord должен предоставляться только в том случае, если косвенный поставщик помещает заказ от имени косвенного торгового посредника. Он используется для хранения PartnerID только непрямого реселлера, а не непрямого поставщика.

ПродлениеTo

В этой таблице описаны свойства RenewsTo в тексте запроса для предложений Microsoft Marketplace.

Свойство Тип Обязательно Описание
длительность срока струна Нет Представление длительности срока продления в формате ISO 8601. Текущие поддерживаемые значения: P1M (1 месяц) и P1Y (1 год).
ScheduledNextTermInstructions

В этой таблице описываются свойства scheduledNextTermInstructions в тексте запроса для новых предложений пробной версии на основе лицензии (NCE). Если значения не указаны, пробные версии автоматически преобразуются в платные подписки с ежегодным сроком, ежемесячной оплатой и 25 лицензиями.

Свойство Тип Обязательно Описание
продукт массив Нет Массив, указывающий, в какую подписку преобразуется пробная подписка, а также срок и частота выставления счетов для платной подписки.
количество int Нет Количество лицензий, которое имеет соответствующая платная подписка после продления пробного предложения.
Продукт

В этой таблице описываются свойства productTerm в тексте запроса для пробных предложений на основе лицензий на основе NCE. Если в этом массиве не указаны никакие значения, пробные версии автоматически обновляются в платные подписки с ежегодным сроком и ежемесячной оплатой.

Свойство Тип Обязательно Описание
productId струна Нет Идентификатор GUID, отформатированный для обозначения продукта платной подписки, в которое преобразуется пробная версия.
skuId струна Нет Идентификатор GUID, отформатированный для представления номера SKU платной подписки, в которую продлевается пробная версия.
availabilityId струна Нет Идентификатор GUID, отформатированный для представления доступности платной подписки, в которую преобразуется пробная версия.
цикл выставления счетов струна Нет Частота выставления счетов, которая используется в платной подписке после обновления пробного периода.
длительность срока струна Нет Срок действия соответствующей платной подписки после продления пробного предложения.

Пример запроса

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": "cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
        "scope": "shared",
        "duration": "1Year"
      },
      "OfferId": "DZH318Z0BQ4B:0047:DZH318Z0DSM8",
      "FriendlyName": "A_sample_Azure_RI",
      "Quantity": 1
    }
  ]
}
// request example where some renewal values for an NCE license-based trial are specified
http
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: 486
Content-Type: application/json
{
  "lineItems": [
    {
      "id": 0,
      "catalogItemId": "CFQ7TTC0LCHC:0003:CFQ7TTC0XCQC",
      "quantity": 25,
      "currencyCode": "USD",
      "billingCycle": "none",
      "termDuration": "P1M",
      "promotionId": null,
      "provisioningContext": {},
      "customTermEndDate": null,
      "scheduledNextTermInstructions": {
        "product": {
          "billingCycle": "monthly",
          "termDuration": "P1M" 
        }
      }
    }
  ],
  "partnerOnRecordAttestationAccepted": true
}

Ответ REST

В случае успешного выполнения метод возвращает ресурс Order в тексте ответа.

Если заказ содержит одну или несколько подписок, соответствующие значения идентификатора подписки отображаются только в ответе REST, если соответствующие подписки подготавливаются во время вызова API. Процесс подготовки подписок выполняется асинхронно, поэтому значения идентификатора подписки могут не всегда отображаться в ответе REST вызова "Создание заказа". Однако после того, как соответствующие подписки подготовлены, их значения идентификаторов подписок можно получить с помощью API вызовов Get Orders и Get Order by ID.

Коды успешных и ошибочных ответов

Каждый ответ поставляется с кодом состояния HTTP, который указывает на успешность или сбой и дополнительные сведения об отладке. Используйте средство трассировки сети для чтения этого кода, типа ошибки и других параметров. Полный список см. в коды ошибок Центра партнеров.

Пример ответа

{
  "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"
    }
}
// response content for an order containing an NCE license-based trial
{
  "id": "99d3777b-61da-4c95-aefa-203c248c4180",
  "creationTimestamp": "2025-02-04T22:22:36.7924103Z",
  "lastModifiedTimestamp": "2025-02-04T22:22:36.7924109Z",
  "expirationTimestamp": "2025-02-11T22:23:34.5190698Z",
  "lastModifiedUser": "b5109661-56c5-45ed-9447-f67463458a97",
  "status": "Active",
  "lineItems": [
    {
      "id": 0,
      "catalogItemId": "CFQ7TTC0LCHC:0003:CFQ7TTC0XCQC",
      "quantity": 25,
      "currencyCode": "USD",
      "billingCycle": "none",
      "termDuration": "P1M",
      "provisioningContext": {},
      "orderGroup": "0",
      "pricing": {
        "listPrice": 0.0,
        "discountedPrice": 0.0,
        "proratedPrice": 0.0,
        "price": 0.0,
        "extendedPrice": 0.0
      },
      "scheduledNextTermInstructions": {
        "product": {
          "productId": "CFQ7TTC0LCHC",
          "skuId": "0002",
          "availabilityId": "CFQ7TTC0XL82",
          "billingCycle": "monthly",
          "termDuration": "P1M"
        },
        "quantity": 25
      }
    }
  ],
  "links": {
    "self": {
      "uri": "/customers/81e78b53-9aa8-44e7-a041-3b15272d8f84/carts/99d3777b-61da-4c95-aefa-203c248c4180",
      "method": "GET",
      "headers": []
    }
  },
  "attributes": {
    "objectType": "Cart"
  }
}