如何解决Firebase扩展:使用Stripe运行“订阅付款”不会返回sessionId
我已经在Firebase中安装了“运行带有条带的订阅付款”扩展程序。
当我尝试为用户订阅计划时,出现错误消息“ snap.data不是函数”。我使用以下代码:
db
.collection('customers')
.doc(cred.user.uid)
.collection('checkout_sessions')
.add({
price: 'price_1GqIC8HYgolSBA35zoTTN2Zl',success_url: window.location.origin,cancel_url: window.location.origin,}).then(() => {
// Wait for the CheckoutSession to get attached by the extension
db
.collection('customers')
.doc(cred.user.uid)
.collection('checkout_sessions').onSnapshot((snap) => {
console.log(snap)
const { sessionId } = snap.data();
if ({sessionId}) {
console.log(sessionId)
// We have a session,let's redirect to Checkout
// Init Stripe
const stripe = Stripe('pk_test_ZEgiqIsOgob2wWIceTh0kCV4001CPznHi4');
stripe.redirectToCheckout({ sessionId });
};
});
});
这是Firebase团队提供的代码示例的.then变体:
const docRef = await db
.collection('customers')
.doc(currentUser.uid)
.collection('checkout_sessions')
.add({
price: 'price_1GqIC8HYgolSBA35zoTTN2Zl',});
// Wait for the CheckoutSession to get attached by the extension
docRef.onSnapshot((snap) => {
const { sessionId } = snap.data();
if (sessionId) {
// We have a session,let's redirect to Checkout
// Init Stripe
const stripe = Stripe('pk_test_1234');
stripe.redirectToCheckout({ sessionId });
}
});
我的await函数出现错误,说“未捕获的SyntaxError:await仅在异步函数中有效”。因此,我将代码重新整理为.then变体。
当我从button.addEventListener(“ click)运行此代码时,我收到一条错误消息,提示snap.data不是函数。
我检查了快照并填充了
在Firestore和Stripe仪表板中创建客户,然后创建客户会话。
这里出了什么问题?在Stackoveflow(Run Subscription Payments with Stripe Firebase Extension Webhook Not Firing)上有一个类似的问题,但是没有答案,所以我再次尝试。
解决方法
您的查询:
db
.collection('customers')
.doc(cred.user.uid)
.collection('checkout_sessions')
可以一次获取多个文档。它产生的对象是QuerySnapshot类型的对象,该对象可以在结果等中包含零个或多个文档。这就是您的snap
-QuerySnapshot。您会注意到它没有data()
方法。那是针对DocumentSnapshot对象的,您知道那里是否只有一个文档。
如果您有QuerySnapshot,则必须对其进行迭代以获取所有可能的文档快照,如documentation所示。
但是,这似乎并不是您想要的。您似乎要访问以前使用add()
添加的文档。如果这就是您想要的,那么您不应该像现在这样查询整个集合。只需找到所需的单个文档,然后add a listener to it。
您需要监听通过 .add()
函数添加的特定文档的更新。此函数返回对该特定文档的引用:https://github.com/stripe/stripe-firebase-extensions/blob/next/firestore-stripe-subscriptions/POSTINSTALL.md#start-a-subscription-with-stripe-checkout
如果您不想/不能使用 async/await 语法,则需要从 .then()
函数获取该文档引用:https://firebase.google.com/docs/firestore/manage-data/add-data#web_6
db.collection("customers")
.doc(user)
.collection("checkout_sessions")
.add({
price: "price_1I42zfKct2IqsPff6b6vFNKx",success_url: window.location.origin,cancel_url: window.location.origin,})
.then((docRef) => {
docRef.onSnapshot((snap) => {
const { sessionId } = snap.data();
if ({ sessionId }) {
console.log(sessionId);
// We have a session,let's redirect to Checkout
// Init Stripe
const stripe = Stripe("pk_test_ZEgiqIsOgob2wWIceTh0kCV4001CPznHi4");
stripe.redirectToCheckout({ sessionId });
}
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。