如何使用条带API

时间:2017-02-20 20:06:07

标签: php api stripe-payments

我正在使用PHP条带API来检索特定条带帐户的所有客户的列表。我只需要客户对象的电子邮件地址。

以下功能运作良好,但只返回10位客户。

  function getListOfCustomers($stripe){
        \Stripe\Stripe::setApiKey($stripe['secret_key']);
        $list_of_customers = \Stripe\Customer::all(array());
        return $list_of_customers['data']; 

    }

在阅读有关API的here后,它告诉我"限制"参数(即\Stripe\Customer::all(array("limit" => 3));)是可选的,"默认限制是10"。 所以我想这就是为什么它只返回10个客户。

我想返回无限量的客户。 我想知道有人知道该怎么做吗?

我还在same page上阅读了以下内容:

  

您可以选择请求回复包含与您的过滤条件匹配的所有客户的总数。为此,请指定   在您的请求中包含[] = total_count。

然而,它并没有告诉我如何在我的请求中包含这个"。 我尝试了以下但是我收到了语法错误。

$list_of_customers = \Stripe\Customer::all(array(), include[]=total_count);

我也试过了:

$list_of_customers = \Stripe\Customer::all(array(include[]=total_count));

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

如果您想检索客户总数,那么total_count是最佳解决方案。你的代码看起来像这样:

$firstCustomerPage = \Stripe\Customer::all([
  "limit" => 1,
  "include[]" => "total_count"
]);
$nbCustomers = $firstCustomerPage->total_count;

但这并不能让所有客户回归。它只返回第一页,这里限于一个元素,以及总数。通过Stripe的API,您永远不会同时获得超过100个对象。

如果您想要遍历所有客户以专门寻找一个,最好的解决方案是使用自动分页。你的代码看起来像这样:

$customers = \Stripe\Customer::all(array("limit" => 100));
foreach ($customers->autoPagingIterator() as $customer){
     echo "Current customer: $customer";
}     

它不会立即将所有客户存储在$ customers中,而只会存储在一个页面中。但是当你到达那个页面中的最后一个时,迭代器会自动为你提取下一页。

答案 1 :(得分:0)

并非完全针对Customer对象,但是我正在使用Event对象,并通过在JavaScript中编写递归函数来获取所有Event(超过100个限制)。请注意,我如何使用“ hasMore”字段提取下一组100个事件,直到“ hasMore” == false。

    const stripe = require('stripe')(process.env.STRIPE)

module.exports = async function importCanceledSubscription ({$models}) {
  const {StripeEvent} = $models

  async function createEvents (last_id) {
    const {events, hasMore, nextId} = await getStripeEvents(last_id)

    let error = false

    for (const e of events) {
      const stripeObj = new StripeEvent
      stripeObj.id = e.id
      stripeObj.object = e.object
      stripeObj.api_version = e.api_version
      stripeObj.created = e.created
      stripeObj.type = e.type
      stripeObj.livemode = e.livemode
      stripeObj.pending_webhooks = e.pending_webhooks
      stripeObj.request = e.request
      stripeObj.data = e.data

      try {
        await stripeObj.save()
      } catch (e) {
        console.log('duplicate found')
        error = true
        break
      }
    }

    if (hasMore && !error) {
      await createEvents(nextId)
    }
  }

  await createEvents()
}


function getStripeEvents (last_id) {
  return new Promise((resolve) => {
    stripe.events.list({limit: 100, type: 'customer.subscription.deleted', starting_after: last_id}, (err, event) => {
      if (err) console.log(err)

      const events = event.data

      const nextId = event.data[event.data.length - 1].id

      resolve({nextId, events, hasMore: event.has_more})
    })
  })

}