The problem arises because of either fraud on the part of the user or a transmission error to your servers.
1) You can simply request that the user present you with the user's emailed receipt from ITunes and, if that appears valid, credit the app using a backdoor method.
2) Alternatively, you can have the app's code realize that it submitted a receipt to your servers but never heard back and therefore cause it to resubmit it to your servers after a suitable time.
3) or you can not call finishTransactions until you actually finish the transaction and then rely on storeKit to resend the transaction into your updatedTransactions method the next time the app re-enters foreground.
4) or you can have an 'examine receipt' (or 'check purchases') button that the user taps and that examines the current receipt (and/or refreshes the receipt) to see if a credit is appropriate.
You do not need any of these nor a restore button to get the app approved.