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

我正在尝试从条带响应对象的结构中获取一些数据以进行订阅。这是响应对象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?


郎朗坤
浏览 137回答 3
3回答

心有法竹

让我们首先回顾一下幕后工作的代码,返回的是什么,然后我们一次一个地查看问题。当我们用它调用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.Timedata.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"`}它包含一个字段名称Data,Data类型[]*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将不同的类型分配给彼此会再次导致错误,因此您可以转换int64为float64或者更好的是您可以使用包含的类型中UnitAmountDecimal可用的字段格式Price相同的数据float64将减少我们在使用UnitAmount字段时必须进行的显式转换,因此根据我们得到以下解决方案的解释data.PricePerSeat = result.Items.Data[0].Price.UnitAmountDecimal

千巷猫影

查看您提到的3个错误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)cannot use result.Customer (type *stripe.Customer) as type string in assignment与上述类似的问题,当您尝试将其设置为 type 的字段时,该字段是 typeresult.Customer的。客户 ID 是结构中的一个字段*stripe.CustomerstringCustomerdata.CustomerId = result.Customer.IDresult.Items.Data.price undefined (type []*stripe.SubscriptionItem has no field or method price)stripe.SubscriptionItem结构没有字段price。我不确定你在这里想要什么。我建议阅读订阅对象文档。

喵喔喔

访问价格result.Items.Data[0].Price.UnitAmount如果您使用调试器,只需sub.New在行后放置一个断点并探索结果变量的内容
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go