Node.js 如何使用stripe Webhook更新用户的订阅日期?

Node.js 如何使用stripe Webhook更新用户的订阅日期?,node.js,mongoose,stripe-payments,webhooks,Node.js,Mongoose,Stripe Payments,Webhooks,我正在node.js中构建一个订阅计划,我阅读了关于如何向用户订阅计划的文档,并且获得了成功 Stripe的doc声明我必须在数据库中存储一个活动的_until字段。它说,当使用webhook时发生变化,我知道webhook就像一个事件 真正的问题是 1我如何使用active\u每月重复账单直到? 2我怎么使用webhook,我真的不明白 这是到目前为止的代码。 var User=newmongoose.Schema{ 电子邮件:String, 条纹:{ customerId:String, 计

我正在node.js中构建一个订阅计划,我阅读了关于如何向用户订阅计划的文档,并且获得了成功

Stripe的doc声明我必须在数据库中存储一个活动的_until字段。它说,当使用webhook时发生变化,我知道webhook就像一个事件

真正的问题是

1我如何使用active\u每月重复账单直到? 2我怎么使用webhook,我真的不明白

这是到目前为止的代码。 var User=newmongoose.Schema{ 电子邮件:String, 条纹:{ customerId:String, 计划:字符串 }

});

//payment route
router.post('/billing/:plan_name', function(req, res, next) {
  var plan = req.params.plan_name;
  var stripeToken = req.body.stripeToken;
  console.log(stripeToken);

  if (!stripeToken) {
    req.flash('errors', { msg: 'Please provide a valid card.' });
    return res.redirect('/awesome');
  }

  User.findById({ _id: req.user._id}, function(err, user) {
    if (err) return next(err);

    stripe.customers.create({
      source: stripeToken, // obtained with Stripe.js
      plan: plan,
      email: user.email
    }).then(function(customer) {
      user.stripe.plan = customer.plan;
      user.stripe.customerId = customer.id;
      console.log(customer);
      user.save(function(err) {
        console.log("Success");
        if (err) return next(err);
        return next(null);
      });
    }).catch(function(err) {
      // Deal with an error
    });

    return res.redirect('/');

  });
});

在时间戳和webhook事件之前,我如何实现活动\u?

您不需要每个月重复账单。Stripe会帮您完成。 一旦您为用户订阅了一个计划,stripe将向用户收取费用,直到付费期结束

每次stripe向客户收费时,它都会生成一个webhook,即服务器上对某个指定URL的请求。stripe可以出于不同的原因生成不同的webhook

例如,当客户按订阅收取费用时,Stripe将向您发送有关付款的信息

router.post('/billing/catch_paid_invoice', function(req, res) {
    // Here you parse JSON data from Stripe
}):
我现在没有访问条带设置的权限,但是请记住手动设置Webhook的URL。 选择您的帐户名>帐户设置>网络挂钩

active_until只是提醒客户仍然处于活动状态,并且在您的系统中提供了付费服务。在获取Webhook时需要更新它。 Stripe docs非常好,所以请再检查一遍。

active\u until只是数据库列的名称,您可以在users表上创建该列以存储表示用户帐户过期时间的时间戳。列的名称无关紧要。您可以使用任何想要的名称

为了验证用户的订阅是否为当前订阅,Stripe建议您使用如下逻辑:

If today's date <= user.active_until
  allow them access

Else
  show them an account expired message
if event type is "invoice.payment_succeeded"
  then update user.active_until to be equal to today's date + 1 month

如果支付失败,您还需要响应其他事件,等等。

谢谢您的详细解释,我已经在stripe网站上添加了所有事件,但我真的很困惑,我是否需要router.post用于web钩子?您是否可以添加一个代码,说明如何添加active_直到?是否需要时间戳或布尔值?以及还有一件事我该如何测试webhook?是的,你需要捕获来自stripe的post请求。为你在webhook中指定的url设置router.post。然后转储它得到的所有内容,看看如何处理它。如果我没记错的话,stripe在某个地方有一个按钮,允许你发送任何webhook。活动直到与stripe无关。stripee仍将向订阅的客户收费。在创建新订阅之前,您将设置为活动状态,直到知道某个订阅的活动时间。由您决定格式