You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Stripe临时密钥提供者API版本及覆盖EphemeralKeyListener

解决Stripe Ephemeral Key API版本修改问题

我刚好踩过类似的坑,给你一步步拆解解决方案,完全不需要修改Stripe库的源码,官方推荐的方式是从后端配置和客户端适配入手:

1. 核心破局点:后端生成密钥时显式指定API版本

你的控制台默认API版本是2019-03-14,但Android SDK仍用旧版本的根本原因是:如果后端生成临时密钥时没有明确指定API版本,Stripe会默认使用你首次创建账号时的旧版本(或SDK内置的默认版本)。所以第一步要在后端代码里强制锁定API版本:

举个Node.js后端的示例(其他语言逻辑完全一致):

// 初始化Stripe客户端时就指定目标API版本
const stripe = require('stripe')('你的秘钥', {
  apiVersion: '2019-03-14',
});

// 创建临时密钥的接口
app.post('/create-ephemeral-key', async (req, res) => {
  const customerId = req.body.customerId;
  // 这里再次显式指定版本,避免全局配置意外失效
  const ephemeralKey = await stripe.ephemeralKeys.create(
    { customer: customerId },
    { apiVersion: '2019-03-14' }
  );
  res.json(ephemeralKey);
});

这样后端返回的临时密钥会携带2019-03-14的版本标识,客户端就能正确解析。

2. 客户端适配:两种方式覆盖默认版本(针对SampleStore示例)

针对你用的SampleStore代码,有两种简单的修改路径:

方式一:初始化Stripe时直接指定API版本(推荐)

如果你的Stripe Android SDK版本在16.0.0以上,可以直接在初始化Stripe实例时设置目标版本,完全绕过SDK默认的旧版本:

// 替换原来的Stripe初始化代码
StripeConfiguration config = new StripeConfiguration.Builder()
    .setPublishableKey("你的公钥")
    .setStripeApiVersion("2019-03-14") // 这里直接设置你需要的版本
    .build();

Stripe stripe = new Stripe(getApplicationContext(), config);

之后调用createEphemeralKey时,SDK会自动使用你指定的版本处理请求和响应。

方式二:自定义EphemeralKeyListener直接使用密钥JSON

如果你用的SDK版本较低,或者不想修改初始化逻辑,可以自定义Listener,直接使用后端返回的密钥JSON字符串,不需要依赖SDK的默认版本解析:

stripe.createEphemeralKey(customerId, new EphemeralKeyListener() {
    @Override
    public void onEphemeralKeyUpdate(@Nullable String ephemeralKeyJson, @Nullable StripeError error) {
        if (error != null) {
            // 处理错误逻辑,比如Toast提示用户
            return;
        }
        // 直接使用后端返回的ephemeralKeyJson,比如传递给PaymentSession
        if (ephemeralKeyJson != null) {
            PaymentSessionConfig sessionConfig = new PaymentSessionConfig.Builder()
                .build();
            mPaymentSession.init(sessionConfig, ephemeralKeyJson, customerId, this);
        }
    }

    @Override
    public void onRequestHeaders(@NonNull Map<String, String> headers) {
        // 不需要自定义请求头的话留空即可
    }
});

这种方式的核心是:后端已经生成了对应版本的密钥,客户端只需要原样使用即可,不用管SDK默认的版本。

3. 关键注意事项

  • 后端和客户端的API版本必须严格一致,否则会出现签名不匹配或字段解析错误的问题。
  • 绝对不要修改Stripe库的ApiVersion.java文件,这样会导致后续SDK升级时出现冲突,官方也不会提供任何支持。
  • 排查问题时可以先检查后端返回的密钥JSON里的api_version字段,确认是不是2019-03-14,这是验证配置是否生效的关键。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:09:55