#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 /…