View a markdown version of this page

以买家身份使用协议 API - AWS Marketplace

AWS Marketplace API 参考已重组。有关支持的 API 操作的更多信息,请参阅 AWS Marketplace API 参考

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

以买家身份使用协议 API

协议是一种约束双方的文件,包括提议人和接受者(通常是买方),并定义了双方之间适用的条款和条件。

买方创建 AgreementRequest,生成报价。此报价包括所有相关信息,例如在协议有效期内将产生的估计费用,这对于买方的购买决定至关重要。如果买家对报价感到满意,他们可以在报价到期 AgreementRequest 之前接受。本协议是在接受后生效的 AgreementRequest。在此过程中,买家管理员或买家角色可以将采购订单与费用相关联。最后,根据有效协议的条款和条件,向买方开具发票并获得使用该产品的许可。

先决条件:发现产品和优惠

在创建协议之前,请使用 AWS Marketplace Discovery API 来发现产品并获取构建协议所需的agreementProposalIdpricingModel、和条款的详细信息CreateAgreementRequest

步骤 发现 API 操作 Output 用于
1 ListPurchaseOptions offerId 查找产品的可用报价
2 GetOffer agreementProposalId, pricingModel 正在构建 agreementProposalIdentifier
3 GetOfferTerms 学期 ID 和定价详情 正在构建 requestedTerms

有关发现产品和定价的详细信息,请参阅探索产品和定价

接受者可以使用此 API 执行以下任务:

Task 说明 动作 意图

生成报价

接受方可以生成包含所有相关信息的报价,例如在协议有效期内产生的费用,这对于买方的购买决定至关重要。 CreateAgreementRequest

接受报价

接受者可以接受提议者提出的创建新协议的条款。这种接受可能涉及传递某些条款的参数,例如选择数量或期限、添加采购订单等。接受者还可以创建一个新协议,其中产品使用从未来的某个日期开始。协议的签署日期将是接受报价和创建协议的日期。协议开始日期是产品开始使用的 future 日期。这是激活 license/entitlement 的日期。要检索您的使用权的最新状态,请参阅 GetAgreementEntitlementsAPI。 CreateAgreementRequest, AcceptAgreementRequest

替换现有协议

接受方可以根据其协议进行中期升级,要么改用更优惠的条款,要么为他们的协议更换卖方。此操作将终止作为输入通过的现有协议,并创建新的协议。从逻辑上讲,此操作等同于取消后签订新协议,但可以确保接受者的权利连续性,并且接受者在任何时候都不会失去权利。 CreateAgreementRequest, AcceptAgreementRequest REPLACE

修改现有协议

只允许接受者修改已接受条款的配置。例如,他们可以启用或禁用自动续订,或者修改购买的数量,前提是修改后的价格变化不会导致退款。只有在协议尚未开始的情况下,我们才会支持修改费用。注意:允许投标人修改即用即付定价期限的价格。在买家收到有关价格上涨的通知后,随用随付价格的任何上调都需要 90 天才能生效。随用随付价格的任何降低都会立即生效。 CreateAgreementRequest, AcceptAgreementRequest 修改

启用或禁用自动续订

如果卖家启用了续订优惠条款 ON/Off ,则接受者可以在其协议上启用 auto renew 标志。如果已启用,则协议服务将在原始协议到期之日使用最新的报价修订版创建续订协议。创建的本协议的开始日期将与原始协议的结束日期相同。 CreateAgreementRequest, AcceptAgreementRequest 修改

取消协议

接受者可以取消使用协议。对于其他所有内容,买家必须联系卖家以启动取消订单。当您取消协议时,您的许可证和权利将被停用。 CancelAgreement N/A

搜索协议

接受者可以搜索他们作为接受者参与的所有协议。 AWS Marketplace搜索会返回包含基本协议信息的协议列表。 SearchAgreements N/A

描述协议

接受者可以查看有关协议的详细信息,例如提议人、接受者、开始日期和结束日期。 DescribeAgreement N/A

获取协议条款

接受者可以在他们作为接受者参与的协议中获取有关条款的详细信息。 GetAgreementTerms N/A

获取协议权利

接受者可以获得协议级别的视图,了解与其协议相关的权利的状态和详细信息,例如,是否正在授予或是否已被拒绝(如果是,原因是什么),授予客户的权利是什么。 GetAgreementEntitlements N/A

获取注册令牌

注册令牌是接受者在提议者开设账户时所需的短期代币。此令牌用于外部计量和授权维度类型。该代币在创建后仅在 30 分钟内有效,目前仅适用于 SaaS 购买协议。 GetAgreementEntitlements N/A

列出协议费用

接受者可以查看与其协议相关的费用和采购订单详情。 ListAgreementCharges N/A

更新采购订单

接受者可以在订阅产品后添加采购订单号。一旦采购订单与费用关联,则为该费用生成的发票将包括采购订单编号。 UpdatePurchaseOrders N/A

列出取消申请

接受者可以列出他们参与的协议的所有取消请求。该列表可以按协议、状态和其他条件进行筛选。 ListAgreementCancellationRequests N/A

获取取消请求详情

接受者可以检索卖家(提案人)发起的特定取消请求的详细信息,包括状态、时间戳和原因代码。 GetAgreementCancellationRequest N/A

接受取消请求

接受者可以批准卖方(提案人)为有效协议发起的取消请求。批准后,协议取消工作流程将异步执行,协议状态更改为已取消。注意:用户还需要CancelAgreement权限,因为批准取消请求会导致协议取消。 AcceptAgreementCancellationRequest, CancelAgreement N/A

拒绝取消请求

接受者可以拒绝卖方(提议人)发起的取消请求。拒绝后,协议仍处于活动状态,取消请求进入终止状态。如果需要,卖家可以创建新的取消请求。 RejectAgreementCancellationRequest N/A

列出付款申请

接受者可以列出他们参与的协议的所有付款请求。该列表可以按协议、状态和其他条件进行筛选。 ListAgreementPaymentRequests N/A

获取付款申请详情

接受者可以检索卖方(投标人)发起的特定付款请求的详细信息,包括状态、时间戳和相关费用。 GetAgreementPaymentRequest N/A

接受付款申请

接受者可以批准卖方(提案人)为有效协议发起的付款申请。 AcceptAgreementPaymentRequest N/A

拒绝付款申请

接受者可以拒绝卖方(投标人)发起的付款请求。拒绝后,付款请求进入终止状态。如果需要,卖家可以创建新的付款申请。 RejectAgreementPaymentRequest N/A

生成报价

CreateAgreementRequest用于生成报价。您必须提供:

  • agreementProposalIdentifieragreementProposalId 来自GetOffer回复的。

  • requestedTerms— 根据GetOfferTerms响应中的术语构建。每个学期都需要它的id,有些则需要额外configuration的。请参阅构造请求条款

response = client.create_agreement_request( agreementProposalIdentifier='at-edhtjnbilupjv3xqbphtom77y', intent='NEW', requestedTerms=[ {'id': 'term-legal-abc123'}, {'id': 'term-validity-def456'}, { 'id': 'term-configurable-pricing-789', 'configuration': { 'configurableUpfrontPricingTermConfiguration': { 'selectorValue': 'P12M', 'dimensions': [ {'dimensionKey': 'Users', 'dimensionValue': 50} ] } } }, { 'id': 'term-renewal-012', 'configuration': { 'renewalTermConfiguration': {'enableAutoRenew': True} } } ] ) print(f"Agreement Request ID: {response['agreementRequestId']}") for charge in response['chargeSummary']['expectedCharges']: print(f" Charge ID: {charge['id']}, Amount: ${charge['amount']}")

构造请求条款

要构造requestedTerms,你需要确定两件事:

  1. 要包括哪些条款 — 由报价的定价模式决定。请参阅按定价模式划分的必填条款

  2. 哪些术语需要配置 — 大多数术语只需要配置id,但有三种术语类型需要买方提供的其他配置。请参阅术语配置

按定价模式划分的必填条款

GetOffer回复中的pricingModel.PricingModel字段决定了您必须包含哪些术语CreateAgreementRequest

每份协议中都必须包含以下条款:LegalTermSupportTermValidityTerm、和RenewalTerm

注意

FreeTrialPricingTerm每件产品只能接受一次 — 如果买家已经使用了免费试用版,则CreateAgreementRequest会返回错误。

合同

返回的所有术语GetOfferTerms都必须合而为CreateAgreementRequest

用法

协议的创建取决于报价中包含的条款:

  1. 第一份协议 — 接受 UsageBasedPricingTerm and/or RecurringPaymentTerm(视报价包含的内容而定)以及强制性条款。这授予产品使用权利。

  2. 后续协议(可选)— 如果优惠包含ConfigurableUpfrontPricingTermFixedUpfrontPricingTermPaymentScheduleTerm、或,您可以选择创建单独的协议,按年购买以获得折扣价。

注意

如果您创建了两个协议,但后来又想取消,请先取消后续协议(与ConfigurableUpfrontPricingTerm),然后取消第一个协议(与 UsageBasedPricingTerm and/or RecurringPaymentTerm)。

BYOL

接受ByolPricingTerm并接受强制性条款。

术语配置

大多数术语只需要id表单GetOfferTerms。除以下术语类型外,还需要买configuration家提供:id

术语类型 配置 买家提供什么
ConfigurableUpfrontPricingTerm ConfigurableUpfrontPricingTermConfiguration 协议期限和每个维度的单位数
RenewalTerm RenewalTermConfiguration 协议到期后是否自动续订
VariablePaymentTerm VariablePaymentTermConfiguration 如何批准卖家的付款请求

ConfigurableUpfrontPricingTermConfiguration

使用以下示例来查找所需的值ConfigurableUpfrontPricingTermConfiguration

GetOfferTerms响应示例:

{ "offerTerms": [ { "configurableUpfrontPricingTerm": { "id": "term-34dfb665ebd38eb2d0269a4af454c4f33cd90292ecc7b0f71058175594f67394", "currencyCode": "USD", "rateCards": [ { "constraints": { "multipleDimensionSelection": "Allowed", "quantityConfiguration": "Allowed" }, "selector": { "type": "Duration", "value": "P1M" }, "rateCard": [ { "dimensionKey": "BasicService", "displayName": "Basic Service", "price": "0", "unit": "Units" }, { "dimensionKey": "PremiumService", "displayName": "Premium Service", "price": "0", "unit": "Units" } ] } ], "type": "ConfigurableUpfrontPricingTerm" } } ] }
字段 值/来源
ConfigurableUpfrontPricingTermConfiguration.selectorValue offerTerms[].configurableUpfrontPricingTerm.rateCards[].selector.value
Dimension.dimensionKey offerTerms[].configurableUpfrontPricingTerm.rateCards[].rateCard[].dimensionKey
Dimension.dimensionValue Buyer-supplied 整数(要为该维度购买的单位数)
注意

constraints目表中的字段决定了您可以如何制作,例如,您可以选择多个维度还是只选择一个维度。ConfigurableUpfrontPricingTermConfiguration有关详细信息,请参阅 “约束” 数据类型。

以下内容的RequestedTerm有效负载示例ConfigurableUpfrontPricingTerm

{ "id": "term-43ab7a2445f89dfcb7e1a6a81c92fe08c124125ffad126bea5e5b7915c065166", "configuration": { "configurableUpfrontPricingTermConfiguration": { "selectorValue": "P12M", "dimensions": [ { "dimensionKey": "AdminUsers", "dimensionValue": 5 }, { "dimensionKey": "ReadOnlyUsers", "dimensionValue": 10 } ] } } }

RenewalTermConfiguration

字段 值/来源
enableAutoRenew Buyer-supplied 布尔值(truefalse)-必填项

以下内容的RequestedTerm有效负载示例RenewalTerm

{ "id": "term-ffcc0100ce0c5468426dc07d0b05cff09ab8447640108d9c95ce1591f0949738", "configuration": { "renewalTermConfiguration": { "enableAutoRenew": false } } }

VariablePaymentTermConfiguration

字段 值/来源
RequestedTerm.configuration.variablePaymentTermConfiguration.paymentRequestApprovalStrategy Buyer-supplied: AUTO_APPROVE_ON_EXPIRATIONWAIT_FOR_APPROVAL必填
RequestedTerm.configuration.variablePaymentTermConfiguration.expirationDuration Buyer-supplied 持续时间(例如,P10D);仅当策略为时才需要 AUTO_APPROVE_ON_EXPIRATION

以下内容的RequestedTerm有效负载示例VariablePaymentTerm

{ "id": "term-9ab34376c51cd5b4dc995aa0f410b657d58bd577b3f09b34d38afb6964aaaf12", "configuration": { "variablePaymentTermConfiguration": { "paymentRequestApprovalStrategy": "AUTO_APPROVE_ON_EXPIRATION", "expirationDuration": "P10D" } } }

接受报价

首先,生成报价,如中所述生成报价。然后,AcceptAgreementRequest使用接受报价并创建协议。您必须在协议请求到期AcceptAgreementRequest之前致电。您可以选择在接受期间关联采购订单编号。

# Use chargeId from CreateAgreementRequest response response = client.accept_agreement_request( agreementRequestId='agrq-abc123', purchaseOrders=[ { 'chargeId': 'charge-xyz', # From chargeSummary.expectedCharges[].id 'purchaseOrderReference': 'PO-2024-001' } ] ) print(f"Agreement ID: {response['agreementId']}")

替换现有协议

按照CreateAgreementRequest中所述构建 a生成报价,但设置intentREPLACE并提供sourceAgreementIdentifier替换协议。然后AcceptAgreementRequest致电完成更换。

response = client.create_agreement_request( agreementProposalIdentifier='at-edhtjnbilupjv3xqbphtom77y', intent='REPLACE', sourceAgreementIdentifier='agmt-existing123' ) print(f"Agreement Request ID: {response['agreementRequestId']}")

修改现有协议

要修改现有协议的条款配置,intent请设置为AMEND并提供sourceAgreementIdentifier。与新协议不同,不需要agreementProposalIdentifier任何协议。仅包含要更改其配置的术语。然后AcceptAgreementRequest致电申请修正案。

response = client.create_agreement_request( intent='AMEND', sourceAgreementIdentifier='agmt-existing123', requestedTerms=[ { 'id': 'term-configurable-pricing-789', 'configuration': { 'configurableUpfrontPricingTermConfiguration': { 'selectorValue': 'P12M', 'dimensions': [ {'dimensionKey': 'Users', 'dimensionValue': 100} ] } } } ] ) print(f"Agreement Request ID: {response['agreementRequestId']}")

启用或禁用自动续订

CreateAgreementRequest使用本来是为了AMEND切换自动续订。

response = client.create_agreement_request( intent='AMEND', sourceAgreementIdentifier='agmt-existing123', requestedTerms=[ { 'id': 'term-renewal-456', 'configuration': { 'renewalTermConfiguration': {'enableAutoRenew': True} } } ] ) print(f"Agreement Request ID: {response['agreementRequestId']}")

取消协议

CancelAgreement用于取消使用协议。对于其他类型的协议,买家必须联系卖家以启动取消协议。

client.cancel_agreement( agreementId='agmt-abc123' )

搜索协议

SearchAgreements用于搜索您作为接受者参与的所有协议。搜索会返回包含基本协议信息的协议列表。

response = client.search_agreements( catalog='AWSMarketplace', filters=[ {'name': 'PartyType', 'values': ['Acceptor']}, {'name': 'AgreementType', 'values': ['PurchaseAgreement']}, {'name': 'Status', 'values': ['ACTIVE']} ] ) for agmt in response['agreementViewSummaries']: print(f" {agmt['agreementId']}: {agmt['status']}")

描述协议

DescribeAgreement用于查看有关协议的详细信息,例如提案人、接受者、开始日期和结束日期。

response = client.describe_agreement( agreementId='agmt-abc123' ) print(f"Status: {response['status']}") print(f"Start: {response['startTime']}") print(f"End: {response['endTime']}")

获取协议条款

GetAgreementTerms用于获取有关您作为接受者参与的协议中条款的详细信息。

response = client.get_agreement_terms( agreementId='agmt-abc123' ) for term in response['acceptedTerms']: print(f" Term: {term}")

获取协议权利

GetAgreementEntitlements用于获取协议级别的视图,了解与您的协议相关的权利的状态和详细信息。

response = client.get_agreement_entitlements( agreementId='agmt-abc123' ) for ent in response['agreementEntitlements']: print(f" {ent['resource']}: {ent['status']}")

获取注册令牌

用于GetAgreementEntitlements获取注册令牌。接受者需要这种短暂的代币(有效期为30分钟)才能在提案人那里开设账户。目前仅适用于 SaaS 购买协议。

response = client.get_agreement_entitlements( agreementId='agmt-abc123' ) for ent in response['agreementEntitlements']: if 'registrationToken' in ent: print(f"Registration Token: {ent['registrationToken']}") # Token is valid for 30 minutes

列出协议费用

ListAgreementCharges用于查看与您的协议相关的费用和采购订单详细信息。

response = client.list_agreement_charges( agreementId='agmt-abc123' ) for charge in response['items']: print(f" {charge['id']} (rev {charge['revision']}): ${charge['amount']}") print(f" PO: {charge.get('purchaseOrderReference', 'N/A')}")

更新采购订单

UpdatePurchaseOrders用于在订阅产品后添加采购订单号。使用列出协议费用响应chargeRevision中的chargeId和。一旦采购订单与费用关联,为该费用生成的发票就会包含采购订单编号。

client.update_purchase_orders( agreementId='agmt-abc123', purchaseOrders=[ { 'chargeId': 'charge-xyz', 'chargeRevision': 1, 'purchaseOrderReference': 'PO-2024-001' } ] )

列出取消申请

ListAgreementCancellationRequests用于列出您参与的协议的所有取消请求。您可以按协议、状态和其他条件进行筛选。

response = client.list_agreement_cancellation_requests( partyType='Acceptor', agreementId='agmt-abc123' ) for req in response['agreementCancellationRequests']: print(f" {req['agreementCancellationRequestId']}: {req['status']}")

获取取消请求详情

GetAgreementCancellationRequest用于检索有关特定取消请求的详细信息,包括状态、时间戳和原因代码。

response = client.get_agreement_cancellation_request( agreementId='agmt-abc123', agreementCancellationRequestId='acr-abc123' ) print(f"Status: {response['status']}") print(f"Reason: {response['reasonCode']}")

接受取消请求

AcceptAgreementCancellationRequest用于批准卖家发起的取消请求。批准后,协议取消工作流程将异步执行。您还需要CancelAgreement获得许可,因为批准取消请求会导致协议被取消。

client.accept_agreement_cancellation_request( agreementId='agmt-abc123', agreementCancellationRequestId='acr-abc123' )

拒绝取消请求

用于RejectAgreementCancellationRequest拒绝卖家发起的取消请求。拒绝后,协议仍处于有效状态,如果需要,卖家可以创建新的取消请求。

client.reject_agreement_cancellation_request( agreementId='agmt-abc123', agreementCancellationRequestId='acr-abc123' )

列出付款申请

ListAgreementPaymentRequests用于列出您参与的协议的所有付款申请。您可以按协议、状态和其他条件进行筛选。

response = client.list_agreement_payment_requests( partyType='Acceptor', agreementId='agmt-abc123' ) for req in response['agreementPaymentRequests']: print(f" {req['agreementPaymentRequestId']}: {req['status']}")

获取付款申请详情

GetAgreementPaymentRequest用于检索有关特定付款请求的详细信息,包括状态、时间戳和相关费用。

response = client.get_agreement_payment_request( paymentRequestId='apr-abc123', agreementId='agmt-abc123' ) print(f"Status: {response['status']}") print(f"Amount: ${response['amount']}")

接受付款申请

AcceptAgreementPaymentRequest用于批准卖家针对有效协议发起的付款请求。

client.accept_agreement_payment_request( paymentRequestId='apr-abc123', agreementId='agmt-abc123' )

拒绝付款申请

用于RejectAgreementPaymentRequest拒绝卖家发起的付款请求。拒绝后,如果需要,卖家可以创建新的付款请求。

client.reject_agreement_payment_request( paymentRequestId='apr-abc123', agreementId='agmt-abc123' )