繁体   English   中英

Firebase 支付成功后才注册用户

[英]Firebase sign user up only after successful payment

我正在尝试实现以下流程:

  1. 用户进入网站
  2. 用户点击Subscribe now
  3. 用户被重定向到Stripe Checkout (因为它更容易)
  4. 用户支付成功
  5. 用户现在可以登录(甚至更好 - 自动登录)
  6. 每月自动向用户收费,更新数据库也是如此(以控制访问)

长话短说:只有在用户付费时才授予他访问权限。

我为此使用 Firebase,但似乎有很多障碍/头痛:

我用Firebase的时候到处找web关于订阅model,几乎没有。

我的问题是:任何人都使用Stripe实现了订阅服务(任何,不必是 Checkout - 流程是一样的)和Firebase 或者我应该为我自己的服务器使用 go 而仅将 Firebase 用于数据库?

当用户必须先注册然后付款(太多摩擦)时,我真的不觉得它是一个好的 UX。

使用云函数:

  1. 在结账时创建一个条纹客户。
stripe.customers.create({ email: 'user_email' }) // grab customer id
  1. 创建 firebase 用户文档并将条带客户 ID 保存到“用户”集合中。

(将userRecord.uid id 用于doc() id)

  firebaseAdmin.auth().createUser({
      email: 'email',
      password: 'temporary_password',
      displayName: 'fullname'
    })
    .then((userRecord) => {
      return firebaseAdminSDK.firestore()
        .collection('users').doc(userRecord.uid)
        .set({ stripe_account: 'cus_HILXPWljT9fKRA' })
    })
  • 发送 email 给用户
  • 将 email 和密码发送回客户端。

在客户端:

  1. 从云端function服务器收到成功消息后,让用户自动登录
firebase.auth().signInWithEmailAndPassword(data.email, data.password)
  1. 当用户登录时,从用户集合中获取stripe_account并获取条带订阅状态并将其显示给用户。

  2. 要求用户验证其 email 或更改密码。 禁用所有编辑,直到用户验证其 email 或更改其密码。

我正在考虑使用 firebase 条纹扩展的以下设置:

  1. 用户填写电子邮件地址并单击提交。

  2. signInAnonymously()并使用updateEmail()设置用户电子邮件地址。

  3. 然后创建一个附加 uid 的结帐会话:

     async stripeCheckout({ state }, payload) { const uid = state.authUser.uid const ref = await this.$fire.firestore.collection('users').doc(uid).collection('checkout_sessions').add({ price: payload.price, success_url: SUCCES_URL, cancel_url: CANCEL_URL, }); // Wait for the CheckoutSession to get attached by the extension ref.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); } }) }
  4. CANCEL_URL 可以是任何 url

  5. SUCCESS_URL 将是一个 url + 带有电子邮件的查询参数

  6. 在 SUCCESS_URL 后面,您将调用sendSignInLinkToEmail()

  7. 在 stripe 中,您可以在订阅中设置自定义声明,例如: stripeRole equals premium 此声明将添加到 firebase 授权,仅供订阅用户使用。

  8. 您的前端可以使用 auth guard 或中间件来检查自定义声明

  9. 如果您使用 firestore 为高级会员提供内容,您应该使用如下安全规则: request.auth.token.stripeRole == "premium";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM