<FIRESTORE> 我无法将事务处理和事件处理组合起来工作
<FIRESTORE> I can't get the combination of transaction and event processing to work
非常感谢您的帮助。
我目前正在实现一个功能,当使用 Firebase 的 Firestore 和 PayPal 确认付款时,将数据注册到数据库。
当支付或注册到 DB 失败时,两者之一仍在处理中。
如果注册到数据库失败,支付也会被取消。
如果支付失败,取消注册DB。
支付失败,取消数据库注册。
我认为在这种情况下可以使用 Firestore 事务,但是
但是,我还不知道如何构建它们。
我在下面包含了每个代码。
Buttons,支付成功时执行onApprove中的流程,支付失败时执行onApprove中的流程。
Buttons,当支付成功时,会执行onApprove中的流程,当支付失败时,会执行onError中的流程。
我正在尝试使用 Firestore 交易来做我想做的事。
交易过程中的按钮,我认为它不会起作用,因为我不想在 .Buttons 方法本身中捕获错误。
Buttons 方法,它不会起作用,因为您不想在处理此 .Buttons 方法本身时捕获错误。还有,比如你在支付完成后写一个交易流程(在onApprove中),是不行的,因为
我认为您不能取消付款,因为已经付款了。
我不知道如何按照上面的描述实现这个。
如果你知道怎么做,请告诉我。
Firestore 交易文档
https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja#web-v8
// Create a reference to the SF doc.
var sfDocRef = db.collection("cities").doc("SF");
// Uncomment to initialize the doc.
// sfDocRef.set({ population: 0 });
return db.runTransaction((transaction) => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(sfDocRef).then((sfDoc) => {
if (!sfDoc.exists) {
throw "Document does not exist!";
}
// Add one person to the city population.
// Note: this could be done without a transaction
// by updating the population using FieldValue.increment()
Note: this could be done without a transaction // by updating the population using FieldValue.increment(). var newPopulation = sfDoc.data().population + 1;
transaction.update(sfDocRef, { population: newPopulation });
});
}).then(() => {
console.log("Transaction successfully committed!");
}).catch((error) => {
console.log("Transaction failed: ", error);
});
```
PayPal's code
```
<script
function initPayPalButton() {
paypal.Buttons({
style: {
shape: 'rect',
color: 'gold',
layout: 'vertical',
label: 'paypal',
},
createOrder: function(data, actions) {
return actions.order.create({
purchase_units: [{"amount":{"currency_code": "JPY", "value":1}}]]
});
},
onApprove: function(data, actions) {
return actions.order.capture().then(function(details) {
alert('Transaction completed by ' + details.payer.name.given_name + '!') ;
});
},
onError: function(err) {
console.log(err);
}
}).render('#paypal-button-container');
}
initPayPalButton();
</script>.
```
如果我没记错的话,如果付款得到用户批准,您想使用交易在 Firestore 中添加文档。 onApprove
方法 " 从交易中获取资金并向买家显示一条消息,让他们知道交易成功。买家在 [=32= 批准交易后调用该方法]"
If you write a transaction process (in onApprove) after the payment is completed, it won't work because I don't think you can cancel the payment since the payment has already been made.
这是什么意思? onApprove
函数只有在用户批准支付时才会触发,然后 Stripe SDK 调用一些 Orders API.
onApprove: function(data, actions) {
// This function captures the funds from the transaction.
return actions.order.capture().then(async function(details) {
// alert('Transaction completed by ' + details.payer.name.given_name + '!')
// This is where you run Firestore's transaction
await addTxnToDatabase(details);
});
},
您真的需要 Firestore 交易吗?您是在更新某些内容还是只是在 Firestore 中添加新文档?如果您只是添加一个新文档,那么我猜事务没有用,因为 “在事务中读取操作必须先于写入操作”。您可以简单地编写一个新文档。
async function addTxnToDatabase() {
return firebase.firestore().collection("payments").add({..}) // any data returned by Paypal
}
如果你想增加一些东西,那么你可以使用增量方法:
docRef.update({ field: firebase.firestore.FieldValue.increment(50) })
此外,查看 Paypal Webhooks 可能会很有用,它可以为您触发云功能,其中包含某些与支付相关的事件的数据。
非常感谢您的帮助。
我目前正在实现一个功能,当使用 Firebase 的 Firestore 和 PayPal 确认付款时,将数据注册到数据库。
当支付或注册到 DB 失败时,两者之一仍在处理中。如果注册到数据库失败,支付也会被取消。 如果支付失败,取消注册DB。
支付失败,取消数据库注册。 我认为在这种情况下可以使用 Firestore 事务,但是 但是,我还不知道如何构建它们。
我在下面包含了每个代码。 Buttons,支付成功时执行onApprove中的流程,支付失败时执行onApprove中的流程。 Buttons,当支付成功时,会执行onApprove中的流程,当支付失败时,会执行onError中的流程。
我正在尝试使用 Firestore 交易来做我想做的事。 交易过程中的按钮,我认为它不会起作用,因为我不想在 .Buttons 方法本身中捕获错误。 Buttons 方法,它不会起作用,因为您不想在处理此 .Buttons 方法本身时捕获错误。还有,比如你在支付完成后写一个交易流程(在onApprove中),是不行的,因为 我认为您不能取消付款,因为已经付款了。
我不知道如何按照上面的描述实现这个。 如果你知道怎么做,请告诉我。
Firestore 交易文档 https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja#web-v8
// Create a reference to the SF doc.
var sfDocRef = db.collection("cities").doc("SF");
// Uncomment to initialize the doc.
// sfDocRef.set({ population: 0 });
return db.runTransaction((transaction) => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(sfDocRef).then((sfDoc) => {
if (!sfDoc.exists) {
throw "Document does not exist!";
}
// Add one person to the city population.
// Note: this could be done without a transaction
// by updating the population using FieldValue.increment()
Note: this could be done without a transaction // by updating the population using FieldValue.increment(). var newPopulation = sfDoc.data().population + 1;
transaction.update(sfDocRef, { population: newPopulation });
});
}).then(() => {
console.log("Transaction successfully committed!");
}).catch((error) => {
console.log("Transaction failed: ", error);
});
```
PayPal's code
```
<script
function initPayPalButton() {
paypal.Buttons({
style: {
shape: 'rect',
color: 'gold',
layout: 'vertical',
label: 'paypal',
},
createOrder: function(data, actions) {
return actions.order.create({
purchase_units: [{"amount":{"currency_code": "JPY", "value":1}}]]
});
},
onApprove: function(data, actions) {
return actions.order.capture().then(function(details) {
alert('Transaction completed by ' + details.payer.name.given_name + '!') ;
});
},
onError: function(err) {
console.log(err);
}
}).render('#paypal-button-container');
}
initPayPalButton();
</script>.
```
如果我没记错的话,如果付款得到用户批准,您想使用交易在 Firestore 中添加文档。 onApprove
方法 " 从交易中获取资金并向买家显示一条消息,让他们知道交易成功。买家在 [=32= 批准交易后调用该方法]"
If you write a transaction process (in onApprove) after the payment is completed, it won't work because I don't think you can cancel the payment since the payment has already been made.
这是什么意思? onApprove
函数只有在用户批准支付时才会触发,然后 Stripe SDK 调用一些 Orders API.
onApprove: function(data, actions) {
// This function captures the funds from the transaction.
return actions.order.capture().then(async function(details) {
// alert('Transaction completed by ' + details.payer.name.given_name + '!')
// This is where you run Firestore's transaction
await addTxnToDatabase(details);
});
},
您真的需要 Firestore 交易吗?您是在更新某些内容还是只是在 Firestore 中添加新文档?如果您只是添加一个新文档,那么我猜事务没有用,因为 “在事务中读取操作必须先于写入操作”。您可以简单地编写一个新文档。
async function addTxnToDatabase() {
return firebase.firestore().collection("payments").add({..}) // any data returned by Paypal
}
如果你想增加一些东西,那么你可以使用增量方法:
docRef.update({ field: firebase.firestore.FieldValue.increment(50) })
此外,查看 Paypal Webhooks 可能会很有用,它可以为您触发云功能,其中包含某些与支付相关的事件的数据。