<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 可能会很有用,它可以为您触发云功能,其中包含某些与支付相关的事件的数据。