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

使用Stripe API保存Connect账户密钥失败,遇invalid_grant错误

解决Stripe Connect授权码重复使用导致的invalid_grant错误

首先,这个错误的核心原因很明确:Stripe的授权码(authorization code)是一次性的,一旦用来兑换过access_token就会立即失效,你现在的问题就是重复使用了同一个授权码。下面是一步步的排查和解决方法:

1. 先排查代码中的重复调用问题

  • 检查你的代码逻辑,是不是不小心多次执行了get_raw_access_token方法,并且传入了同一个授权码?比如调试时重复运行代码片段、前端重复提交授权回调请求,或者从缓存/数据库里读取了旧的授权码重新使用。
  • 建议在请求前加日志记录授权码的值,这样能快速确认是不是同一个码被多次发送:
    print(f"使用的授权码: {data.get('code')}")
    resp = stripe_connect_service.get_raw_access_token(method='POST', data=data)
    

2. 规范Stripe Connect的授权流程

Stripe Connect的正确授权流程应该是这样的:

  1. 用户跳转到Stripe的授权页面完成授权
  2. Stripe通过回调URL给你的服务返回一个新鲜的一次性授权码code
  3. 你立即用这个code调用Stripe API兑换access_token等账户信息,且仅调用一次
  4. 兑换成功后,把获取到的access_token、stripe_user_id等信息保存到数据库

要确保你每次都是用回调里刚拿到的新code,而不是复用之前的旧码。

3. 修复数据库保存的逻辑

你提到保存密钥失败,大概率是因为授权错误导致没有拿到有效的账户信息。建议先在代码里增加错误判断,再执行保存操作:

resp = stripe_connect_service.get_raw_access_token(method='POST', data=data)
connect_account_info = json.loads(resp.text)

# 先判断授权是否成功
if 'error' in connect_account_info:
    # 记录错误日志,不要继续执行保存逻辑
    print(f"Stripe授权失败: {connect_account_info['error_description']}")
    # 可以返回错误响应给前端
    return

# 授权成功后再提取信息并保存
connect_public_key = connect_account_info['stripe_publishable_key']
connect_access_token = connect_account_info['access_token']
connect_user_id = connect_account_info['stripe_user_id']
connect_refresh_token = connect_account_info.get('refresh_token')  # 用get避免KeyError

# 这里执行数据库保存操作,比如用ORM或者SQL语句
# 示例(假设用Django ORM):
# ConnectAccount.objects.create(
#     stripe_user_id=connect_user_id,
#     access_token=connect_access_token,
#     publishable_key=connect_public_key,
#     refresh_token=connect_refresh_token
# )

4. 额外调试建议

  • 切换到Stripe的测试模式进行调试,避免影响生产环境的账户数据
  • 登录Stripe Dashboard,查看你的Connect账户列表,确认对应的用户账户是否已经存在(如果之前用同一个授权码兑换成功过,账户应该已经在列表里了)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:47:10