お世話になります。
現在、FirebaseのFirestoreと、PayPalを使って、支払いが確認できたらデータをDBへ登録するという機能を実装しております。
<困りごと>
支払いまたはDBへの登録のどちらかが失敗したとき、片方の処理がされたまま終わってしまうため、
・DBへの登録が失敗したら、支払いもキャンセルする
・支払いが失敗したら、DBへの登録もキャンセルする
のいずれかの形で整合性を保つのが良いかと考えております。
こういう場面ではFirestoreのトランザクションを使えば実現できるのかと思いましたが、
いまいちどのように組み立てれば良いのかがわかっておりません。
下記にそれぞれのコードを記載しました。
PayPalの方だとpaypal.Buttonsの中で支払いが成功したときはonApproveの中の処理が実行され、
支払いに失敗したときにはonErrorの中の処理が実行されるという仕様になっているはずです。
Firestoreのトランザクションを上手く使って今回実現したいことを行おうとしているのですが、
もしトランザクションの処理の中にこのpaypal.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() 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のコード
<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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/05 14:29