verify sandbox's receipt in prodction return 21002

Hi, All


When I try to verify a sandbox's receipt in prodction(https://buy.itunes.apple.com/verifyReceipt), the Server return status is 21002, not 21007.

But if I verify it in sandbox, everything is OK.


Here is the receipt:

ewoJInNpZ25hdHVyZSIgPSAiQXg5SDVRRGphdVp4Y3RsSnJab1Zlb1I1WUc4OUNpdmZRYXI4NVh4Z2VDMGluMklKSXpKTGdlNGRUVVdUbmN3dlA3QnRWUUg5TTZuU1BUY1EyZFh5WllTQldhb0lGcU9EeGMwTC9PcjZ4aHQvVjZVajVhd3NHdjJSMFlIem9kOXJnYmtXZ2syTm1iWFFvVERkQiszRjNaOW54a1FGSG9PTExYMnM1QXhFcnZ1L3I1YzdjRWZaem91cjBrZkZEWWJsdSsxU1Vkbk52U015ZVdGb1VHc2VRRWVzRmlwWk1wMVRyelVsdDlacmNSM0VIcng1NHE0V0hpNkhoaDVYSTRUS0JCM0FTVjFRUy9TT3VZNDBXYW9WT1ZSV3V0Y2FkU2c5ejRIRkp3U0NTMmw0MmdXajVBOFc5Ui9CZkRZTjBNZnVYNWJ1RnpkdStYeXpGWkRBTzVRd2E3Z0FBQVdBTUlJRmZEQ0NCR1NnQXdJQkFnSUlEdXRYaCtlZUNZMHdEUVlKS29aSWh2Y05BUUVGQlFBd2daWXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Td3dLZ1lEVlFRTERDTkJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJaV3h2Y0dWeUlGSmxiR0YwYVc5dWN6RkVNRUlHQTFVRUF3dzdRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVFV4TVRFek1ESXhOVEE1V2hjTk1qTXdNakEzTWpFME9EUTNXakNCaVRFM01EVUdBMVVFQXd3dVRXRmpJRUZ3Y0NCVGRHOXlaU0JoYm1RZ2FWUjFibVZ6SUZOMGIzSmxJRkpsWTJWcGNIUWdVMmxuYm1sdVp6RXNNQ29HQTFVRUN3d2pRWEJ3YkdVZ1YyOXliR1IzYVdSbElFUmxkbVZzYjNCbGNpQlNaV3hoZEdsdmJuTXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcGMrQi9TV2lnVnZXaCswajJqTWNqdUlqd0tYRUpzczl4cC9zU2cxVmh2K2tBdGVYeWpsVWJYMS9zbFFZbmNRc1VuR09aSHVDem9tNlNkWUk1YlNJY2M4L1cwWXV4c1FkdUFPcFdLSUVQaUY0MWR1MzBJNFNqWU5NV3lwb041UEM4cjBleE5LaERFcFlVcXNTNCszZEg1Z1ZrRFV0d3N3U3lvMUlnZmRZZUZScjZJd3hOaDlLQmd4SFZQTTNrTGl5a29sOVg2U0ZTdUhBbk9DNnBMdUNsMlAwSzVQQi9UNXZ5c0gxUEttUFVockFKUXAyRHQ3K21mNy93bXYxVzE2c2MxRkpDRmFKekVPUXpJNkJBdENnbDdaY3NhRnBhWWVRRUdnbUpqbTRIUkJ6c0FwZHhYUFEzM1k3MkMzWmlCN2o3QWZQNG83UTAvb21WWUh2NGdOSkl3SURBUUFCbzRJQjF6Q0NBZE13UHdZSUt3WUJCUVVIQVFFRU16QXhNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2YjJOemNDNWhjSEJzWlM1amIyMHZiMk56Y0RBekxYZDNaSEl3TkRBZEJnTlZIUTRFRmdRVWthU2MvTVIydDUrZ2l2Uk45WTgyWGUwckJJVXdEQVlEVlIwVEFRSC9CQUl3QURBZkJnTlZIU01FR0RBV2dCU0lKeGNKcWJZWVlJdnM2N3IyUjFuRlVsU2p0ekNDQVI0R0ExVWRJQVNDQVJVd2dnRVJNSUlCRFFZS0tvWklodmRqWkFVR0FUQ0IvakNCd3dZSUt3WUJCUVVIQWdJd2diWU1nYk5TWld4cFlXNWpaU0J2YmlCMGFHbHpJR05sY25ScFptbGpZWFJsSUdKNUlHRnVlU0J3WVhKMGVTQmhjM04xYldWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElIUm9aVzRnWVhCd2JHbGpZV0pzWlNCemRHRnVaR0Z5WkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUmxJSEJ2YkdsamVTQmhibVFnWTJWeWRHbG1hV05oZEdsdmJpQndjbUZqZEdsalpTQnpkR0YwWlcxbGJuUnpMakEyQmdnckJnRUZCUWNDQVJZcWFIUjBjRG92TDNkM2R5NWhjSEJzWlM1amIyMHZZMlZ5ZEdsbWFXTmhkR1ZoZFhSb2IzSnBkSGt2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFRQmdvcWhraUc5Mk5rQmdzQkJBSUZBREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBRGFZYjB5NDk0MXNyQjI1Q2xtelQ2SXhETUlKZjRGelJqYjY5RDcwYS9DV1MyNHlGdzRCWjMrUGkxeTRGRkt3TjI3YTQvdncxTG56THJSZHJqbjhmNUhlNXNXZVZ0Qk5lcGhtR2R2aGFJSlhuWTR3UGMvem83Y1lmcnBuNFpVaGNvT0FvT3NBUU55MjVvQVE1SDNPNXlBWDk4dDUvR2lvcWJpc0IvS0FnWE5ucmZTZW1NL2oxbU9DK1JOdXhUR2Y4YmdwUHllSUdxTktYODZlT2ExR2lXb1IxWmRFV0JHTGp3Vi8xQ0tuUGFObVNBTW5CakxQNGpRQmt1bGhnd0h5dmozWEthYmxiS3RZZGFHNllRdlZNcHpjWm04dzdISG9aUS9PamJiOUlZQVlNTnBJcjdONFl0UkhhTFNQUWp2eWdhWndYRzU2QWV6bEhSVEJoTDhjVHFBPT0iOwoJInB1cmNoYXNlLWluZm8iID0gImV3b0pJbTl5YVdkcGJtRnNMWEIxY21Ob1lYTmxMV1JoZEdVdGNITjBJaUE5SUNJeU1ERTJMVEEwTFRBMklEQXdPakF5T2pJNElFRnRaWEpwWTJFdlRHOXpYMEZ1WjJWc1pYTWlPd29KSW5WdWFYRjFaUzFwWkdWdWRHbG1hV1Z5SWlBOUlDSXpNVEJrWWpKbE4yWXhOelJpTTJFNVptUmhPVE0wWkdaa01HRTJaREZpT0Raa1pqYzVNekEwSWpzS0NTSnZjbWxuYVc1aGJDMTBjbUZ1YzJGamRHbHZiaTFwWkNJZ1BTQWlNVEF3TURBd01ESXdNelkzTURNNE55STdDZ2tpWW5aeWN5SWdQU0FpTmlJN0Nna2lkSEpoYm5OaFkzUnBiMjR0YVdRaUlEMGdJakV3TURBd01EQXlNRE0yTnpBek9EY2lPd29KSW5GMVlXNTBhWFI1SWlBOUlDSXhJanNLQ1NKdmNtbG5hVzVoYkMxd2RYSmphR0Z6WlMxa1lYUmxMVzF6SWlBOUlDSXhORFU1T1RJMk1UUTROell6SWpzS0NTSjFibWx4ZFdVdGRtVnVaRzl5TFdsa1pXNTBhV1pwWlhJaUlEMGdJa1l3TWpKRk5rRXhMVFUyTURZdE5FRTRRUzA0UkRrMExUSTFOVU5GTWpRNU1FRkdNaUk3Q2draWNISnZaSFZqZEMxcFpDSWdQU0FpYm1WMExuQmxZV3RuWVcxbGN5NTBiM2xpYkdGemRDNWthV0Z0YjI1a05qUWlPd29KSW1sMFpXMHRhV1FpSUQwZ0lqRXdOakExTVRRNE1URWlPd29KSW1KcFpDSWdQU0FpYm1WMExuQmxZV3RuWVcxbGN5NWhiWGxqYmlJN0Nna2ljSFZ5WTJoaGMyVXRaR0YwWlMxdGN5SWdQU0FpTVRRMU9Ua3lOakUwT0RjMk15STdDZ2tpY0hWeVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE5pMHdOQzB3TmlBd056b3dNam95T0NCRmRHTXZSMDFVSWpzS0NTSndkWEpqYUdGelpTMWtZWFJsTFhCemRDSWdQU0FpTWpBeE5pMHdOQzB3TmlBd01Eb3dNam95T0NCQmJXVnlhV05oTDB4dmMxOUJibWRsYkdWeklqc0tDU0p2Y21sbmFXNWhiQzF3ZFhKamFHRnpaUzFrWVhSbElpQTlJQ0l5TURFMkxUQTBMVEEySURBM09qQXlPakk0SUVWMFl5OUhUVlFpT3dwOSI7CgkiZW52aXJvbm1lbnQiID0gIlNhbmRib3giOwoJInBvZCIgPSAiMTAwIjsKCSJzaWduaW5nLXN0YXR1cyIgPSAiMCI7Cn0=


Is any thing wrong?

Replies

Same issue here.


Sending an older sandbox receipt, like from 2016-03-14, yields the expected results: status 21007 from live endpoint, status 0 from sandbox endpoint.

Current receipts we generate from a testflight build however fail like you described.

So maybe it's something with testflight or ios 9.3 in general?


I also asked on twitter if someone else has this problem and got multiple positive replies.

We came across the same proplem on the same day Apr 6, 2016. Do you have any good ideas?

Are you still experiencing this issue? It is still occuring for me!

This is occuring for me as well. Any ideas?

Same for me,


we would really appreciate some documentation about this sudden change

Hi folks - we have a new theory / observation on this.


Further testing is showing that the production servers are only rejecting sandbox purchases that are using Apple's old receipt format. If you update your app to use the new iOS 7+ receipt format, our tests show that the Production servers *do* give back the appropriate response.


Please let us know if this works for anyone else as well?


Thanks,


Paul.

Some further notes from our developer:


As of iOS 7 apps recommends using the USERs full receipt instead of the transactions receipt. Warnings also outline that the old style getter is deprecated as of iOS 7.0.


Replace.


NSData *receiptData = transaction.transactionReceipt;


with


NSData *receiptData;


if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0)

{

receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

}

else

{

receiptData = transaction.transactionReceipt;

}


It appears that the new USER receipt information properly handles redirecting receipts from production to sandbox correctly. However, the OLD style receipts (per transaction) are malformed and get rejected by apple servers.


We have confirmed with the NEW Style receipt for purchasing works successfully with our servers.


---


Note - still looking for external confirmation since well, IAP testing is complicated - want to ensure that folks agree that this appears to be a good work-around.


Paul.

But I think my receipt is a new one, how to determine it ?

I got it on iOS 8 device, app deployment target is 7.0.

Actually, I think it may have to something to do with new certificate (https://developer.apple.com/support/certificates/expiration/)https://developer.apple.com/support/certificates/expiration/ as well. Because we have some applications with the old certificate and they still work. However, for the applications signed with new certificate this does not work.

Hi all,

We had the same issues, and I think they are also related to this thread: https://forums.developer.apple.com/thread/44603

We raised with Apple but didn't get a response and continued to check every day since 6th April. As of yesterday (13th) Sandbox started working again for us and our purchases were successful. We changed nothing on our side around our setup for this so I suggest others try the same and see if they have the same good fortune. For reference we use the 'old' style receipt validator reffered to as: SKPaymentTransaction.transactionReceiptnot the new one: appStoreReceiptURL. Hope this helps.

The trouble is i already request for new receipt but still get this error.