Compartilhar via


Criar um pedido para um cliente usando APIs do Partner Center

Aplica-se a: Partner Center | Partner Center operado pela 21Vianet | Partner Center para Microsoft Cloud for US Government

A criação de um pedido para produtos de instância de VM reservada do Azure se aplica apenas a:

  • Central de Parceiros

Para obter informações sobre o que está disponível para venda no momento, consulte as ofertas do Partner no programa Provedor de Soluções na Nuvem.

Pré-requisitos

  • Credenciais, conforme descrito em Autenticação do Partner Center. Esse cenário dá suporte à autenticação com credenciais autônomas de Aplicativo e Aplicativo+Usuário.

  • Uma ID do cliente (customer-tenant-id). Se você não souber a ID do cliente, poderá pesquisá-la no Partner Center selecionando o workspace Clientes e, em seguida, o cliente na lista de clientes e, em seguida, a Conta. Na página Conta do cliente, procure a ID da Microsoft na seção Informações da Conta do Cliente. A ID da Microsoft é a mesma que a ID do cliente (customer-tenant-id).

  • Um identificador de oferta.

C#

Para criar um pedido para um cliente:

  1. Instancie um objeto Order e defina a propriedade ReferenceCustomerID como a ID do cliente para registrar o cliente.

  2. Crie uma lista de objetos OrderLineItem e atribua a lista à propriedade LineItems da ordem. Cada item de linha de pedido contém as informações de compra de uma oferta. Você deve ter pelo menos um item de linha de pedido.

  3. Obtenha uma interface para ordenar operações. Primeiro, chame o método IAggregatePartner.Customers.ById com a ID do cliente para identificar o cliente. Em seguida, recupere a interface da propriedade Orders .

  4. Chame o método Create ou CreateAsync e passe o objeto Order .

  5. Para concluir o atestado e incluir outros revendedores, confira os seguintes exemplos de Exemplo de Solicitação e Resposta:

Exemplo de solicitação

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

Exemplo de resposta

{
    "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);

Exemplo: aplicativo de teste do console. Project: Classe de exemplos do SDK do Partner Center: CreateOrder.cs

Solicitação REST

Sintaxe da solicitação

Método URI de solicitação
POST {baseURL}/v1/customers/{customer-id}/orders HTTP/1.1

Parâmetros de URI

Use o parâmetro de caminho a seguir para identificar o cliente.

Nome Tipo Obrigatório Description
customer-id cadeia Yes Uma ID do cliente formatada por GUID que identifica o cliente.

Cabeçalhos da solicitação

Para mais informações, consulte os cabeçalhos REST do Partner Center.

Corpo da solicitação

Pedido

Esta tabela descreve as propriedades order no corpo da solicitação.

Propriedade Tipo Obrigatório Description
id cadeia Não Um identificador de pedido fornecido após a criação bem-sucedida da ordem.
referenceCustomerId cadeia Não O identificador do cliente.
billingCycle cadeia Não Indica a frequência com que o parceiro é cobrado por essa ordem. Os valores com suporte são os nomes de membro encontrados em BillingCycleType. O padrão é "Monthly" ou "OneTime" na criação da ordem. Esse campo é aplicado após a criação bem-sucedida da ordem.
lineItems matriz de recursos OrderLineItem Yes Uma lista de itens das ofertas que o cliente está comprando, incluindo a quantidade.
código de moeda cadeia Não Somente leitura. A moeda usada ao fazer o pedido. Aplicado após a criação bem-sucedida da ordem.
data de criação datetime Não Somente leitura. A data em que o pedido foi criado, no formato de data e hora. Aplicado após a criação bem-sucedida da ordem.
status cadeia Não Somente leitura. O status da ordem. Os valores com suporte são os nomes de membro encontrados em OrderStatus.
links OrderLinks Não Os links de recurso correspondentes à Ordem.
attributes ResourceAttributes Não Os atributos de metadados correspondentes à Ordem.
PartnerOnRecordAttestationAccepted booleano Yes Confirma a conclusão do Atestado

OrderLineItem

Esta tabela descreve as propriedades OrderLineItem no corpo da solicitação.

Observação

Ao finalizar um carrinho por meio da API, os itens são processados na ordem em que são colocados no carrinho. A ordem pode afetar a elegibilidade para promoções com restrições de nova oferta se houver dois produtos do mesmo tipo no carrinho, um com a ID da promoção e o outro sem (por exemplo, com termos diferentes). Certifique-se de colocar todos os itens qualificados para uma promoção primeiro no carrinho se você estiver finalizando a compra de vários itens.

Nome Tipo Obrigatório Description
lineItemNumber int Yes Cada item de linha na coleção obtém um número de linha exclusivo, contando de 0 a 1.
offerId cadeia Yes O identificador da oferta. Verifique se a disponibilidade da oferta é para o segmento correto.
subscriptionId cadeia Não O identificador da assinatura.
parentSubscriptionId cadeia Não Optional. A ID da assinatura pai em uma oferta de complemento. Aplica-se somente ao PATCH.
friendlyName cadeia Não Optional. O nome amigável da assinatura definida pelo parceiro para ajudar a desambiguar.
quantidade int Yes O número de licenças para uma assinatura baseada em licença.
customTermEndDate DateTime Não A data de término do primeiro período de cobrança da nova assinatura.
partnerIdOnRecord cadeia Não Quando um provedor indireto faz um pedido em nome de um revendedor indireto, preencha esse campo com a PartnerID do revendedor indireto somente (nunca a ID do provedor indireto). Isso garante a contabilidade adequada para incentivos.
provisioningContext Cadeia de caracteres de dicionário<, cadeia de caracteres> Não Informações necessárias para provisionamento para alguns itens no catálogo. A propriedade provisioningVariables em um SKU indica quais propriedades são necessárias para itens específicos no catálogo.
links OrderLineItemLinks Não Somente leitura. Os links de recurso correspondentes ao item de linha Order.
attributes ResourceAttributes Não Os atributos de metadados correspondentes ao OrderLineItem.
renewsTo Matriz de objetos Não Uma matriz de recursos RenewsTo .
AttestationAccepted bool Não Indica o contrato para oferecer ou condições de sku. Necessário apenas para ofertas ou skus em que SkuAttestationProperties ou OfferAttestationProperties enforceAttestation é True.
AdditionalPartnerIdsOnRecord String Não Quando um provedor indireto coloca um pedido em nome de um revendedor indireto, preencha esse campo com a PartnerID do revendedor indireto Adicional somente (nunca a ID do provedor indireto). Os incentivos não são aplicáveis a esses outros revendedores. Somente um máximo de cinco revendedores indiretos podem ser inseridos. Esse valor é aplicável apenas para parceiros que realizam transações em países/regiões europeias.
scheduledNextTermInstructions objeto Não Define as instruções do próximo termo para uma assinatura de avaliação. Os parceiros podem especificar a duração do termo, a frequência de faturamento e a quantidade que a assinatura paga possui na renovação.

Observação

O partnerIdOnRecord só deve ser fornecido quando um provedor indireto faz um pedido em nome de um revendedor indireto. Ele é usado para armazenar a PartnerID somente do revendedor indireto (nunca a ID do provedor indireto).

RenewsTo

Esta tabela descreve as propriedades RenewsTo no corpo da solicitação para ofertas do Microsoft Marketplace.

Propriedade Tipo Obrigatório Description
termDuration cadeia Não Uma representação ISO 8601 da duração do termo de renovação. Os valores atuais compatíveis são P1M (1 mês) e P1Y (1 ano).
ScheduledNextTermInstructions

Esta tabela descreve as propriedades scheduledNextTermInstructions no corpo da solicitação para ofertas de avaliação baseadas em licença da nova experiência de comércio (NCE). Se nenhum valor for especificado, os períodos de avaliação serão renovados em assinaturas pagas com prazo anual, cobrança mensal e 25 licenças.

Propriedade Tipo Obrigatório Description
produto matriz Não Uma matriz que especifica a oferta em que uma assinatura de avaliação é renovada e o termo e a frequência de cobrança que a assinatura paga tem.
quantidade int Não A quantidade de licença que a assinatura paga correspondente tem depois que a oferta de avaliação é renovada.
Product

Esta tabela descreve as propriedades productTerm no corpo da solicitação para ofertas de avaliação baseadas em licença NCE. Se nenhum valor for especificado nesse array, as avaliações serão renovadas em assinaturas pagas com prazo anual e cobrança feita mensalmente.

Propriedade Tipo Obrigatório Description
ID do produto cadeia Não Um GUID formatado para representar o produto da assinatura paga na qual a avaliação se renova.
skuId cadeia Não Um GUID formatado para representar o SKU da assinatura paga na qual a avaliação é renovada.
availabilityId cadeia Não Um GUID formatado para representar a disponibilidade da assinatura paga na qual a avaliação é renovada.
billingCycle cadeia Não A frequência de cobrança que a assinatura paga correspondente tem depois que a oferta de avaliação é renovada.
termDuration cadeia Não A duração do termo que a assinatura paga correspondente tem depois que a oferta de avaliação é renovada.

Exemplo de solicitação

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
}

Resposta REST

Se tiver êxito, o método retornará um recurso Order no corpo da resposta.

Se o pedido contiver uma ou mais assinaturas, os respectivos valores de ID de assinatura só aparecerão na resposta REST se as assinaturas correspondentes forem provisionadas no momento da chamada à API. O provisionamento de assinaturas ocorre de forma assíncrona e, portanto, os valores de ID da assinatura podem nem sempre estar visíveis na resposta REST da chamada Criar Ordem. No entanto, depois que as respectivas assinaturas forem provisionadas, seus valores de ID de assinatura poderão ser acessados por meio de chamadas à API Get Orders e Get Order by ID.

Códigos de erro e êxito de resposta

Cada resposta vem com um código de status HTTP que indica êxito ou falha e mais informações de depuração. Use uma ferramenta de rastreamento de rede para ler este código, tipo de erro e outros parâmetros. Para obter a lista completa, consulte os códigos de erro do Partner Center.

Exemplo de resposta

{
  "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"
  }
}