Bug 4: resolveRenewalActivationSubscription - add fallback by user_id+subscribe_id
with SELECT FOR UPDATE when token lookup fails
Bug 5: appleIAPNotifyLogic - return error on product ID mapping failure instead of
silently dropping the notification
Bug 6: NewPurchase fallback query - wrap in transaction with SELECT FOR UPDATE to
prevent concurrent duplicate subscription creation
Bug 7: appleIAPNotifyLogic - fix UserId=0 by reverse-lookup from original purchase
order; create renewal audit order record for DID_RENEW/SUBSCRIBED notifications
Bug 8: UpdateOrderStatus - pre-delete cache before DB write (double-delete) to
close TOCTOU window between DB update and cache invalidation
Bug 9: validateNewUserOnlyEligibilityAtActivation - add Redis distributed lock on
user_id to serialise concurrent new-user-only order activations
Co-authored-by: multica-agent <github@multica.ai>
- Fix task error handling: return actual errors instead of nil to enable retry
- Add idempotency check: skip processing for already finished orders
- Extend temp order cache: increase from 15 minutes to 24 hours
- Configure retry policy: add MaxRetry(5) for all payment callbacks (Epay, Alipay, Stripe)
This fixes the critical issue where paid orders were being lost due to:
1. Failed tasks being marked as successful and deleted from queue
2. Temporary order info expiring before queue processing
3. No retry mechanism for transient failures
Changes:
- queue/logic/order/activateOrderLogic.go: Fix error returns and add idempotency
- internal/logic/public/portal/purchaseLogic.go: Extend cache to 24 hours
- internal/logic/notify/*NotifyLogic.go: Add retry configuration