【问题标题】:Adding Card to Stripe customer with NodeJS使用 NodeJS 向 Stripe 客户添加卡片
【发布时间】:2020-08-14 07:49:47
【问题描述】:

我正在我的 NodeJS 应用程序中构建我的 addCard 控制器,以向现有的条纹客户添加卡片。目前我使用以下代码:

const user = await User.findById(req.params.user_id)

    //Send error if user is not found
    if(!user){
        return next(new ErrorResponse('Resource not found', 404))
    }
await Stripe.customers.retrieve(
        user.stripe.customer_id,
        async function(err, customer) {
            if (err){
                return next(new ErrorResponse(err.message, err.statusCode))
            } else{
                if(customer.sources.data.length > 0){
                    return next(new ErrorResponse('User already has a card on file', 403));
                } else{
                    //If no card on file, create a new card for the user
                    await Stripe.customers.createSource(
                        user.stripe.customer_id,
                        {source: req.body.cardtok}, //card token generated by client
                        async function(err, card) {
                            if(err){
                                return next(new ErrorResponse(err.message, err.statusCode));
                            } else{
                                res.status(200).json({
                                    success: true,
                                    data: card
                                });            
                            }
                        }
                    );

                }
            }
        }
    );

有没有更好的方法?虽然我的代码确实按预期工作,但我无法避免认为有点混乱。我正在使用 Node、express 和 mongodb。

【问题讨论】:

    标签: javascript node.js express stripe-payments


    【解决方案1】:

    您似乎在这里混淆了异步/等待和回调;我认为您可以这样做:

    const user = await User.findById(req.params.user_id);
    
    //Send error if user is not found
    if (!user) {
      return next(new ErrorResponse("Resource not found", 404));
    }
    
    let customer;
    try {
      customer = await Stripe.customers.retrieve(user.stripe.customer_id);
    } catch (err) {
      return next(new ErrorResponse(err.message, err.statusCode));
    }
    
    if (customer.sources.data.length > 0) {
      return next(new ErrorResponse("User already has a card on file", 403));
    }
    
    //If no card on file, create a new card for the user
    let card;
    
    try {
      card = Stripe.customers.createSource(
        user.stripe.customer_id,
        { source: req.body.cardtok } //card token generated by client
      );
    } catch (err) {
      return next(new ErrorResponse(err.message, err.statusCode));
    }
    
    res.status(200).json({
      success: true,
      data: card,
    });
    

    【讨论】:

    • 确实是。感谢那!它的设置方式就像一个魅力,只需要等待 Stripe.customers.createSource,但其他一切都很完美。
    猜你喜欢
    • 2017-03-13
    • 2015-05-08
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多