Skip to content

Instantly share code, notes, and snippets.

@sauloarruda
Created April 30, 2012 15:47
Show Gist options
  • Save sauloarruda/2559455 to your computer and use it in GitHub Desktop.
Save sauloarruda/2559455 to your computer and use it in GitHub Desktop.
Apple iOS in app purchase validate receipt in Ruby
ewoJInNpZ25hdHVyZSIgPSAiQXBNVUJDODZBbHpOaWtWNVl0clpBTWlKUWJLOEVk
ZVhrNjNrV0JBWHpsQzhkWEd1anE0N1puSVlLb0ZFMW9OL0ZTOGNYbEZmcDlZWHQ5
aU1CZEwyNTBsUlJtaU5HYnloaXRyeVlWQVFvcmkzMlc5YVIwVDhML2FZVkJkZlcr
T3kvUXlQWkVtb05LeGhudDJXTlNVRG9VaFo4Wis0cFA3MHBlNWtVUWxiZElWaEFB
QURWekNDQTFNd2dnSTdvQU1DQVFJQ0NHVVVrVTNaV0FTMU1BMEdDU3FHU0liM0RR
RUJCUVVBTUg4eEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUtEQXBCY0hCc1pT
QkpibU11TVNZd0pBWURWUVFMREIxQmNIQnNaU0JEWlhKMGFXWnBZMkYwYVc5dUlF
RjFkR2h2Y21sMGVURXpNREVHQTFVRUF3d3FRWEJ3YkdVZ2FWUjFibVZ6SUZOMGIz
SmxJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEE1TURZeE5U
SXlNRFUxTmxvWERURTBNRFl4TkRJeU1EVTFObG93WkRFak1DRUdBMVVFQXd3YVVI
VnlZMmhoYzJWU1pXTmxhWEIwUTJWeWRHbG1hV05oZEdVeEd6QVpCZ05WQkFzTUVr
RndjR3hsSUdsVWRXNWxjeUJUZEc5eVpURVRNQkVHQTFVRUNnd0tRWEJ3YkdVZ1NX
NWpMakVMTUFrR0ExVUVCaE1DVlZNd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZ
MEFNSUdKQW9HQkFNclJqRjJjdDRJclNkaVRDaGFJMGc4cHd2L2NtSHM4cC9Sd1Yv
cnQvOTFYS1ZoTmw0WElCaW1LalFRTmZnSHNEczZ5anUrK0RyS0pFN3VLc3BoTWRk
S1lmRkU1ckdYc0FkQkVqQndSSXhleFRldngzSExFRkdBdDFtb0t4NTA5ZGh4dGlJ
ZERnSnYyWWFWczQ5QjB1SnZOZHk2U01xTk5MSHNETHpEUzlvWkhBZ01CQUFHamNq
QndNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVOaDNvNHAyQzBn
RVl0VEpyRHRkREM1RllRem93RGdZRFZSMFBBUUgvQkFRREFnZUFNQjBHQTFVZERn
UVdCQlNwZzRQeUdVakZQaEpYQ0JUTXphTittVjhrOVRBUUJnb3Foa2lHOTJOa0Jn
VUJCQUlGQURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUVhU2JQanRtTjRDL0lC
M1FFcEszMlJ4YWNDRFhkVlhBZVZSZVM1RmFaeGMrdDg4cFFQOTNCaUF4dmRXLzNl
VFNNR1k1RmJlQVlMM2V0cVA1Z204d3JGb2pYMGlreVZSU3RRKy9BUTBLRWp0cUIw
N2tMczlRVWU4Y3pSOFVHZmRNMUV1bVYvVWd2RGQ0TndOWXhMUU1nNFdUUWZna1FR
Vnk4R1had1ZIZ2JFL1VDNlk3MDUzcEdYQms1MU5QTTN3b3hoZDNnU1JMdlhqK2xv
SHNTdGNURXFlOXBCRHBtRzUrc2s0dHcrR0szR01lRU41LytlMVFUOW5wL0tsMW5q
K2FCdzdDMHhzeTBiRm5hQWQxY1NTNnhkb3J5L0NVdk02Z3RLc21uT09kcVRlc2Jw
MGJzOHNuNldxczBDOWRnY3hSSHVPTVoydG04bnBMVW03YXJnT1N6UT09IjsKCSJw
dXJjaGFzZS1pbmZvIiA9ICJld29KSW05eWFXZHBibUZzTFhCMWNtTm9ZWE5sTFdS
aGRHVXRjSE4wSWlBOUlDSXlNREV5TFRBMExUTXdJREE0T2pBMU9qVTFJRUZ0WlhK
cFkyRXZURzl6WDBGdVoyVnNaWE1pT3dvSkltOXlhV2RwYm1Gc0xYUnlZVzV6WVdO
MGFXOXVMV2xrSWlBOUlDSXhNREF3TURBd01EUTJNVGM0T0RFM0lqc0tDU0ppZG5K
eklpQTlJQ0l5TURFeU1EUXlOeUk3Q2draWRISmhibk5oWTNScGIyNHRhV1FpSUQw
Z0lqRXdNREF3TURBd05EWXhOemc0TVRjaU93b0pJbkYxWVc1MGFYUjVJaUE5SUNJ
eElqc0tDU0p2Y21sbmFXNWhiQzF3ZFhKamFHRnpaUzFrWVhSbExXMXpJaUE5SUNJ
eE16TTFOems0TXpVMU9EWTRJanNLQ1NKd2NtOWtkV04wTFdsa0lpQTlJQ0pqYjIw
dWJXbHVaRzF2WW1Gd2NDNWtiM2R1Ykc5aFpDSTdDZ2tpYVhSbGJTMXBaQ0lnUFNB
aU5USXhNVEk1T0RFeUlqc0tDU0ppYVdRaUlEMGdJbU52YlM1dGFXNWtiVzlpWVhC
d0xrMXBibVJOYjJJaU93b0pJbkIxY21Ob1lYTmxMV1JoZEdVdGJYTWlJRDBnSWpF
ek16VTNPVGd6TlRVNE5qZ2lPd29KSW5CMWNtTm9ZWE5sTFdSaGRHVWlJRDBnSWpJ
d01USXRNRFF0TXpBZ01UVTZNRFU2TlRVZ1JYUmpMMGROVkNJN0Nna2ljSFZ5WTJo
aGMyVXRaR0YwWlMxd2MzUWlJRDBnSWpJd01USXRNRFF0TXpBZ01EZzZNRFU2TlRV
Z1FXMWxjbWxqWVM5TWIzTmZRVzVuWld4bGN5STdDZ2tpYjNKcFoybHVZV3d0Y0hW
eVkyaGhjMlV0WkdGMFpTSWdQU0FpTWpBeE1pMHdOQzB6TUNBeE5Ub3dOVG8xTlNC
RmRHTXZSMDFVSWpzS2ZRPT0iOwoJImVudmlyb25tZW50IiA9ICJTYW5kYm94IjsK
CSJwb2QiID0gIjEwMCI7Cgkic2lnbmluZy1zdGF0dXMiID0gIjAiOwp9
{
"receipt": {
"original_purchase_date_pst": "2012-04-30 08:05:55 America/Los_Angeles",
"original_transaction_id": "1000000046178817",
"original_purchase_date_ms": "1335798355868",
"transaction_id": "1000000046178817",
"quantity": "1",
"product_id": "br.com.jera.Example",
"bvrs": "20120427",
"purchase_date_ms": "1335798355868",
"purchase_date": "2012-04-30 15:05:55 Etc/GMT",
"original_purchase_date": "2012-04-30 15:05:55 Etc/GMT",
"purchase_date_pst": "2012-04-30 08:05:55 America/Los_Angeles",
"bid": "br.com.jera.Example",
"item_id": "521129812"
},
"status": 0
}
# This code call the apple sandbox in app purchase server to validate a receipt using Ruby Code.
# Run this using "ruby verifyReceipt.rb"
# By @sauloarruda (http://twitter.com/sauloarruda)
require 'net/http'
# This core reads an file called receipt (see an example bellow)
params_json = "{ \"receipt-data\": \"#{open("./receipt").read}\" }"
# Use net/http to post to apple sandbox server
uri = URI("https://sandbox.itunes.apple.com") # Use "https://buy.itunes.apple.com" for production
Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
response = http.post('/verifyReceipt', params_json)
# Puts the result! (see an example below - result.json)
puts response.body
end
@mhlavac
Copy link

mhlavac commented Sep 8, 2012

Would you mind if i use your receipt in my unit tests for PHP library which validates receipts from appstore?

Copy link

ghost commented Jan 21, 2014

For now the result.json is in the form (at least in sandbox environment):

{
    'status': 0,
    'environment': 'Sandbox',
    'receipt': {
        'download_id': 0,
        'adam_id': 0,
        'request_date': '2014-01-21 16:15:23 Etc/GMT',
        'in_app': [{
            'is_trial_period': 'false',
            'purchase_date_pst': '2014-01-21 08:15:21 America/Los_Angeles',
            'product_id': 'com.cinnamon.nepocujuci.lesson.6',
            'original_transaction_id': '1000000098953824',
            'original_purchase_date_pst': '2014-01-20 11:03:05 America/Los_Angeles',
            'original_purchase_date': '2014-01-20 19:03:05 Etc/GMT',
            'original_purchase_date_ms': '1390244585000',
            'purchase_date': '2014-01-21 16:15:21 Etc/GMT',
            'purchase_date_ms': '1390320921000',
            'transaction_id': '1000000098953824',
            'quantity': '1'
        }],
        'request_date_ms': '1390320923038',
        'bundle_id': 'com.cinnamon.nepocujuci',
        'request_date_pst': '2014-01-21 08:15:23 America/Los_Angeles',
        'application_version': '1.0',
        'receipt_type': 'ProductionSandbox'
    }
}

@alan-andrade
Copy link

👍 so good. Thanks for this.

@dbalduini
Copy link

thanks, this helped me a lot

@ozgun
Copy link

ozgun commented Jun 19, 2015

This is the latest result.json:

{
    "adam_id": null,
    "app_item_id": null,
    "application_version": null,
    "bid": "com.mindmobapp.MindMob",
    "bundle_id": null,
    "bvrs": "20120427",
    "download_id": null,
    "expires_date": null,
    "in_app": null,
    "is_trial_period": null,
    "itunes_env": "sandbox",
    "latest": null,
    "original": {
        "adam_id": null,
        "app_item_id": null,
        "application_version": null,
        "bid": null,
        "bundle_id": null,
        "bvrs": null,
        "download_id": null,
        "expires_date": null,
        "in_app": null,
        "is_trial_period": null,
        "itunes_env": "production",
        "latest": null,
        "original": null,
        "product_id": null,
        "purchase_date": "2012-04-30T15:05:55.000+00:00",
        "purchase_date_ms": 1335798355868,
        "purchase_date_pst": "2012-04-30T08:05:55.000-08:00",
        "quantity": null,
        "receipt_data": null,
        "request_date": null,
        "request_date_ms": null,
        "request_date_pst": null,
        "transaction_id": "1000000046178817",
        "version_external_identifier": null
    },
    "product_id": "com.mindmobapp.download",
    "purchase_date": "2012-04-30T15:05:55.000+00:00",
    "purchase_date_ms": 1335798355868,
    "purchase_date_pst": "2012-04-30T08:05:55.000-08:00",
    "quantity": 1,
    "receipt_data": null,
    "request_date": null,
    "request_date_ms": null,
    "request_date_pst": null,
    "transaction_id": "1000000046178817",
    "version_external_identifier": null
}

@gabrielgarza
Copy link

Thanks this post was helpful to get a better understanding. I built a gem called Monza to make receipt validation very easy. Check it out here https://github.com/gabrielgarza/monza

@nodeleaks
Copy link

@gabrielgarza tnx bro!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment