如何解决Stripe Express关联账户未完成入驻导致的报错问题
Stripe Connect Express 账户入驻中断问题修复方案
问题根因
当前逻辑在调用createExpressAccount接口生成账户后就立即将账户ID存入本地,而未完成入驻流程、未完成核心信息验证的Express账户会被Stripe定期自动清理,导致本地存储的账户ID为无效值,后续调用账户查询、登录链接生成等接口时就会抛出异常。
解决方案
调整账户ID存储时机
取消创建账户后立即存储ID的逻辑,改为两种验证通过后再写入本地:
- 监听Stripe
account.updatedwebhook事件,当事件中账户的details_submitted字段变为true、或charges_enabled字段变为true时,再将对应账户ID与用户邮箱绑定存入本地 - 创建AccountLink时配置
return_url参数,用户完成入驻后跳转回该地址时,当场调用accountRetrieve接口校验账户状态,校验通过后存储账户ID,做双重保障
- 监听Stripe
现有逻辑增加异常兼容
给账户查询逻辑增加异常捕获,针对「账户不存在」的错误做降级处理,示例修改代码如下:
if ($accID != "") { try { $userAccount = $this->stripe_lib->accountRetrieve($accID); $chargesEnabled = $userAccount->charges_enabled; // 生成Stripe登录链接的原有逻辑 $loginStripeLink = $this->stripe_lib->createLoginLink($accID); $profiledata["loginLink"] = $loginStripeLink->url; } catch (\Stripe\Exception\InvalidRequestException $e) { // 匹配账户不存在的错误 if (str_contains($e->getMessage(), 'No such account')) { // 删除本地无效的账户ID记录,需自行实现对应删除方法 $this->Profiles_model->delete_stripe_account($email); $accID = ""; } else { // 其他异常正常抛出处理 throw $e; } } } if ($accID == "") { // 原有创建新Express账户、生成AccountLink的逻辑 $this->load->library('stripe_lib'); $this->load->model('products_model'); $account = $this->stripe_lib->createExpressAccount(); $accountLink = $this->stripe_lib->createAccountLink($account->id); $profiledata["accountLink"] = $accountLink->url; // 这里暂时删除存储账户ID的逻辑,等后续验证通过后再写入 }补充无效数据定时清理机制
新增定时任务,定期清理本地存储的、创建时间超过24小时仍未完成激活的Stripe账户ID,避免无效数据堆积。
内容的提问来源于stack exchange,提问作者Kevin K
相关产品推荐
相关产品推荐

