Какова наилучшая практика извлечения всех клиентов из Stripe API в один список

При вызове Stripe::Customer.all(:limit => 100) существует предел 100 за звонок. У нас намного больше клиентов, и я хотел бы получить их сразу. Я что-то пропустил, или это возможно только путем написания наивного цикла, который проверяет атрибут has_more, а затем делает новый вызов до has_more = false?

Ответ 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 с вашим местным пользователь.

Надеюсь, что это поможет