Node JS调用Stripe API获取超100条charge数据的实现方案问询
实现方案
核心逻辑
通过循环动态拼接Stripe分页参数starting_after,每次请求后判断返回结果的has_more字段,若为true则取当前批次最后一条数据的ID作为下一次请求的分页起点,直到has_more返回false后停止循环,合并所有批次的返回数据即可得到全量交易数据。
完整实现代码
const axios = require('axios'); // 请替换为你自己的配置参数 const URL = 'https://api.stripe.com/v1/charges'; const created = 1672531200; // 数据起始时间戳 const createdEnd = 1704067199; // 数据结束时间戳 const limit = 100; const bearer = '你的Stripe密钥'; const stripe_account = '你的Stripe关联账户ID(无关联账户可删除该字段)'; // 改造原有请求函数,支持传入分页起始ID async function getData(startingAfter = null) { const response = await axios.get(URL, { // 使用axios的params配置自动处理参数转义,无需手动拼接 params: { created: { gte: created, lte: createdEnd }, limit: limit, starting_after: startingAfter || undefined // 空值时axios会自动忽略该参数 }, headers: { Authorization: `Bearer ${bearer}`, "Stripe-Account": `${stripe_account}`, } }); return response.data; } // 全量拉取主逻辑 async function getAllCharges() { const allCharges = []; let lastId = null; let hasMore = true; while (hasMore) { const currentRes = await getData(lastId); // 合并当前批次数据到全量数组 allCharges.push(...currentRes.data); // 更新循环条件和下一次分页起点 hasMore = currentRes.has_more; if (hasMore) { lastId = currentRes.data.at(-1).id; } // 可选:添加100ms延时,避免触发Stripe API速率限制,可根据实际情况调整 await new Promise(resolve => setTimeout(resolve, 100)); } return allCharges; } // 调用示例 getAllCharges() .then(charges => { console.log(`全量拉取完成,共${charges.length}条交易数据`); // 后续业务处理逻辑 }) .catch(err => { console.error('拉取失败,错误信息:', err); });
逻辑说明
- 改造原有
getData函数,增加可选的startingAfter入参,适配分页查询需求,使用axios自带的params配置自动处理参数转义,比手动拼接URL更稳妥 - 循环逻辑通过
has_more字段控制,只有存在更多数据时才会发起下一次请求 - 每次请求完成后将当前批次数据合并到全量数组,避免数据丢失
- 可选添加的延时逻辑可以有效避免请求频率过高触发Stripe的限流规则,若你的账号API请求配额较高可以删除该逻辑
- 如需提升稳定性,可在
getData中添加请求失败重试逻辑,避免偶发网络波动导致整个拉取流程中断
内容的提问来源于stack exchange,提问作者Meraj Kazi
相关产品推荐
相关产品推荐

