react-native-iap: Apple verify receipt still returns 21002

Version of react-native-iap

4.6.1

Version of react-native

0.63.2

Platforms you faced the error (IOS or Android or both?)

iOS

Expected behavior

Getting the JSON response from Apple VerifyReceipt service

Actual behavior

Getting a status 21002 error

Tested environment (Emulator? Real Device?)

Both

Steps to reproduce the behavior

Here’s my React Native code :

if (Platform.OS === 'ios') {
  console.log('PURCHASE IOS IS DONE');
  console.log('Transaction Receipt', JSON.stringify({ transaction: purchase }));
  RNIap.getReceiptIOS().then(async result => {
    console.log('Purchase Receipt', result);
  });
}

It returns me this purchaseReceipt :

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

When I’m trying to send it through postman or any other way, the Apple response is forever :

{ "status": 21002 }

And yes I add the password field with my shared secret key to the request.

I know it means that the current receipt is mal-formatted or something but I don’t know what do to with it as it seems already to be base64 encoded.

Any idea ?

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 4
  • Comments: 19 (1 by maintainers)

Most upvoted comments

The validation of receipt doesn’t work on Simulator and EITHER on real device. You must test it with a download from Testflight and then running your app on a real device. This is how I finally achieved this.

fixed by replace axios to native fetch