如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?

Posted

技术标签:

【中文标题】如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?【英文标题】:How/Can I call FASTAPI async function within a stripe webhook handler or is my approach completely wrong? 【发布时间】:2022-01-09 14:37:45 【问题描述】:

从高层次上讲,我正在尝试实现条带 webhook,并且我想通过将数据库中的值更新为 true 来处理成功的事件。我采用的方法是创建一个名为 handle_verification 的异步函数,它获取当前登录用户并更新 id_verified 标志。

@app.get("/user")
async def get_current_user(authorize: AuthJWT = Depends()):
    authorize.jwt_required()
    id = authorize.get_jwt_subject()
    return await User_Pydantic.from_queryset_single(UserModel.get(id=id))

@app.put('/user/verify')
async def handle_verification():
    user = await get_current_user()
    await UserModel.filter(id=user.id).update(id_verified = True)

我在这里尝试在 webhook 代码中调用这个函数

@app.post('/create-verification-session')
async def create_verification_session(request: Request):
    verification_session = stripe.identity.VerificationSession.create(
        type='document',
    )
    return verification_session.client_secret

@app.post('/verification-session-webhook')
async def webhook(request: Request ):
    webhook_secret = os.getenv('STRIPE_WEBHOOK_SECRET')
    data = await request.body()
    print(data)
    signature = request.headers.get('stripe-signature')
    try:
        event = stripe.Webhook.construct_event(
            payload=data,
            sig_header=signature,
            secret=webhook_secret
        )
        event_data = event['data']['object']
    except stripe.error.SignatureVerificationError as e:
        print(str(e))
        return 'error': str(e)
    event_type = event['type']
    
    if event_type == 'identity.verification_session.created':
        print("Started verification")

        print(event_data.url)
    if event_type == 'identity.verification_session.verified':
        print("All the verification checks passed")
        await handle_verification()
    return 'status': "success"

我得到了错误

AttributeError: 'Depends' object has no attribute 'jwt_required

我知道这个错误来自get_current_user(),因为异步顺序搞砸了。我尝试将 handle_verification 放入使用 asyncio.run() 的同步包装函数中,但没有成功。

我尝试了各种不同的修复尝试,我认为核心问题是我仍在学习异步和 webhook 以及所有爵士乐,所以我完全被难住了。我将不胜感激对我解决此问题的方法的任何帮助,以及对可能比我现在所拥有的更容易的不同方法的任何见解。提前谢谢大家!

【问题讨论】:

【参考方案1】:

我对 FastAPI 和 FastAPI JWT Auth 不太熟悉,但我会尽力提供帮助。

我查看了FastAPI JWT Auth 示例,在我看来,您想从get_current_user() 函数中删除async 说明符。我发现的所有示例都确保这部分代码是同步的。希望这就是确保您不调用.jwt_required()之前您的authorize 对象被正确实例化所需要的全部内容。

【讨论】:

嗨,刚刚尝试了这种方法,我又遇到了另一个错误。 ValueError: [TypeError("'coroutine' object is not iterable"), TypeError('vars() argument must have __dict__ attribute')] 我怀疑 Pydantic 的工作原理是我必须让它异步 我发现有趣的是,所有 FastAPI JWT Auth 代码示例都使用同步函数定义,而所有 FastAPI 示例都使用异步。有点难以解开。

以上是关于如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?的主要内容,如果未能解决你的问题,请参考以下文章

配置条带 webhook,测试 webhook 错误:无法连接

使用 ngrok 的条带 webhook 没有答案

条带订阅 webhook

条带 webhook 未按正确顺序传入的错误

重定向到条带后丢失会话数据

Webhook 签名验证失败并出现快速条带