由于Firebase云功能出错,无法付款

时间:2019-06-02 14:01:21

标签: javascript reactjs firebase-realtime-database google-cloud-functions stripe-payments

我正在制作一个将firetore作为数据库的react-redux应用程序。 现在,我想使用Firebase云功能来处理条带支付。

这是设置:

以下是从反应方收到令牌和金额后的结帐操作方法。

export const checkoutFunc = (token, amount) => {
  return (dispatch, getState, { getFirebase, getFirestore }) => {
    const uid = getState().firebase.auth.uid;
    const ref = database.ref();
    ref.child(`payments/${uid}`).push({
      token: token,
      amount: amount
    });
  };
};

此功能创建付款并保存令牌和金额。

现在,这是云功能,在创建上述付款之后,该功能应“向”付款“收费”。

exports.stripeCharge = functions.database
  .ref("/payments/{userId}/{paymentId}")
  .onWrite((change, context) => {
    const payment = change.after.val();

    const userId = context.params.userId;
    const paymentId = context.params.paymentId;

    if (!payment || payment.charge) return;

    return admin
      .database()
      .ref(`/teachers/${userId}`)
      .once("value")
      .then(snap => {
        return snap.val();
      })
      .then(customer => {
        const amount = payment.amount;
        const idempotency_key = paymentId;
        const source = payment.token.id;
        const currency = "usd";
        const charge = { amount, currency, source };

        return stripe.charges.create(charge, { idempotency_key });
      })

      .then(charge => {
        admin
          .database()
          .ref(`/payments/${userId}/${paymentId}/charge`)
          .set(charge)
          .then(charge => {
            return true;
          });
      });
  });

付款创建成功,令牌和金额保存在付款表中。但是,云功能并未完成对令牌收费的工作。

预期结果:

https://i.ibb.co/Fq9Zfhq/image.png

实际结果:

https://i.ibb.co/Krk7cGL/image.png

2 个答案:

答案 0 :(得分:1)

尽管@Doug Stevenson提供的答案很有帮助,但这不是主要问题。因此,我在这里为其他苦苦挣扎的人编写解决方案。 我在应用程序中使用了错误的公钥和私钥对,只要正确使用,它就可以工作。

答案 1 :(得分:0)

您不会使用Admin SDK返回从set()返回的承诺。该功能将在异步工作完成之前终止并清除。

  .then(charge => {
    return admin    // add a return here
      .database()
      .ref(`/payments/${userId}/${paymentId}/charge`)
      .set(charge)
      .then(charge => {
        return true;
      });
  });

仅供参考,如果您使用async / await语法而不是then / catch,则这些承诺链更易于可视化。