itunes_receipt_validator 0.0.1 → 0.0.3
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.
- checksums.yaml +4 -4
- data/lib/itunes_receipt_validator/error.rb +15 -0
- data/lib/itunes_receipt_validator/receipt.rb +44 -24
- data/lib/itunes_receipt_validator/remote.rb +40 -19
- data/lib/itunes_receipt_validator/transaction.rb +5 -1
- data/lib/itunes_receipt_validator/version.rb +1 -1
- data/lib/itunes_receipt_validator.rb +3 -4
- metadata +9 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b77b13bb8f2873dbee2a213fd62d354f4fedbde
|
4
|
+
data.tar.gz: eb68ad8842b921cbbcb4f02d688db66eb7ba78f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96134027c767ab5c262377750b0f1a92e330a1917056dfba6a433b08cfabab0767c7dc39695e64cfafc02a80635555dd4f1d9ce2609ad8da9de776313d06c774
|
7
|
+
data.tar.gz: 3bce5284cf4ef617120923c604acd2d2dcddee596cde29bc93ba58a981117f1ef8381195ce6b80dc18107af5c5774df863129d90438f535999e972d6658a687d
|
@@ -0,0 +1,15 @@
|
|
1
|
+
##
|
2
|
+
# ItunesReceiptValidator
|
3
|
+
module ItunesReceiptValidator
|
4
|
+
##
|
5
|
+
# ItunesReceiptValidator::Error
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
##
|
9
|
+
# ItunesReceiptValidator::LocalDecodingError
|
10
|
+
class LocalDecodingError < Error; end
|
11
|
+
|
12
|
+
##
|
13
|
+
# ItunesReceiptValidator::RemoteNetworkError
|
14
|
+
class RemoteNetworkError < Error; end
|
15
|
+
end
|
@@ -4,25 +4,19 @@ module ItunesReceiptValidator
|
|
4
4
|
##
|
5
5
|
# ItunesReceiptValidator::Receipt
|
6
6
|
class Receipt
|
7
|
-
attr_reader :receipt
|
7
|
+
attr_reader :receipt
|
8
|
+
attr_accessor :shared_secret, :request_method
|
8
9
|
|
9
10
|
def initialize(receipt, options = {})
|
10
11
|
@receipt = receipt
|
11
|
-
@
|
12
|
+
@shared_secret = options.fetch(:shared_secret, nil)
|
13
|
+
@request_method = options.fetch(:request_method, nil)
|
12
14
|
local
|
13
|
-
|
14
|
-
|
15
|
-
def sandbox?
|
16
|
-
local.sandbox?
|
17
|
-
end
|
18
|
-
|
19
|
-
def production?
|
20
|
-
!sandbox?
|
15
|
+
yield self if block_given?
|
21
16
|
end
|
22
17
|
|
23
18
|
def bundle_id
|
24
|
-
@bundle_id = local.receipt
|
25
|
-
.fetch(local.style == :unified ? :bundle_id : :bid)
|
19
|
+
@bundle_id = local.receipt.fetch(style == :unified ? :bundle_id : :bid)
|
26
20
|
end
|
27
21
|
|
28
22
|
def transactions
|
@@ -38,32 +32,58 @@ module ItunesReceiptValidator
|
|
38
32
|
end
|
39
33
|
|
40
34
|
def latest_receipt
|
41
|
-
@latest_receipt = remote.json.fetch
|
35
|
+
@latest_receipt = remote.json.fetch :latest_receipt
|
42
36
|
end
|
43
37
|
|
44
38
|
def local
|
45
|
-
@local ||= ItunesReceiptDecoder.new
|
39
|
+
@local ||= ItunesReceiptDecoder.new receipt, expand_timestamps: true
|
40
|
+
rescue ItunesReceiptDecoder::DecodingError => e
|
41
|
+
raise LocalDecodingError, e.message
|
42
|
+
end
|
43
|
+
|
44
|
+
def environment
|
45
|
+
@environment ||= local.environment
|
46
|
+
end
|
47
|
+
|
48
|
+
def production?
|
49
|
+
environment == :production
|
50
|
+
end
|
51
|
+
|
52
|
+
def sandbox?
|
53
|
+
!production?
|
54
|
+
end
|
55
|
+
|
56
|
+
def style
|
57
|
+
local.style
|
46
58
|
end
|
47
59
|
|
48
60
|
def remote
|
49
|
-
@remote
|
50
|
-
|
51
|
-
|
52
|
-
|
61
|
+
return @remote if @remote
|
62
|
+
instance = Remote.new(receipt) do |remote|
|
63
|
+
remote.shared_secret = shared_secret
|
64
|
+
remote.sandbox = sandbox?
|
65
|
+
remote.request_method = request_method if request_method
|
66
|
+
end
|
67
|
+
|
68
|
+
if instance.status == 21_007
|
69
|
+
@environment = :sandbox
|
70
|
+
remote
|
71
|
+
elsif instance.status == 21_008
|
72
|
+
@environment = :production
|
73
|
+
remote
|
74
|
+
else
|
75
|
+
@remote = instance
|
76
|
+
end
|
53
77
|
end
|
54
78
|
|
55
79
|
private
|
56
80
|
|
57
81
|
def local_transactions_source
|
58
|
-
|
59
|
-
local.receipt.fetch(:in_app)
|
60
|
-
else
|
61
|
-
[local.receipt]
|
62
|
-
end
|
82
|
+
style == :unified ? local.receipt.fetch(:in_app) : [local.receipt]
|
63
83
|
end
|
64
84
|
|
65
85
|
def remote_transactions_source
|
66
|
-
if
|
86
|
+
if style == :unified
|
67
87
|
remote.json.fetch(:latest_receipt_info)
|
68
88
|
else
|
69
89
|
[remote.json.fetch(:latest_receipt_info)]
|
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/https'
|
4
|
+
|
1
5
|
##
|
2
6
|
# ItunesReceiptValidator
|
3
7
|
module ItunesReceiptValidator
|
@@ -7,13 +11,15 @@ module ItunesReceiptValidator
|
|
7
11
|
PRODUCTION_ENDPOINT = 'https://buy.itunes.apple.com/verifyReceipt'
|
8
12
|
SANDBOX_ENDPOINT = 'https://sandbox.itunes.apple.com/verifyReceipt'
|
9
13
|
|
10
|
-
attr_reader :receipt
|
14
|
+
attr_reader :receipt
|
15
|
+
attr_accessor :sandbox, :shared_secret, :request_method
|
11
16
|
|
12
|
-
def initialize(receipt
|
17
|
+
def initialize(receipt)
|
13
18
|
@receipt = receipt
|
14
|
-
@
|
15
|
-
|
16
|
-
|
19
|
+
@request_method = lambda do |url, headers, body|
|
20
|
+
default_request_method(url, headers, body)
|
21
|
+
end
|
22
|
+
yield self
|
17
23
|
end
|
18
24
|
|
19
25
|
def status
|
@@ -34,24 +40,39 @@ module ItunesReceiptValidator
|
|
34
40
|
|
35
41
|
private
|
36
42
|
|
37
|
-
def
|
38
|
-
|
39
|
-
sandbox ? SANDBOX_ENDPOINT : PRODUCTION_ENDPOINT,
|
40
|
-
options.merge(payload)
|
41
|
-
)
|
43
|
+
def request_url
|
44
|
+
sandbox ? SANDBOX_ENDPOINT : PRODUCTION_ENDPOINT
|
42
45
|
end
|
43
46
|
|
44
|
-
def
|
47
|
+
def request_headers
|
45
48
|
{
|
46
|
-
|
47
|
-
|
48
|
-
'Content-Type' => 'application/json'
|
49
|
-
},
|
50
|
-
body: {
|
51
|
-
'password' => shared_secret,
|
52
|
-
'receipt-data' => receipt
|
53
|
-
}.to_json
|
49
|
+
'Accept' => 'application/json',
|
50
|
+
'Content-Type' => 'application/json'
|
54
51
|
}
|
55
52
|
end
|
53
|
+
|
54
|
+
def request_body
|
55
|
+
{
|
56
|
+
'password' => shared_secret,
|
57
|
+
'receipt-data' => receipt
|
58
|
+
}.to_json
|
59
|
+
end
|
60
|
+
|
61
|
+
def response
|
62
|
+
@response ||= request_method.call(
|
63
|
+
request_url, request_headers, request_body
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
def default_request_method(url, headers, body)
|
68
|
+
uri = URI(url)
|
69
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
70
|
+
http.use_ssl = true
|
71
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
72
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
73
|
+
headers.each { |key, val| request[key] = val }
|
74
|
+
request.body = body
|
75
|
+
http.request request
|
76
|
+
end
|
56
77
|
end
|
57
78
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
1
3
|
##
|
2
4
|
# ItunesReceiptValidator
|
3
5
|
module ItunesReceiptValidator
|
@@ -14,7 +16,9 @@ module ItunesReceiptValidator
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def expired?
|
17
|
-
|
19
|
+
!auto_renewing? ||
|
20
|
+
receipt.remote.expired? ||
|
21
|
+
latest.expires_at < Time.now.utc
|
18
22
|
end
|
19
23
|
|
20
24
|
def cancelled?
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'pp'
|
2
|
-
require 'httparty'
|
3
1
|
require 'itunes_receipt_decoder'
|
4
2
|
require 'itunes_receipt_validator/receipt'
|
3
|
+
require 'itunes_receipt_validator/error'
|
5
4
|
require 'itunes_receipt_validator/remote'
|
6
5
|
require 'itunes_receipt_validator/transaction'
|
7
6
|
require 'itunes_receipt_validator/transactions_proxy'
|
@@ -9,7 +8,7 @@ require 'itunes_receipt_validator/transactions_proxy'
|
|
9
8
|
##
|
10
9
|
# ItunesReceiptValidator
|
11
10
|
module ItunesReceiptValidator
|
12
|
-
def self.new(receipt, options = {})
|
13
|
-
Receipt.new(receipt, options)
|
11
|
+
def self.new(receipt, options = {}, &block)
|
12
|
+
Receipt.new(receipt, options, &block)
|
14
13
|
end
|
15
14
|
end
|
metadata
CHANGED
@@ -1,43 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itunes_receipt_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mbaasy.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: httparty
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.13'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0.13'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: itunes_receipt_decoder
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- -
|
17
|
+
- - '='
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
19
|
+
version: 0.2.3
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - '='
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
26
|
+
version: 0.2.3
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,13 +123,15 @@ dependencies:
|
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '1.22'
|
139
125
|
description: |2
|
140
|
-
Validate iTunes Transaction and Unified receipts
|
126
|
+
Validate iTunes Transaction and Unified style receipts with local decoding
|
127
|
+
and remote validation.
|
141
128
|
email: hello@mbaasy.com
|
142
129
|
executables: []
|
143
130
|
extensions: []
|
144
131
|
extra_rdoc_files: []
|
145
132
|
files:
|
146
133
|
- lib/itunes_receipt_validator.rb
|
134
|
+
- lib/itunes_receipt_validator/error.rb
|
147
135
|
- lib/itunes_receipt_validator/receipt.rb
|
148
136
|
- lib/itunes_receipt_validator/remote.rb
|
149
137
|
- lib/itunes_receipt_validator/transaction.rb
|