致电Stripe::Customer.all(:limit => 100)
时,每次通话限制为100。我们有比这更多的客户,我想立刻得到它们。我是否遗漏了某些内容,或者这只能通过编写一个检查has_more
属性的天真循环然后在has_more = false
之前拨打新电话来实现?
答案 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获取数据一次&使用该本地副本而不是再次询问相同的数据。
用于同步更改, 您可以使用两种主要方法来确保数据库具有最新状态:
在对Stripe进行API调用的代码中,请确保您还要更新本地副本,或者
使用webhooks收听events related to your customers (e.g., customer.created
, customer.deleted
etc)。通过这样做,您可以确保您的本地数据库始终与Stripe匹配 - 即使您通过仪表板更改了客户的计划,您的webhook端点也将收到更新。
除了克服API限制之外,将本地数据存储在本地的主要好处是速度。
您需要确保在数据库中存储customer ID,以便将Stripe客户与本地用户进行匹配。
希望有所帮助