Spin up a Node app so you can validate iOS app receipts with the App Store.
Installation Examples
Local
$ mkdir myapp && cd myapp$ npm init // configure project$ npm install itunes-validation --save
Add var val = require('itunes-validation');
to your index.js
file.
Run node index.js
.
Or
$ git clone https://github.com/stuartbreckenridge/itunes-validation.git$ cd itunes-validation$ npm install$ npm start
Heroku
- Fork https://github.com/stuartbreckenridge/itunes-validation.git to your GitHub account
- Create a New App in Heroku
- Under Deployment Method select GitHub (connect to your GitHub account if necessary)
- Find the repository in the Connect to GitHub section and click Connect
- (Optional) Enable Automatic Deploys
- Click Deploy Branch
API
The app provides two endpoints:
GET /0.1/sandbox
(for sandbox receipt validation)GET /0.1/production
(for production receipt validation)
Parameter | Required | Description |
---|---|---|
receipt | Yes | Base 64 encoded receipt string. |
secret | No | Only used for receipts that contain auto-renewable subscriptions. Your app’s shared secret (a hexadecimal string). |
exclude | No | Only used for iOS7 style app receipts that contain auto-renewable or non-renewing subscriptions. If value is true, response includes only the latest renewal transaction for any subscriptions. |
In App Usage
struct Receipt: Decodable { var receipt: [String:String] var status: Int} func obfuscatedValidationMethod() { let receiptURL = Bundle.main.appStoreReceiptURL let receiptData = NSData(contentsOf: receiptURL!) let base64Receipt = receiptData?.base64EncodedString(options: .endLineWithLineFeed) let queryItems = [URLQueryItem(name: "receipt", value: base64Receipt)] var valUrl = URLComponents(string: "<# https://appName.herokuapp.com #>/0.1/sandbox") valUrl?.queryItems = queryItems let request = URLRequest(url: valUrl!.url!) let session = URLSession.shared let task = session.dataTask(with: request) { (data, response, error) in guard let responseData = data else { return } let decoder = JSONDecoder() do { let decodedReceipt = try decoder.decode(Receipt.self, from: responseData) if decodedReceipt.status == 1 { // Do something with invalid receipt. } } catch { // Handle error. } } task.resume()}