При вызове Stripe::Customer.all(:limit => 100)
существует предел 100 за звонок. У нас намного больше клиентов, и я хотел бы получить их сразу. Я что-то пропустил, или это возможно только путем написания наивного цикла, который проверяет атрибут has_more
, а затем делает новый вызов до has_more = false
?
Какова наилучшая практика извлечения всех клиентов из Stripe API в один список
Ответ 1
Вы правы, вы должны написать простой цикл с курсором для документов полосы:
starting_after
по желанию
Курсор для использования в нумерации страниц.
starting_after
- это идентификатор объекта, который определяет ваше место в списке. Например, если вы делаете запрос списка и получаете 100 объектов, оканчивающихся наobj_foo
, ваш последующий вызов может включать в себяstarting_after=obj_foo
для получения следующей страницы списка.
Вот один на тот случай, если кому-то понадобится быстрая копирование-вставка.
def self.all_stripe_customers
starting_after = nil
customers = []
loop do
results = Stripe::Customer.list(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
Возможно, немного поздно для игры здесь, но здесь дающая версия ответа Дуга, которая проходит по каждому клиенту, превращая их в блок:
def each_stripe_customer
starting_after = nil
loop do
customers = Stripe::Customer.list(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
Это отвлекает клиентов от того, как вы на самом деле хотите их использовать.
Ответ 3
Другой вариант - перейти на Stripe Dashboard и экспортировать всех клиентов в файл CSV. Возможно, не лучший подход, так как вы не будете получать обновления, но это вариант.
Ответ 4
Я бы предложил сохранить локальную копию данных клиента. поэтому вы получаете данные из Stripe API только один раз и используете эту локальную копию вместо того, чтобы снова запрашивать эти же данные снова.
Для синхронизации изменений, Существует два основных подхода, которые вы можете использовать, чтобы убедиться, что ваша база данных имеет последнее состояние:
-
В коде, который вызывает вызовы API для Stripe, убедитесь, что вы также обновляете свою локальную копию, или
-
Используйте webhooks, чтобы прослушать события, связанные с ваши клиенты (например,
customer.created
,customer.deleted
и т.д.). Поступая таким образом, вы можете быть уверены, что ваша локальная база данных всегда совпадает с Stripe - даже если вы измените свой план клиента с помощью панели управления, конечная точка вашего веб-узла получит обновление.
Основным преимуществом хранения этих данных локально, помимо ограничения API, является скорость.
Вам нужно убедиться, что вы храните идентификатор клиента в своей базе данных, чтобы вы могли сопоставить клиента Stripe с вашим местным пользователь.
Надеюсь, что это поможет