我正在尝试让用户创建另一个用户(称为子用户)时,它只是创建该用户并仅更新公司用户,并将条纹订阅数量更新为currentUser + 1
或req.user.company.subUserCount + 1
当前发生的情况是用户订阅已正确更新,但在Stripe下将子用户创建为新客户。我已经包含了创建新用户时运行的大多数代码。唯一缺少的是路由和一些不相关的代码块,这些数据条要进行条带化,但是要进行内部业务逻辑处理。
第一个位运行用于子用户注册
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();
};
第二个程序段运行
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.'));
}
// setting value for email using company domain name
email = req.body.email + req.user.company.companyDomain;
var user = new User({
email: email,
password: req.body.password, // user schema pre save task hashes this password
role: role,
companyID: req.user.companyID
});
user.save(function(err) {
if (err) return done(err, false, req.flash('error', 'Error saving user.'));
return done(null, user, req.flash('success', `Your new ${role} has been created.`));
});
});
})
);
上面块中的setPlan通过插件连接到用户模型
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 },
subscriptionHandler
);
} else {
createSubscription();
}
}
};
用户架构
var UserSchema = new mongoose.Schema({
email: String,
password: String,
companyID: String,
company: {
companyDomain: String,
subUserCount: { type: Number, default: 1},
stripe: {
customerId: String,
subscriptionId: String,
last4: String,
plan: String,
isCoupon: {
type: Boolean,
default: false
}
},
}
});
var stripeOptions = config.stripeOptions;
UserSchema.plugin(passportLocalMongoose, { usernameField : 'email' });
UserSchema.plugin(stripeCustomer, stripeOptions);
我知道这是很多代码,并且没有错误消息(因为它们不存在,只是存在错误的结果),但是希望有人可以看看我出了什么问题。我整个周末都没有运气。甚至建议尝试的东西也会很棒。预先感谢!