# #firebase #firebase-authentication #stripe-payments
Вопрос:
[РЕШЕНО] Проблема в том, что я вызываю функцию subscribe() после файла .затем (() = > при создании учетной записи в firebase. Я думаю, что функция вызывается более одного раза.
Я использую Firebase и stripe для управления платежами по подписке (через расширение firebase для подписки на stripe), и у меня возникает проблема, когда пользователь регистрируется и добавляется в stripe.
Когда пользователи регистрируются, в моем приложении Firebase создается учетная запись. Затем он перенаправляется на сеанс проверки с полосой. В промежутках он добавляется в раздел «Клиенты» моей учетной записи stripe (я не управляю этим, это делается в бэкэнде через расширение, которое я считаю). Проблема -> клиент создается дважды в полосе.>
У одного из дублированных клиентов в Stripe есть журналы : «POST /v1/клиенты» и «POST /v1/проверка/сеанс». У другого есть только журнал «POST /v1/клиенты». У них обоих один и тот же идентификатор firebaseUID в разделе метаданных в Stripe. И в Firebase создается только один пользователь.
Это моя функция регистрации, которая вызывается с помощью onclick() на кнопке :
if (agreeToTerms == true amp;amp; name != '' amp;amp; surname != '' amp;amp; companyName != '' amp;amp; companyActivity != '' ) {
auth.createUserWithEmailAndPassword(email, password).then(cred => {
return db.collection('collection-users').doc(cred.user.uid).set({
name: name,
surname: surname,
email: email,
companyName: companyName,
companyActivity: companyActivity
})
}).then(() => {
// User signed up, now redirected to stripe checkout session to subscribe
subscribe();
container_signup.querySelector(".error").innerHTML = '';
}).catch(err => {
container_signup.querySelector(".error").innerHTML = err.message;
});
} else {
container_signup.querySelector(".error").innerHTML = "Please add all the required informations."
}
И это моя функция подписки, которая используется для перенаправления пользователя на сеанс проверки stripe (вызывается при создании учетной записи). :
async function subscribe() {
const docRef = await db
.collection('collection-users')
.doc(firebase.auth().currentUser.uid)
.collection('checkout_sessions')
.add({
price: 'price_id',
success_url: 'https://mywebsite.com',
cancel_url: 'https://mywebsite.com',
});
// Wait for the CheckoutSession to get attached by the extension
docRef.onSnapshot((snap) => {
const { error, url } = snap.data();
if (error) {
// Show an error to your customer and
// inspect your Cloud Function logs in the Firebase console.
alert(`An error occured: ${error.message}`);
}
if (url) {
// We have a Stripe Checkout URL, let's redirect.
window.location.assign(url);
}
});
}
Что я делаю не так?
Большое вам спасибо за вашу помощь.
[ПРАВКА] Ниже записывается база данных firebase. Мы видим, что функция .CreateCustomer создает первого клиента, в то время как .createCheckoutSession создает не только сеанс оформления заказа, но и другого клиента (дублированный).
7:48:29.200 pm
ext-firestore-stripe-subscriptions-createCustomer
Function execution started
7:48:29.202 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCustomer
⚙️ Creating customer object for [t5LdbvNH5hSOFe7ECuzpHfWke1x2].
7:48:29.215 pm
outlined_flag
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
Function execution started
7:48:29.218 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
⚙️ Creating checkout session for doc [UkCpB5Yqw8c9RR76wyp6].
7:48:29.464 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
⚙️ Creating customer object for [t5LdbvNH5hSOFe7ECuzpHfWke1x2].
7:48:29.636 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCustomer
✅Created a new customer: https://dashboard.stripe.com/test/customers/cus_KMlAFc3l3oAgnd.
7:48:29.637 pm
outlined_flag
gmp_mods ext-firestore-stripe-subscriptions-createCustomer
Function execution took 437 ms, finished with status: 'ok'
7:48:29.925 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
✅Created a new customer: https://dashboard.stripe.com/test/customers/cus_KMlAUuGRyge978.
7:48:30.679 pm
info
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
✅Checkout session created for doc [UkCpB5Yqw8c9RR76wyp6].
7:48:30.679 pm
outlined_flag
gmp_mods ext-firestore-stripe-subscriptions-createCheckoutSession
Function execution took 1464 ms, finished with status: 'ok'
Комментарии:
1. Вы видите какие-либо ошибки в журналах функций
createCustomer
?2. Нет, в журналах функций Firebase нет сообщений об ошибках. Но я вижу, что в одном журнале говорится, что function .CreateCustomer создал первого клиента, в то время как второй дублированный клиент создается с помощью function .createCheckoutSession. Я не понимаю, почему. (Я отредактировал сообщение с журналами)
3. Я предполагаю, что ваш вызов
db.collection('collection-users').doc(cred.user.uid).set()
перезаписываетstripeId
то, что устанавливается во время создания клиента, поэтому, когда вы звонитеsubscribe()
, он не может найти идентификатор клиента Stripe. Попробуйте изменить свой кодdb.collection('collection-users').doc(cred.user.uid).set({ ... }, { merge: true })
таким образом, чтобы ваш вызов объединял данные с существующей записью.