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

Stripe Android:添加卡片时SourceRetrievalListener回调未触发

解决CustomerSession.addCustomerSource回调未触发的问题

我之前在集成卡片管理功能时也碰到过几乎一模一样的情况——卡片明明已经成功添加到用户账户,但SourceRetrievalListener的回调就是没触发,导致等待流程卡住。结合踩过的坑,给你几个实用的排查和解决方向:

1. 优先检查Context的生命周期问题

你调用时传的是getContext(),如果这个Context属于Fragment或者Activity,很可能因为页面生命周期变化(比如Fragment detach、Activity进入后台)导致Listener被回收或者无法正常接收回调:

  • 试试改用Application Context:getApplicationContext(),它的生命周期和应用一致,不会因为页面销毁而失效;
  • 避免使用匿名内部类作为Listener:如果Listener是匿名内部类,可能会被GC提前回收。建议把Listener定义成Activity/Fragment的成员变量,保持强引用。

2. 确认CustomerSession的状态是否正常

在调用addCustomerSource之前,先检查Session的连接状态:

if (CustomerSession.getInstance().isConnected()) {
    // 执行添加卡片操作
} else {
    // 重新初始化CustomerSession,确保会话有效
}

如果Session已经断开或者状态异常,回调消息可能无法正确分发到前端。

3. 别忽略错误回调!

很多时候我们只关注成功回调,但其实可能是发生了错误却没处理,导致误以为回调没触发。一定要实现onError方法,打印错误信息:

new CustomerSession.SourceRetrievalListener() {
    @Override
    public void onSourceRetrieved(Source source) {
        // 处理成功逻辑
    }

    @Override
    public void onError(int errorCode, String errorMessage) {
        // 关键:打印错误,排查问题根源
        Log.e("CardAddError", "Code: " + errorCode + ", Message: " + errorMessage);
    }
}

说不定能看到比如网络超时、权限问题之类的提示,帮你快速定位。

4. 检查SDK版本兼容性

部分旧版本的SDK存在回调触发异常的bug,建议升级到最新稳定版。可以在项目的build.gradle里更新依赖版本,比如:

implementation 'com.stripe:stripe-android:x.y.z' // 替换为最新版本号

5. 验证Token参数的正确性

虽然卡片最终能显示,但还是确认下传入的token.getId()和token.getType()是否正确:

  • token.getType()应该是"card"(对应卡片类型的Token);
  • 确保Token是通过合法流程生成的(比如官方输入组件生成的有效Token)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:36