我正在使用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));
感谢您的帮助。
答案 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})
})
})
}