Ionic 2自动续期订阅追踪问题:restorePurchase返回state:3原因咨询
Troubleshooting Auto-Renewable Subscriptions with cordova-plugin-inapppurchase
Hey there, let’s tackle your auto-renewable subscription issues with Ionic 2 and the cordova-plugin-inapppurchase plugin— I’ve been through similar headaches, so let’s break this down clearly.
1. Tracking Auto-Renewable Subscription Status
Auto-renewable subscriptions don’t send real-time status updates to your app automatically, so you need two core strategies to stay on top of their state:
- Check status on app launch: Every time your app opens, call
restorePurchases()orrefreshReceipt()to pull the latest receipt data from Apple. This receipt contains all critical details about active/expired subscriptions, including expiration dates and renewal status. - Parse the receipt properly: The receipt’s
latest_receipt_infoarray holds individual subscription records. You’ll want to filter these entries to find ones where the expiration date is in the future. Never rely on local storage for subscription status—always validate against Apple’s receipt data to prevent tampering.
Here’s a practical code snippet to handle this flow:
// First refresh the receipt to ensure we have the latest data window.inapppurchase.refreshReceipt(() => { // Then restore purchases to fetch updated subscription details window.inapppurchase.restorePurchases((purchases) => { const now = new Date(); const activeSubscriptions = purchases.filter(purchase => { // Only target auto-renewable subscription types if (purchase.type !== 'auto-renewable-subscription') return false; // Check if the subscription is still active (expiry date is in the future) const expiryDate = new Date(purchase.expiresDate); return expiryDate > now; }); if (activeSubscriptions.length > 0) { console.log('Active subscriptions found:', activeSubscriptions); // Update your app's UI or user state here } else { console.log('No active subscriptions detected'); } }, (error) => { console.error('Failed to restore purchases:', error); }); }, (error) => { console.error('Failed to refresh receipt:', error); });
2. Why restorePurchase Returns State = 3 (Expired) in Sandbox
Short answer: Yes, this is almost certainly sandbox-specific behavior, and here’s why:
- Compressed sandbox timelines: Unlike production, auto-renewable subscriptions in the sandbox have drastically shortened expiration windows (e.g., weekly subscriptions expire in ~5 minutes, monthly in ~15 minutes). If you’re testing after this window, the subscription will show as expired (state=3).
- Limited sandbox renewals: Apple restricts sandbox subscriptions to 6 automatic renewals. After hitting this limit, the subscription won’t renew anymore and will stay in an expired state. You’ll need to create a new sandbox test account or reset your test subscription to continue testing.
- Verify your test flow: Ensure you’re using a dedicated sandbox test account (not your personal Apple ID). Immediately after purchasing a subscription in sandbox, run
restorePurchases()—you should see state=1 (Purchased) if the subscription is active. If it’s already state=3, the test subscription has likely expired.
Quick Sandbox Testing Tips
- Use Apple’s official sandbox test accounts (create them in App Store Connect)
- After a subscription expires in sandbox, you can repurchase it immediately with the same test account
- Prioritize checking the
expiresDatefield over just thestatevalue—it’s the most reliable indicator of active status
内容的提问来源于stack exchange,提问作者Aqib Mirza
相关产品推荐
相关产品推荐

