node.js - Stripe 订阅未更新数量
问题描述
我有一个相当简单的应用程序,它只允许您创建一个管理员用户,该用户可以在他们的帐户下创建子用户。当管理员创建另一个用户时,我希望他们使用存储在user.company.subUserCount
. 但是当我这样做时,用户模型没有使用正确的值更新,并且条带根本不会更新。
希望有人可以看看我的代码片段,看看它有什么问题导致它不更新 Stripe。
路线
// POST USER/NEW
app.post('/user/new',
isAuthenticated,
company.postNewUserPlan,
sessions.postSignupSub,
(req, res) => {
User.findById(req.user.id, function(err, user) {
user.company.subUserCount = req.user.company.subUserCount + 1;
user.save();
});
});
company.postNewUserPlan
exports.postNewUserPlan = function(req, res, next){
var plan = req.user.company.stripe.plan;
var coupon = null;
var stripeToken = null;
plan = plan.toLowerCase();
if(req.body.stripeToken){
stripeToken = req.body.stripeToken;
}
User.findById(req.user.id, function(err, user) {
if (err) return next(err);
var quantity = user.company.subUserCount + 1;
user.setPlan(plan, coupon, quantity, stripeToken, function (err) {
var msg;
if (err) {
if(err.code && err.code == 'card_declined'){
msg = 'Your card was declined. Please provide a valid card.';
} else if(err && err.message) {
msg = err.message;
} else {
msg = 'An unexpected error occurred.';
}
req.flash('errors', msg);
return res.redirect('/user/create');
}
});
});
next();
};
session.postSignupSub 护照代码
passport.use('signup-sub', new LocalStrategy({
usernameField: 'email',
passReqToCallback : true
},
function(req, email, password, done) {
User.findOne({ email: req.body.email }, function(err, existingUser) {
if(err){
console.log(err);
}
if (existingUser) {
req.flash('form', {
email: req.body.email
});
return done(null, false, req.flash('error', 'An account with that email address already exists.'));
}
var preRole = req.body.role;
var role = ''
if (preRole === undefined) {
role = 'manager';
} else if (preRole === 'on') {
role = 'employee';
}
// edit this portion to accept other properties when creating a user.
var user = new User({
email: req.body.email,
password: req.body.password, // user schema pre save task hashes this password
role: role,
companyID: req.user.companyID,
isVerified: true
});
user.save(function(err) {
if (err) return done(err, false, req.flash('error', 'Error saving user.'));
var time = 14 * 24 * 3600000;
req.session.cookie.maxAge = time; //2 weeks
req.session.cookie.expires = new Date(Date.now() + time);
req.session.touch();
return done(null, user, req.flash('success', `Your new ${role} has been created`));
});
});
})
);
解决方案
经过一番测试后,我设法解决了与 OP 中未包含的代码相关的问题,我发现订阅没有更新数量,而只是用它创建。
代码
schema.methods.setPlan = function(plan, coupon, quantity, stripe_token, cb) {
var user = this;
var subscriptionHandler = function(err, subscription) {
if(err) return cb(err);
user.company.stripe.plan = plan;
user.company.stripe.subscriptionId = subscription.id;
user.company.subUserCount = quantity;
user.save(function(err){
if (err) return cb(err);
return cb(null);
});
};
var createSubscription = function(){
stripe.customers.createSubscription(
user.company.stripe.customerId,
{plan: plan, coupon: coupon, quantity: quantity},
subscriptionHandler
);
};
if(stripe_token) {
user.setCard(stripe_token, function(err){
if (err) return cb(err);
createSubscription();
});
} else {
if (user.company.stripe.subscriptionId){
// update subscription
stripe.customers.updateSubscription(
user.company.stripe.customerId,
user.company.stripe.subscriptionId,
{ plan: plan, coupon: coupon, ***quantity: quantity*** }, <-- Part I had to change
subscriptionHandler
);
} else {
createSubscription();
}
}
};
推荐阅读
- git - 如何在 Mac 上用 CRLF 和 LF git 提交一些文件?
- android - setTextColor 不适用于 LiveData 和 DataBinding
- html - 在反应 html5 应用程序中,如何并排放置 3 个选择列表?
- sql - WordPress 迁移 - 找到旧的根路径?
- xamarin.forms - 选择器的选定项目更改时如何触发命令
- c# - 强制 b-PAC 生成特定符号大小的 DataMatrix 条形码
- javascript - 将所有控制台输出 [日志、错误、警告等] 代理到 HTML
- php - PHP foreach 变量外部循环未更新
- java - 按长度和字母顺序在行中打印单词
- python - Tensorflow model.save() -- NotImplementedError: 在 `__init__` 中有参数的层必须覆盖 `get_config`