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
相关产品推荐
相关产品推荐

