针对此问题,可以在客户端实现一个对未收到服务器响应的队列进行管理的逻辑,当接收到一条新的交易时,将其加入队列中,并设置一个超时时间。当超时时间到达时,如果服务器还未响应,则可以将该条交易重新发送至服务器。同时,在服务器端可以增加一个对于重复交易 ID 的判断逻辑,当检测到重复交易 ID 时,可以直接返回该交易已经处理成功的响应,避免重复处理。以下是 Swift 实现代码示例:
客户端:
class PaymentQueue {
var transactions: [Transaction] = []
func addTransaction(_ transaction: Transaction) {
transactions.append(transaction)
DispatchQueue.main.asyncAfter(deadline: .now() + 30) { [weak self] in
if let index = self?.transactions.firstIndex(where: { $0.id == transaction.id }) {
self?.transactions.remove(at: index)
self?.addTransaction(transaction)
}
}
}
func removeTransaction(_ transaction: Transaction) {
if let index = transactions.firstIndex(where: { $0.id == transaction.id }) {
transactions.remove(at: index)
}
}
}
struct Transaction {
let id: String
let amount: Double
}
服务器端:
app.post('/receivePayment', (req, res) => {
const transactionId = req.body.transactionId;
if (isDuplicateTransaction(transactionId)) {
res.json({ success: true });
return;
}
saveTransactionToDatabase(transactionId);
processTransaction(transactionId);
res.json({ success: true });
});
function isDuplicateTransaction(transactionId) {
// Check if the transactionId is already processed before
}
function saveTransactionToDatabase(transactionId) {
// Save the transaction to the database
}
function processTransaction(transactionId) {
// Process the transaction
}