itunes-receipt 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/itunes/receipt.rb +28 -17
- data/spec/fake_json/autorenew_subscription.json +2 -0
- data/spec/itunes/receipt_spec.rb +51 -3
- metadata +61 -21
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/itunes/receipt.rb
CHANGED
@@ -10,27 +10,38 @@ module Itunes
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
# expires_date, receipt_data, and latest (receipt) will only appear for autorenew subscription products
|
14
|
+
attr_reader :quantity, :product_id, :transaction_id, :purchase_date, :app_item_id, :version_external_identifier, :bid, :bvrs, :original, :expires_date, :receipt_data, :latest
|
14
15
|
|
15
16
|
def initialize(attributes = {})
|
16
|
-
|
17
|
-
|
17
|
+
receipt_attributes = attributes.with_indifferent_access[:receipt]
|
18
|
+
if receipt_attributes[:quantity]
|
19
|
+
@quantity = receipt_attributes[:quantity].to_i
|
18
20
|
end
|
19
|
-
@product_id =
|
20
|
-
@transaction_id =
|
21
|
-
@purchase_date = if
|
22
|
-
Time.parse
|
21
|
+
@product_id = receipt_attributes[:product_id]
|
22
|
+
@transaction_id = receipt_attributes[:transaction_id]
|
23
|
+
@purchase_date = if receipt_attributes[:purchase_date]
|
24
|
+
Time.parse receipt_attributes[:purchase_date].sub('Etc/', '')
|
23
25
|
end
|
24
|
-
@app_item_id =
|
25
|
-
@version_external_identifier =
|
26
|
-
@bid =
|
27
|
-
@bvrs =
|
28
|
-
if
|
29
|
-
@original = self.class.new(
|
30
|
-
:transaction_id =>
|
31
|
-
:purchase_date =>
|
32
|
-
)
|
26
|
+
@app_item_id = receipt_attributes[:app_item_id]
|
27
|
+
@version_external_identifier = receipt_attributes[:version_external_identifier]
|
28
|
+
@bid = receipt_attributes[:bid]
|
29
|
+
@bvrs = receipt_attributes[:bvrs]
|
30
|
+
if receipt_attributes[:original_transaction_id] || receipt_attributes[:original_purchase_date]
|
31
|
+
@original = self.class.new(:receipt => {
|
32
|
+
:transaction_id => receipt_attributes[:original_transaction_id],
|
33
|
+
:purchase_date => receipt_attributes[:original_purchase_date]
|
34
|
+
})
|
33
35
|
end
|
36
|
+
|
37
|
+
# autorenew subscription handling
|
38
|
+
# attributes[:latest_receipt_info] and attributes[:latest_receipt] will be nil if you already have the receipt for the most recent renewal.
|
39
|
+
if attributes[:latest_receipt_info]
|
40
|
+
full_receipt_data = attributes[:latest_receipt] # should also be in the top-level hash if attributes[:latest_receipt_info] is there, but this won't break if it isn't
|
41
|
+
@latest = self.class.new(:receipt => attributes[:latest_receipt_info], :latest_receipt => full_receipt_data, :receipt_type => :latest)
|
42
|
+
end
|
43
|
+
@expires_date = Time.at(receipt_attributes[:expires_date].to_i / 1000) if receipt_attributes[:expires_date]
|
44
|
+
@receipt_data = attributes[:latest_receipt] if attributes[:receipt_type] == :latest # it feels wrong to include the receipt_data for the latest receipt on anything other than the latest receipt
|
34
45
|
end
|
35
46
|
|
36
47
|
def self.verify!(receipt_data)
|
@@ -41,7 +52,7 @@ module Itunes
|
|
41
52
|
response = JSON.parse(response).with_indifferent_access
|
42
53
|
case response[:status]
|
43
54
|
when 0
|
44
|
-
new response
|
55
|
+
new response
|
45
56
|
else
|
46
57
|
raise VerificationFailed.new(response)
|
47
58
|
end
|
@@ -0,0 +1,2 @@
|
|
1
|
+
{"receipt":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d69cc362c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157508197", "transaction_id":"1000000055076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000026553289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:45:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208197", "expires_date_formatted_pst":"2012-10-13 12:45:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "latest_receipt_info":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d79cc562c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157808000", "transaction_id":"1000000052076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000027293289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:50:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208000", "expires_date_formatted_pst":"2012-10-13 12:50:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "status":0, "latest_receipt":"junk="}
|
2
|
+
|
data/spec/itunes/receipt_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Itunes::Receipt do
|
|
7
7
|
sandbox_mode do
|
8
8
|
expect do
|
9
9
|
Itunes::Receipt.verify! 'receipt-data'
|
10
|
-
end.
|
10
|
+
end.to post_to Itunes::ENDPOINT[:sandbox]
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -19,7 +19,7 @@ describe Itunes::Receipt do
|
|
19
19
|
it 'should raise VerificationFailed' do
|
20
20
|
expect do
|
21
21
|
Itunes::Receipt.verify! 'invalid'
|
22
|
-
end.
|
22
|
+
end.to raise_error Itunes::Receipt::VerificationFailed
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -40,11 +40,59 @@ describe Itunes::Receipt do
|
|
40
40
|
receipt.original.quantity.should be_nil
|
41
41
|
receipt.original.transaction_id.should == '1000000001479608'
|
42
42
|
receipt.original.purchase_date.should == Time.utc(2011, 2, 17, 6, 20, 57)
|
43
|
+
receipt.expires_date.should be_nil
|
44
|
+
receipt.receipt_data.should be_nil
|
43
45
|
|
44
46
|
# Those attributes are not returned from iTunes Connect Sandbox
|
45
47
|
receipt.app_item_id.should be_nil
|
46
48
|
receipt.version_external_identifier.should be_nil
|
47
49
|
end
|
48
50
|
end
|
51
|
+
|
52
|
+
context 'when autorenew subscription' do
|
53
|
+
before do
|
54
|
+
fake_json :autorenew_subscription
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return valid Receipt instance for autorenew subscription' do
|
58
|
+
original_transaction_id = '1000000057005439'
|
59
|
+
original_purchase_date = Time.utc(2012, 10, 11, 14, 45, 40)
|
60
|
+
receipt = Itunes::Receipt.verify! 'autorenew_subscription'
|
61
|
+
receipt.should be_instance_of Itunes::Receipt
|
62
|
+
receipt.quantity == 1
|
63
|
+
receipt.product_id.should == 'com.notkeepingitreal.fizzbuzz.subscription.autorenew1m'
|
64
|
+
receipt.transaction_id.should == '1000000055076747'
|
65
|
+
receipt.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8)
|
66
|
+
receipt.bid.should == 'com.notkeepingitreal.fizzbuzz'
|
67
|
+
receipt.bvrs.should == '1.0'
|
68
|
+
receipt.original.quantity.should be_nil
|
69
|
+
receipt.original.transaction_id.should == original_transaction_id
|
70
|
+
receipt.original.purchase_date.should == original_purchase_date
|
71
|
+
receipt.expires_date.should == Time.utc(2012, 10, 13, 19, 45, 8)
|
72
|
+
receipt.receipt_data.should be_nil
|
73
|
+
|
74
|
+
# Those attributes are not returned from iTunes Connect Sandbox
|
75
|
+
receipt.app_item_id.should be_nil
|
76
|
+
receipt.version_external_identifier.should be_nil
|
77
|
+
|
78
|
+
latest = receipt.latest
|
79
|
+
latest.should be_instance_of Itunes::Receipt
|
80
|
+
latest.quantity == 1
|
81
|
+
latest.product_id.should == 'com.notkeepingitreal.fizzbuzz.subscription.autorenew1m'
|
82
|
+
latest.transaction_id.should == '1000000052076747'
|
83
|
+
latest.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8)
|
84
|
+
latest.expires_date.should == Time.utc(2012, 10, 13, 19, 50, 8) # five minutes after the "old" receipt
|
85
|
+
latest.bid.should == 'com.notkeepingitreal.fizzbuzz'
|
86
|
+
latest.bvrs.should == '1.0'
|
87
|
+
latest.original.quantity.should be_nil
|
88
|
+
latest.original.transaction_id.should == original_transaction_id
|
89
|
+
latest.original.purchase_date.should == original_purchase_date
|
90
|
+
latest.receipt_data.should == 'junk='
|
91
|
+
|
92
|
+
# Those attributes are not returned from iTunes Connect Sandbox
|
93
|
+
latest.app_item_id.should be_nil
|
94
|
+
latest.version_external_identifier.should be_nil
|
95
|
+
end
|
96
|
+
end
|
49
97
|
end
|
50
|
-
end
|
98
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itunes-receipt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
default_executable:
|
12
|
+
date: 2012-10-15 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: json
|
17
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
@@ -22,10 +21,15 @@ dependencies:
|
|
22
21
|
version: 1.4.3
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.4.3
|
26
30
|
- !ruby/object:Gem::Dependency
|
27
31
|
name: restclient_with_cert
|
28
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
29
33
|
none: false
|
30
34
|
requirements:
|
31
35
|
- - ! '>='
|
@@ -33,10 +37,15 @@ dependencies:
|
|
33
37
|
version: '0'
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
37
46
|
- !ruby/object:Gem::Dependency
|
38
47
|
name: activesupport
|
39
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
40
49
|
none: false
|
41
50
|
requirements:
|
42
51
|
- - ! '>='
|
@@ -44,10 +53,15 @@ dependencies:
|
|
44
53
|
version: '2.3'
|
45
54
|
type: :runtime
|
46
55
|
prerelease: false
|
47
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.3'
|
48
62
|
- !ruby/object:Gem::Dependency
|
49
63
|
name: i18n
|
50
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
51
65
|
none: false
|
52
66
|
requirements:
|
53
67
|
- - ! '>='
|
@@ -55,10 +69,15 @@ dependencies:
|
|
55
69
|
version: '0'
|
56
70
|
type: :runtime
|
57
71
|
prerelease: false
|
58
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
59
78
|
- !ruby/object:Gem::Dependency
|
60
79
|
name: rake
|
61
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
62
81
|
none: false
|
63
82
|
requirements:
|
64
83
|
- - ! '>='
|
@@ -66,10 +85,15 @@ dependencies:
|
|
66
85
|
version: '0.8'
|
67
86
|
type: :development
|
68
87
|
prerelease: false
|
69
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0.8'
|
70
94
|
- !ruby/object:Gem::Dependency
|
71
95
|
name: rcov
|
72
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
73
97
|
none: false
|
74
98
|
requirements:
|
75
99
|
- - ! '>='
|
@@ -77,10 +101,15 @@ dependencies:
|
|
77
101
|
version: '0.9'
|
78
102
|
type: :development
|
79
103
|
prerelease: false
|
80
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.9'
|
81
110
|
- !ruby/object:Gem::Dependency
|
82
111
|
name: rspec
|
83
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
84
113
|
none: false
|
85
114
|
requirements:
|
86
115
|
- - ! '>='
|
@@ -88,10 +117,15 @@ dependencies:
|
|
88
117
|
version: '2'
|
89
118
|
type: :development
|
90
119
|
prerelease: false
|
91
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2'
|
92
126
|
- !ruby/object:Gem::Dependency
|
93
127
|
name: fakeweb
|
94
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
95
129
|
none: false
|
96
130
|
requirements:
|
97
131
|
- - ! '>='
|
@@ -99,7 +133,12 @@ dependencies:
|
|
99
133
|
version: 1.3.0
|
100
134
|
type: :development
|
101
135
|
prerelease: false
|
102
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.3.0
|
103
142
|
description: Handle iTunes In App Purchase Receipt Verification
|
104
143
|
email: nov@matake.jp
|
105
144
|
executables: []
|
@@ -117,12 +156,12 @@ files:
|
|
117
156
|
- itunes-receipt.gemspec
|
118
157
|
- lib/itunes.rb
|
119
158
|
- lib/itunes/receipt.rb
|
159
|
+
- spec/fake_json/autorenew_subscription.json
|
120
160
|
- spec/fake_json/invalid.json
|
121
161
|
- spec/fake_json/valid.json
|
122
162
|
- spec/helpers/fake_json_helper.rb
|
123
163
|
- spec/itunes/receipt_spec.rb
|
124
164
|
- spec/spec_helper.rb
|
125
|
-
has_rdoc: true
|
126
165
|
homepage: http://github.com/nov/itunes-receipt
|
127
166
|
licenses: []
|
128
167
|
post_install_message:
|
@@ -143,11 +182,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
182
|
version: '0'
|
144
183
|
requirements: []
|
145
184
|
rubyforge_project:
|
146
|
-
rubygems_version: 1.
|
185
|
+
rubygems_version: 1.8.24
|
147
186
|
signing_key:
|
148
187
|
specification_version: 3
|
149
188
|
summary: Handle iTunes In App Purchase Receipt Verification
|
150
189
|
test_files:
|
190
|
+
- spec/fake_json/autorenew_subscription.json
|
151
191
|
- spec/fake_json/invalid.json
|
152
192
|
- spec/fake_json/valid.json
|
153
193
|
- spec/helpers/fake_json_helper.rb
|