Платеж не взимается из-за ошибки в облачной функции Firebase - PullRequest
1 голос
/ 02 июня 2019

Я создаю приложениеact-redux с firetore в качестве базы данных. Теперь я хотел использовать облачные функции 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 ]

1 голос
/ 03 июня 2019

Хотя ответ @Doug Stevenson полезен, это не было главной проблемой.Итак, я пишу здесь решение для других людей, которые борются с ним.Я использовал неправильную пару открытого ключа и секретного ключа в своем приложении, чтобы при правильном использовании это работало.

0 голосов
/ 02 июня 2019

Вы не возвращаете обещание, возвращенное из set (), используя Admin SDK. Функция завершается и очищается до завершения асинхронной работы.

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

К вашему сведению, эти цепочки обещаний проще визуализировать, если вы используете синтаксис async / await вместо then / catch.

...