从Stripe API检索所有客户到一个列表的最佳做法是什么

时间:2014-04-30 16:22:29

标签: ruby stripe-payments

致电Stripe::Customer.all(:limit => 100)时,每次通话限制为100。我们有比这更多的客户,我想立刻得到它们。我是否遗漏了某些内容,或者这只能通过编写一个检查has_more属性的天真循环然后在has_more = false之前拨打新电话来实现?

6 个答案:

答案 0 :(得分:12)

这里游戏可能有点晚了,但这里是道格答案的一个让步版本,它循环遍历每个客户,让他们陷入困境:

def each_stripe_customer
  starting_after = nil
  loop
    customers = Stripe::Customer.all(limit: 100, starting_after: starting_after)
    break if customers.data.length == 0
    customers.each do |customer|
      yield customer
    end
    starting_after = customers.data.last.id  
  end
end

您可以按如下方式使用:

each_stripe_customer do |customer|
  puts customer.id
end

这样可以抽取客户,但实际上是想要使用它们。

答案 1 :(得分:10)

你是对的,你必须用光标per the stripe docs写一个简单的循环:

  

starting_after

     

可选的

     

用于分页的游标。 starting_after是一个对象ID,用于定义列表中的位置。例如,如果您发出列表请求并接收100个以obj_foo结尾的对象,则后续调用可以包含starting_after=obj_foo,以便获取列表的下一页。

以下是一个以防任何人需要快速复制粘贴的内容。

  def self.all_stripe_customers
    starting_after = nil
    customers = []
    loop
      results = Stripe::Customer.all(limit: 100, starting_after: starting_after)
      break if results.data.length == 0
      customers = customers + results.data
      starting_after = results.data.last.id  
    end
    return customers
  end

答案 2 :(得分:0)

另一个选择是转到Stripe Dashboard,并将所有客户导出到CSV文件。 也许不是最好的方法,因为您将无法获得更新,但这是一个选择。

答案 3 :(得分:0)

在文档中添加“自动分页”,https://stripe.com/docs/api/pagination/auto

customers = Stripe::Customer.list({limit: 10})
customers.auto_paging_each do |customer|
  # Do something with customer
end

答案 4 :(得分:0)

由于谷歌指出这里并且问题只在标签中提到了ruby,如果有人需要python代码,这里是@Doug的回答“翻译 >python 条带 api,然后泛化得到 any 条带对象:

import stripe #https://stripe.com/docs/api?lang=python
# must loop e.g.: https://stackoverflow.com/questions/23393300/what-is-the-best-practice-to-retrieve-all-customers-from-stripe-api-into-one-lis
def get_all_stripe_objects(stripe_listable):
    objects = []
    get_more = True
    starting_after = None
    while get_more:
        #stripe.Customer implements ListableAPIResource(APIResource):
        resp = stripe_listable.list(limit=100,starting_after=starting_after)
        objects.extend(resp['data'])
        get_more = resp['has_more']
        if len(resp['data'])>0:
            starting_after = resp['data'][-1]['id']
    return objects
all_stripe_customers = get_all_stripe_objects(stripe.Customer)
all_stripe_products  = get_all_stripe_objects(stripe.Product)

答案 5 :(得分:-2)

我建议保留客户数据的本地副本。所以你只能从Stripe API获取数据一次&使用该本地副本而不是再次询问相同的数据。

用于同步更改, 您可以使用两种主要方法来确保数据库具有最新状态:

除了克服API限制之外,将本地数据存储在本地的主要好处是速度。

您需要确保在数据库中存储customer ID,以便将Stripe客户与本地用户进行匹配。

希望有所帮助