Node.js - 处理 webhook 和更新快速会话

Node.js - Handling a webhook and updating an express-session

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

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

我还使用 webhooks 来“重置”他们对成功的卡收费的计划限制。因此,每个月,在每次成功收费 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 秒!

我自己解决了这个问题。

解决方案 #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 中的字符串化功能,它也有助于执行 MongoDB 的原子更新。

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