You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Stripe API获取卡片列表异常:无法返回全部卡片的问题求助

解决方案:同时获取Stripe的传统卡片(card_xx)和支付方式卡片(pm_xx)

一、问题根源

Stripe在API版本2019-02-11之后引入了Payment Methods(ID以pm_开头)作为统一的支付方式资源,替代了原来的传统Card(ID以card_开头)资源。移动端SDK通常默认使用新的Payment Methods API创建卡片,而你当前调用的/v1/customers/{customer_id}/cards端点仅返回旧的Card对象,所以拿不到移动端添加的pm_开头的卡片。

二、分步实现方案

1. 切换到统一的Payment Methods端点获取所有卡片类支付方式

推荐使用Stripe的Customer Payment Methods API来获取关联到客户的所有卡片类型支付方式,这个端点会同时返回:

  • 新创建的pm_开头的Payment Methods
  • 已自动迁移到Payment Methods的旧card_开头的卡片(默认情况下Stripe账户会开启自动迁移)

调用的API端点和参数:

GET /v1/customers/{CUSTOMER_ID}/payment_methods?type=card

对应的Node.js代码示例:

const stripe = require('stripe')('your_secret_api_key');

const getCustomerAllCards = async (customerId) => {
  const paymentMethods = await stripe.customers.listPaymentMethods(
    customerId,
    { type: 'card' }
  );
  // 返回的data数组包含所有卡片类支付方式,不管ID前缀是card_还是pm_
  return paymentMethods.data;
};

返回的每个payment_method对象里,卡片核心信息都在card字段下,比如payment_method.card.last4(卡号后四位)、payment_method.card.brand(卡片品牌)、payment_method.card.exp_month/exp_year(有效期),你可以直接提取这些字段做统一展示。

2. 兼容未迁移场景:同时获取传统Cards和Payment Methods(可选)

如果你的账户未开启自动迁移,或者需要兼容历史遗留的旧Card对象,可以同时调用两个API端点,转换结构后合并去重:

const getCustomerAllCards = async (customerId) => {
  // 获取旧的Card对象
  const oldCardList = await stripe.customers.listCards(customerId);
  // 获取Payment Methods卡片
  const paymentMethodList = await stripe.customers.listPaymentMethods(
    customerId,
    { type: 'card' }
  );

  // 把旧Card对象转换成和Payment Methods一致的结构
  const convertedOldCards = oldCardList.data.map(card => ({
    id: card.id,
    card: {
      last4: card.last4,
      brand: card.brand,
      exp_month: card.exp_month,
      exp_year: card.exp_year
    },
    created: card.created
  }));

  // 合并并去重(根据ID避免重复数据)
  const allCards = [...convertedOldCards, ...paymentMethodList.data].filter((item, index, self) => 
    index === self.findIndex(t => t.id === item.id)
  );

  return allCards;
};

3. 前端展示统一处理

不管卡片ID是card_还是pm_前缀,展示时只需要提取统一的卡片信息字段即可,完全不需要区分ID类型,用户感知不到差异。

三、注意事项

  • 确保你的Stripe API版本在2019-02-11及以上,旧版本API可能不支持Payment Methods的完整功能。
  • 建议升级到最新版的Stripe官方SDK,避免版本差异导致的调用问题。

内容的提问来源于stack exchange,提问作者Bhavesh Chauhan

火山引擎 最新活动