Почему stripe создает клиента дважды с помощью firebase?

# #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 }) таким образом, чтобы ваш вызов объединял данные с существующей записью.