Функции Firebase не вызываются

#angularjs #firebase #google-cloud-firestore #stripe-payments #payment-gateway

#angularjs #firebase #google-облако-firestore #stripe-платежи #платежный шлюз

Вопрос:

Я пытаюсь интегрировать платежи Stripe в свое веб-приложение с помощью Firebase. Я клонировал код из репозитория здесь: https://github.com/firebase/functions-samples/tree/master/stripe и следовали приведенной здесь документации: https://firebase.google.com/docs/use-cases/payments

Прочитав документацию, я предположил, что когда клиент входит в систему через аутентификацию firebase, его данные будут добавлены в коллекцию stripe_customer в firestore. Я понял, что это не так, и вручную добавил пользователя для тестирования функций сохранения. Затем я получил следующую ошибку: «Недопустимое значение для stripe.confirmCardSetup intent secret: значение должно быть строкой client_secret. Вы указали: не определено»

У меня есть план запуска firebase и он настроен. Следуя инструкциям в документации, я предположил, что это будет работать. Извините, что этот вопрос такой расплывчатый, но, похоже, на каждом углу я сталкиваюсь с другой проблемой. Есть ли что-то очень очевидное, чего мне не хватает, что мешает этому коду работать? Я пытаюсь реализовать это для бизнеса друзей в качестве одолжения, и я действительно путаюсь с Firebase. Я пишу на Angularjs. Был бы очень признателен за любую помощь в этом!

Это код функции для создания клиента

 exports.createStripeCustomer = functions.auth.user().onCreate(async (user) => {
        const customer = await stripe.customers.create({ email: user.email });
        const intent = await stripe.setupIntents.create({
        customer: customer.id,
  });
  await admin.firestore().collection('stripe_customers').doc(user.uid).set({
    customer_id: customer.id,
    setup_secret: intent.client_secret,
  });
  return;
});
  

И это код, вызываемый в контроллере:

 const firebaseUI = new firebaseui.auth.AuthUI(firebase.auth());
const firebaseUiConfig = {
  callbacks: {
    signInSuccessWithAuthResult: function (authResult, redirectUrl) {
      // User successfully signed in.
      // Return type determines whether we continue the redirect automatically
      // or whether we leave that to developer to handle.
      return true;
    },
    uiShown: () => {
      document.getElementById('loader').style.display = 'none';
    },
  },
  signInFlow: 'popup',
  signInSuccessUrl: '/checkout.html',
  signInOptions: [
    firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    firebase.auth.EmailAuthProvider.PROVIDER_ID,
  ],
  credentialHelper: firebaseui.auth.CredentialHelper.NONE,
  // Your terms of service url.
  tosUrl: 'https://example.com/terms',
  // Your privacy policy url.
  privacyPolicyUrl: 'https://example.com/privacy',
};
firebase.auth().onAuthStateChanged((firebaseUser) => {
  if (firebaseUser) {
    currentUser = firebaseUser;
    firebase
      .firestore()
      .collection('stripe_customers')
      .doc(currentUser.uid)
      .onSnapshot((snapshot) => {
        if (snapshot.data()) {
          customerData = snapshot.data();
          startDataListeners();
          document.getElementById('loader').style.display = 'none';
          document.getElementById('content').style.display = 'block';
        } else {
            console.warn(
              `No Stripe customer found in Firestore for user: ${currentUser.uid}`
            );
        }
      });
  } else {
    document.getElementById('content').style.display = 'none';
    firebaseUI.start('#firebaseui-auth-container', firebaseUiConfig);
  }
});
  

Комментарии:

1. Эй, вы установили свой ключ stripe в конфигурации для облачной функции?, вы тестируете это локально? если да, обновили ли вы свое локальное хранилище этими значениями?

2. Привет, большое спасибо за вашу помощь! Я настроил свой ключ stripe в CLI, как указано в документе. Я тестирую локально, но я не уверен, что вы имеете в виду, но обновляю свой магазин этими значениями. Я обновил свою коллекцию stripe_customers в консоли, чтобы включить нового пользователя, но должен ли код автоматически делать это при входе пользователя в систему? Извините, если это очень простые вопросы.

3. Все хорошо. Я добавил ответ ниже, чтобы уточнить. если это работает, пожалуйста, примите это. Для вывода ваших значений в локальное хранилище, т.е. в файл runtimeconfig.json, выполните следующее: функции firebase:config:get > .runtimeconfig.json

4. Проверяли ли вы на своей панели управления Stripe, чтобы убедиться, что ваши запросы на создание клиента и намерение настройки сработали?

Ответ №1:

Ошибка, которую вы указали (ниже), подразумевает, что ключ в вашей конфигурации не был включен в ваш код. Если вы запускаете это локально, вам необходимо запускать приведенное ниже при каждом изменении ваших функций: значения конфигурации.

  firebase functions:config:get > .runtimeconfig.json
  

Проверьте документ о том, как запустить вашу функцию локально:

Ошибка

«Недопустимое значение для stripe.confirmCardSetup intent secret: значение должно быть строкой client_secret. Вы указали: не определено»

Комментарии:

1. большое спасибо за вашу помощь, теперь я получаю эту ошибку: Uncaught TypeError: firebase.firestore(…).useEmulator не является функцией. Я не могу найти эту ошибку, специфичную для онлайн-эмулятора, очень признателен за любую помощь!

2. Я не слишком уверен, чего вы пытаетесь достичь или что вы запустили, чтобы получить эту ошибку. Для локального вызова функции onCreate myFirestoreFunction({foo: ‘new’}) вы можете запустить оболочку с помощью firebase functions:shell . Не забудьте экспортировать свои учетные данные для firestore, к которому вы пытаетесь получить доступ. Проверьте эту страницу для получения справки, firebase.google.com/docs/functions /…