使用New-PartnerCustomerOrder设置新商业体验订单属性遇阻求助
无法通过Partner Center PowerShell设置订单行项的续订对齐日期(月末)
问题描述
我尝试使用Microsoft Partner Center PowerShell模块的New-PartnerCustomerOrder cmdlet创建新商业体验订单时,遇到以下问题:
- 直接设置
PSOrderLineItem的TermDuration属性时,提示'TermDuration' is a ReadOnly property.;尝试设置CustomTermEndDate时,提示The property 'CustomTermEndDate' cannot be found on this object. - 改用
ProvisioningContext.Add('duration', '1Year')的方式可以设置期限和计费周期,但无法将续订对齐日期设置为月末。
初始代码(报错版本)
$lineItem = New-Object -TypeName Microsoft.Store.PartnerCenter.PowerShell.Models.Orders.PSOrderLineItem $lineItem.LineItemNumber = 0 $lineItem.OfferId = ($Catalog | Where-Object {$_.OfferName -eq $Subscription.OfferName}).OfferId $lineItem.Quantity = $Subscription.Quantity $lineItem.TermDuration = "P1Y" $lineItem.CustomTermEndDate = $Alignment New-PartnerCustomerOrder -BillingCycle Monthly -CustomerId $clientId -LineItems @($lineItem)
更新后代码(能设期限但无法对齐日期)
$lineItem = New-Object -TypeName Microsoft.Store.PartnerCenter.PowerShell.Models.Orders.PSOrderLineItem $lineItem.LineItemNumber = 0 $lineItem.OfferId = ($Catalog | Where-Object {$_.OfferName -eq $Subscription.OfferName}).OfferId $lineItem.Quantity = $Subscription.Quantity $lineItem.ProvisioningContext.Add('duration', '1Year') $lineItem.FriendlyName = "$($Subscription.OfferName) - 1YM" New-PartnerCustomerOrder -BillingCycle Monthly -CustomerId $clientId -LineItems @($lineItem)
解决方案
方法1:通过ProvisioningContext传递对齐日期参数
部分商用Offer支持在ProvisioningContext中添加termEndDate或renewalAlignmentDate参数(参数名因Offer类型而异),传递ISO 8601格式的UTC日期即可设置月末对齐:
# 计算目标月末日期(示例:当前月的下月月末,转为UTC格式) $alignmentDate = (Get-Date -Day 1).AddMonths(2).AddDays(-1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") $lineItem = New-Object -TypeName Microsoft.Store.PartnerCenter.PowerShell.Models.Orders.PSOrderLineItem $lineItem.LineItemNumber = 0 $lineItem.OfferId = ($Catalog | Where-Object {$_.OfferName -eq $Subscription.OfferName}).OfferId $lineItem.Quantity = $Subscription.Quantity $lineItem.ProvisioningContext.Add('duration', '1Year') # 添加月末对齐日期,若此参数无效可尝试换为'renewalDate'或'renewalAlignmentDate' $lineItem.ProvisioningContext.Add('termEndDate', $alignmentDate) $lineItem.FriendlyName = "$($Subscription.OfferName) - 1YM" New-PartnerCustomerOrder -BillingCycle Monthly -CustomerId $clientId -LineItems @($lineItem)
注意:参数名需对应具体Offer的支持项,可先在Partner Center UI中手动测试能否设置对齐日期,再匹配对应参数。
方法2:直接调用Partner Center REST API
如果PowerShell模块的封装不支持该属性,直接调用REST API是更可靠的方案:
- 获取认证令牌:
$token = Get-PartnerAccessToken -ResourceUrl "https://api.partnercenter.microsoft.com"
- 构造符合API要求的请求体:
$orderBody = @{ billingCycle = "Monthly" lineItems = @( @{ lineItemNumber = 0 offerId = ($Catalog | Where-Object {$_.OfferName -eq $Subscription.OfferName}).OfferId quantity = $Subscription.Quantity termDuration = "P1Y" customTermEndDate = $alignmentDate # 这里直接使用之前计算的月末UTC日期 } ) referenceCustomerId = $clientId } | ConvertTo-Json -Depth 5
- 发送POST请求:
$headers = @{ "Authorization" = "Bearer $($token.AccessToken)" "Content-Type" = "application/json" } Invoke-RestMethod -Uri "https://api.partnercenter.microsoft.com/v1/customers/$clientId/orders" -Method Post -Headers $headers -Body $orderBody
关键注意事项
customTermEndDate仅对支持自定义期限的Offer有效,部分按月自动续订的订阅类型不支持该参数。- 日期必须为UTC格式的ISO 8601字符串,否则API会返回格式错误。
内容的提问来源于stack exchange,提问作者Russ.Size
相关产品推荐
相关产品推荐

