【问题标题】:Stripe functions returning calls after function finished函数完成后条带函数返回调用
【发布时间】:2020-07-28 14:01:40
【问题描述】:

然而,相对较新的 Javascript,我正在尝试使用 Stripe 和我的方式来解决用户提交另一种付款方式,然后用该方法支付发票。如果付款再次失败 - 它应该一起删除订阅。我将 Firebase 实时数据库与 GCF 和 Node.js 8 结合使用。

这是我目前所拥有的

exports.onSecondPaymentAttempt = functions.database.ref("users/{userId}/something/somethingHistory/{subDbId}/newPayment").onCreate((snapshot, context)=>{
var s = snapshot.val();
var fields = s.split(",");
const cardToken = fields[0];
const cus_id = fields[1];
const conn_id = fields[2];
const subDbId = context.params.subDbId;
const userId = context.params.userId;
return stripe.customers.createSource(
    cus_id,
    {source: cardToken},{
        stripeAccount: `${conn_id}`,
      },
  (err, card)=> {
    console.log(err); 
    if(err){
        return console.log("error attaching card "+ err)
    }else{
        const invoiceNo = admin.database().ref(`users/${userId}/something/somethingHistory/${subDbId}`)
        return invoiceNo.once('value').then(snapshot=>{
        const invoiceNumber = snapshot.child("invoiceId").val();
        const subId = snapshot.child("subscriptionId").val();
        return stripe.invoices.pay(
        invoiceNumber,
        {
      expand: ['payment_intent','charge','subscription'],
        },{
            stripeAccount: `${conn_id}`,
          },
          (err, invoice)=>{
              if(err){
                return console.log("error paying invoice "+ err)
              }else{
                if(invoice.payment_intent.status==="succeeded"){
              //DO SOME CODE
                return console.log("New Payment succeeded for "+invoiceNumber)
            }else{
             //DO SOME OTHER CODE

            //CANCEL 
            return stripe.subscriptions.del(
                subId,{
            stripeAccount: `${conn_id}`,
             },
            (err, confirmation)=> {
                if(err){
                    return console.log("Subscription error")
                }else{
                         return console.log("Subscription cancelled")
                }
             });
              }
              }
          });
})
    }
});

对我来说,它看起来是一种令人难以置信的低效/丑陋的实现效果的方式,总体而言,尽管该函数在 1862 毫秒后完成执行,但总体而言用户等待响应大约 15 秒 - 我仍然收到最多 5 到 10 个响应几秒钟后。

要达到注册新支付源、支付订阅费用然后处理支付结果的相同预期效果,最有效的方法是什么?

【问题讨论】:

    标签: javascript node.js firebase google-cloud-functions stripe-payments


    【解决方案1】:

    您应该使用 Stripe 异步方法返回的 Promises,如下所示(未经测试,它可能需要一些微调,尤其是传递给 Stripe 方法的对象):

    exports.onSecondPaymentAttempt = functions.database.ref("users/{userId}/something/somethingHistory/{subDbId}/newPayment").onCreate((snapshot, context) => {
        var s = snapshot.val();
        var fields = s.split(",");
        const cardToken = fields[0];
        const cus_id = fields[1];
        const conn_id = fields[2];
        const subDbId = context.params.subDbId;
        const userId = context.params.userId;
    
    
        return stripe.customers.createSource(
            //Format of this object to be confirmed....
            cus_id,
            { source: cardToken },
            { stripeAccount: `${conn_id}` }
        )
            .then(card => {
                const invoiceNo = admin.database().ref(`users/${userId}/something/somethingHistory/${subDbId}`)
                return invoiceNo.once('value')
            })
            .then(snapshot => {
                const invoiceNumber = snapshot.child("invoiceId").val();
                const subId = snapshot.child("subscriptionId").val();
                return stripe.invoices.pay(
                    invoiceNumber,
                    { expand: ['payment_intent', 'charge', 'subscription'] },
                    { stripeAccount: `${conn_id}` }
                )
            })
            .then(invoice => {
    
                if (invoice.payment_intent.status === "succeeded") {
                    //DO SOME CODE
                    console.log("New Payment succeeded for " + invoiceNumber)
                    return null;
                } else {
                    //DO SOME OTHER CODE
    
                    //CANCEL 
                    return stripe.subscriptions.del(
                        subId, {
                        stripeAccount: `${conn_id}`,
                    });
                }
    
            })
            .catch(err => {
                //....
                return null;
            })
    
    });
    

    我建议你观看官方Firebase video series关于“JavaScript Promises”的三个视频,其中解释了为什么正确chain并返回异步方法返回的承诺的关键。

    【讨论】:

    • @JamesPalfrey 您好,您有机会查看建议的解决方案吗?
    • 嘿,我做到了,非常感谢,实际上我最终浏览了您建议的 udemy 课程/Firebase 视频系列,并混淆了我的解决方案,因此我已将您的答案标记为正确:) 谢谢。
    • 很高兴能帮到你!如果您认为我的回答有帮助,您也可以投票赞成,请参阅stackoverflow.com/help/someone-answers。谢谢!
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2012-05-25
    • 2017-11-10
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多