我试图在用户创建帐户时向其收取费用。一切都已设置完毕,并且之前的代码完美无缺。当用户签署网站的“高级”部分时,他们会创建一个帐户,并从下面的代码中收取费用。
问题:如果用户的信用卡因各种原因而被拒绝...他们的用户帐户仍然是STILL创建的。如果信用卡失败,我如何更改下面的代码以达不到代码的那部分?
注意:此功能适用于用户尝试使用用户名创建帐户的时间。 Web应用程序将它们重定向到/ buy以选择新用户名。但是,它无法处理信用卡错误,因为首先创建了用户。
感谢您的帮助!
user.save(function(err) {
console.log('this is the problem' + ' ' + err)
if(err){
return res.redirect('/buy')
}
var token = req.body.stripeToken; // Using Express
var charge = stripe.charges.create({
amount: 749,
currency: "usd",
description: "Website.com Premium - One time Payment",
source: token,
}, function(err, charge) {
if(err) {
console.log(err);
return res.redirect('/buy')
}
console.log('charged')
req.logIn(user, function(err) {
if(err) {
console.log(err);
}
console.log('all looks good')
res.redirect('/results');
});
});
});
});
答案 0 :(得分:1)
问题是您在将用户保存到数据库后处理付款。有两种方法可以解决这个问题。如果付款失败,您可以从数据库中删除该用户。或者您可以处理付款然后将用户保存到数据库。所以基本上切换顺序以及哪些回调嵌套在哪些回调中。
我个人建议使用第二种解决方案,因为您将减少对数据库的调用,这将减轻数据库的压力和负担。
这是如何实现这一目标的基本示例。我不知道你的代码的所有内容,所以你可能需要做一些调整以适应你的工作方式,但基本的想法就是那里。
var token = req.body.stripeToken; // Using Express
var charge = stripe.charges.create({
amount: 749,
currency: "usd",
description: "Website.com Premium - One time Payment",
source: token,
}, function(err, charge) {
if (err) {
console.log(err);
return res.redirect('/buy')
}
console.log('charged')
user.save(function(err) {
console.log('this is the problem' + ' ' + err);
if (err) {
return res.redirect('/buy')
}
req.logIn(user, function(err) {
if (err) {
console.log(err);
}
console.log('all looks good')
res.redirect('/results');
});
});
});
所以你基本上是在创建条带费用,如果成功,那么你就可以在数据库中创建用户了。
希望这有帮助!