为了账号安全,请及时绑定邮箱和手机立即绑定

我如何从条带化订阅响应对象中正确获取结构项?

我如何从条带化订阅响应对象中正确获取结构项?

Go
郎朗坤 2023-02-06 10:29:26
我正在尝试从条带响应对象的结构中获取一些数据以进行订阅。这是响应对象stribe 订阅对象的结构的链接这是我所拥有的以及我正在尝试做的type SubscriptionDetails struct {    CustomerId             string  `json:"customer_id"`    SubscritpionId         string  `json:"subscritpion_id"`    StartAt                time.Time  `json:"start_at"`    EndAt                  time.Time  `json:"end_at"`    Interval               string  `json:"interval"`    Plan                   string  `json:"plan"`    PlanId                 string  `json:"plan_id"`    SeatCount              uint8  `json:"seat_count"`    PricePerSeat           float64  `json:"price_per_seat"`}func CreateStripeSubscription(CustomerId string, planId string) (*SubscriptionDetails, error) {    stripe.Key = StripeKey    params := &stripe.SubscriptionParams{    Customer: stripe.String(CustomerId),    Items: []*stripe.SubscriptionItemsParams{        &stripe.SubscriptionItemsParams{        Price: stripe.String(planId),        },    },    }    result, err := sub.New(params)    if err != nil {        return nil, err    }    data := &SubscriptionDetails{}    data.CustomerId           = result.Customer    data.SubscritpionId       =  result.ID    data.StartAt              =  result.CurrentPeriodStart    data.EndAt                =  result.CurrentPeriodEnd    data.Interval             =  result.Items.Data.Price.Recurring.Interval    data.Plan                 =  result.Items.Data.Price.Nickname    data.SeatCount            =  result.Items.Data.Quantity    data.PricePerSeat         =  result.Items.Data.Price.UnitAmount    return data, nil    }有些项目很容易直接获得,就像ID我很容易获得的字段一样result.ID,没有任何投诉,但对于其他项目,这里是错误消息cannot use result.CurrentPeriodStart (type int64) as type time.Time in assignment...cannot use result.Customer (type *stripe.Customer) as type string in assignment...result.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)那么我如何获取和的数据data.CustomerId呢data.PricePerSeat?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

让我们首先回顾一下幕后工作的代码,返回的是什么,然后我们一次一个地查看问题。

当我们用它调用sub.New()方法params时返回Subscription类型

注意:我只会显示类型的有限定义,因为添加完整的结构会使答案变大,而不是特定于问题上下文

让我们看看Subscription类型

type Subscription struct {

  ...

  // Start of the current period that the subscription has been invoiced for.

  CurrentPeriodStart int64 `json:"current_period_start"`

  // ID of the customer who owns the subscription.

  Customer *Customer `json:"customer"`

  ...

  // List of subscription items, each with an attached price.

  Items *SubscriptionItemList `json:"items"`

  ...

}

让我们看一下第一个错误

cannot use result.CurrentPeriodStart (type int64) as type time.Time in assignment

根据Subscription我们可以看到CurrentPeriodStart的类型是类型int64,而你试图将它设置为类型的StartAt字段,因为类型不同,一种类型不能分配给其他类型,为了解决这个问题,我们需要明确地将它转换为可以这样做:SubscriptionDetailstime.Timetime.Time

data.StartAt = time.Unix(result.CurrentPeriodStart, 0)

time.Unixtime.Time方法从传递的值创建类型int64并返回我们可以分配给StartAt字段的类型

现在让我们继续第二个错误

cannot use result.Customer (type *stripe.Customer) as type string in assignment

正如我们从Subscription定义Customer字段中看到的那样,*Customer它不是字符串类型,因为您试图将类型分配给*Customer字符串CustomerId类型的字段,这不可能导致上述错误,引用的数据不正确那么正确的数据在哪里正确的数据在带有字段的*Customer类型中可用ID,可以按如下方式检索

data.CustomerId = result.Customer.ID

让我们回顾一下最后一个错误

result.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)

同样,如果我们查看Subscription定义,我们可以看到Items字段是类型*SubscriptionItemList类型,如果我们查看*SubscriptionItemList定义

type SubscriptionItemList struct {
    APIResource
    ListMeta
    Data []*SubscriptionItem `json:"data"`}

它包含一个字段名称DataData类型[]*SubscriptionItem注意它是 slice []of *SubscriptionItem,这是错误的原因,因为Data字段是 slice of*SubscriptionItem我们可以解决问题如下:

data.PricePerSeat = result.Items.Data[0].price.UnitAmount

我想指出的可能发生的错误很少,请继续阅读下面的内容以解决这些问题

现在让我们看看*SubscriptionItem定义

type SubscriptionItem struct {
  ...
  Price *Price `json:"price"`
  ...
}

它包含Price名称以大写字母开头的字段通知,在共享代码中它以小写字母引用,这可能会导致另一个问题,最后如果我们查看Price定义

type Price struct {
  ...  // The unit amount in %s to be charged, represented as a whole integer if possible. Only set if `billing_scheme=per_unit`.
  UnitAmount int64 `json:"unit_amount"`

  // The unit amount in %s to be charged, represented as a decimal string with at most 12 decimal places. Only set if `billing_scheme=per_unit`.
  UnitAmountDecimal float64 `json:"unit_amount_decimal,string"`
  ...
}

它包含UnitAmount我们正在使用的字段,但这里有一个问题UnitAmount是类型,int64但类型PricePerSeat是类型,float64将不同的类型分配给彼此会再次导致错误,因此您可以转换int64float64或者更好的是您可以使用包含的类型中UnitAmountDecimal可用的字段格式Price相同的数据float64将减少我们在使用UnitAmount字段时必须进行的显式转换,因此根据我们得到以下解决方案的解释

data.PricePerSeat = result.Items.Data[0].Price.UnitAmountDecimal


查看完整回答
反对 回复 2023-02-06
?
千巷猫影

TA贡献1829条经验 获得超7个赞

查看您提到的3个错误

  1. cannot use result.CurrentPeriodStart (type int64) as type time.Time in assignment

的类型result.CurrentPeriodStart是 int64 并且您试图将其设置为类型的字段time.Time,这显然会失败。 API 以 unix 格式发送时间,您需要对其进行解析以将其转换为 time.Time。对其他时间字段也执行此操作

data.StartAt = time.Unix(result.CurrentPeriodStart, 0)
  1. cannot use result.Customer (type *stripe.Customer) as type string in assignment

与上述类似的问题,当您尝试将其设置为 type 的字段时,该字段是 typeresult.Customer的。客户 ID 是结构中的一个字段*stripe.CustomerstringCustomer

data.CustomerId = result.Customer.ID
  1. result.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)

stripe.SubscriptionItem结构没有字段price。我不确定你在这里想要什么。我建议阅读订阅对象文档


查看完整回答
反对 回复 2023-02-06
?
喵喔喔

TA贡献1735条经验 获得超5个赞

访问价格result.Items.Data[0].Price.UnitAmount

如果您使用调试器,只需sub.New在行后放置一个断点并探索结果变量的内容


查看完整回答
反对 回复 2023-02-06
  • 3 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信