【问题标题】:Node.js - Handling a webhook and updating an express-sessionNode.js - 处理 webhook 并更新快速会话
【发布时间】:2021-09-23 15:26:17
【问题描述】:

我正在使用 Stripe 让我的客户更改他们的计划,我们将他们发送到 external Stripe-hosted page 以完成结帐。在他们结帐后,Stripe 将他们发送回感谢页面并启动一个 webhook。

webhook 很棒,因为它不会更新任何数据库信息或更改他们的计划,直到付款成功并且他们的卡已被扣款。

我还使用 webhook 来“重置”他们对成功的信用卡收费的计划限制。因此,每个月,在每个成功的收费 webhook 上,限制都会更新。但如果用户在更新时处于活动会话中,我应该更新该会话。

但我正在努力解决的是,在 webhook 事件中如何更新活动的快速会话?

没有 req.session 对象,因为“事件”来自 Stripe 的 webhook。

app.post('/webhook', async (req, res) => {

    /* <-- Update the database, which is good --> */
    database.updateUser()

    /* <-- Update their session if it's active --> */

    // This won't work, because there is no req.session and no cookie being sent!
    req.session.user.plan = parseWebhookData()

    // I can't access the store, because I don't know the user's session id
    // Plus, all my store is encrypted so I can't do a MongoDb query search for their session.
    store.get(sid, callback)

    // How do I update their session??
})

到目前为止,我唯一的解决方案是让数据库在他们访问的每个页面上重新更新他们的信息。但这会使我每页的响应时间减慢 1 秒!

【问题讨论】:

  • 您好,找到解决方法了吗?我也有类似的情况。
  • @ShankarMorwal 刚刚想通了,看看我的回答 :)

标签: node.js express session stripe-payments webhooks


【解决方案1】:

我自己解决了这个问题。

解决方案 #1:Stripe 推荐:在登录时更新用户,而不是使用 webhook

Stripe 建议在登录时检查用户的订阅,并在登录时重置他们的“计划使用情况”,而不是在 webhook 上重置他们的计划使用情况。

我认为这很有趣,实施后我发现这是一个比尝试处理 Webhook 和会话对象更好的解决方案!

解决方案 #2: 获取会话 ID 并更新快速会话数据库!

Express-session 在“req.sessionID”中为您提供 sessionID,以便您可以在数据库中搜索 sessionID 并更新您需要的内容。

app.get('/getID', (req, res) => {
    console.log("sessionID: " + req.sessionID);
    res.send(req.sessionID);
});

如果您在 express-session 中关闭 stringify 功能,也有助于执行 MongoDB 的原子更新。

const store = MongoStore.create({
    stringify:false
});

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 2021-03-19
    • 1970-01-01
    • 2015-11-01
    • 2020-05-07
    • 1970-01-01
    • 2016-11-23
    • 2012-12-09
    • 2012-12-11
    相关资源
    最近更新 更多