У меня есть код, который работал в предыдущем проекте, но теперь не будет работать даже после его модификации. Идея кода в том, чтобы быть функцией пользовательской модели, которую я могу вызывать из любого места. Эта часть работает. Часть, которая не работает, устанавливает план, как только он уже был установлен. Так что начальная настройка пользователя в порядке.
Этот код предназначен для принятия плана, выбранного пользователем, и последующего присвоения этого плана клиенту с полосой. Он также проверяет, выбирает ли пользователь определенный тариф, который предназначен для бесплатного использования, то есть ему не нужно вводить данные своей кредитной карты.
postPlan
exports.postPlan = function(req, res, next){
var plan = req.body.plan;
var coupon = req.body.coupon;
if (coupon) {
req.user.isUsedCoupon = true;
}
var stripeToken = null;
if(plan){
plan = plan.toLowerCase();
}
if(req.user.stripe.plan == plan){
req.flash('info', 'The selected plan is the same as the current plan.');
return res.redirect('/company/settings');
}
if(req.body.stripeToken){
stripeToken = req.body.stripeToken;
}
if(plan != 'silver'){
if(!req.user.stripe.last4 && !req.body.stripeToken){
req.flash('errors', 'Please add a card to your account before choosing a plan.');
return res.redirect('/company/settings');
}
}
User.findById(req.user.id, function(err, user) {
if (err) return next(err);
user.setPlan(plan, coupon, 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('/company/billing');
}
req.flash('success', 'Plan has been updated.');
res.redirect('/company/billing');
console.log(user.stripe.plan)
});
});
};
Этот код устанавливает план и данные подписки для профиля / модели пользователя. Если у пользователя в настоящее время нет плана, он создает подписку и устанавливает план. Эта часть работает ... Если у пользователя уже есть подписка и план, он должен обновить профиль пользователя, а также план пользователя в полосе. Это та часть, которая вообще не работает.
setPlan
schema.methods.setPlan = function(plan, coupon, stripe_token, cb) {
var user = this;
var subscriptionHandler = function(err, subscription) {
if(err) return cb(err);
user.stripe.plan = plan;
user.stripe.subscriptionId = subscription.id;
user.save(function(err){
if (err) return cb(err);
return cb(null);
});
};
var createSubscription = function(){
stripe.customers.createSubscription(
user.stripe.customerId,
{plan: plan, coupon: coupon},
subscriptionHandler
);
};
if(stripe_token) {
user.setCard(stripe_token, function(err){
if (err) return cb(err);
createSubscription();
});
} else {
if (user.stripe.subscriptionId){
// update subscription
stripe.customers.updateSubscription(
user.stripe.customerId,
user.stripe.subscriptionId,
{ plan: plan, coupon: coupon },
subscriptionHandler
);
} else {
createSubscription();
}
}
};
Предложения о том, что попробовать или что может быть не так?