2017-05-04 107 views
0

我正在嘗試在用戶創建帳戶時對其進行充值。一切都已經建立起來,並且與之前的代碼完美配合。當用戶登錄網站的「高級」部分時,他們創建了一個帳戶,並使用下面的代碼收取費用。PassportJS和Stripe

問題:如果用戶的信用卡最終由於各種原因而被拒絕...他們的用戶帳戶仍然被創建。如果信用卡失效,我會如何更改我的代碼,以便未達到代碼的那一部分?

注意:此功能適用於用戶在使用用戶名進行創建時創建賬戶。 Web應用程序將它們重定向到/購買以選擇新的用戶名。但是,由於首先創建用戶,因此無法處理信用卡錯誤。

謝謝你的幫助!

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'); 
     }); 
    }); 
}); 

所以你基本上是創建條帶電荷,如果它是成功的,那麼你在你的數據庫中創建用戶。

希望這有助於!