-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.rb
80 lines (67 loc) · 1.82 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
require 'sinatra'
require 'sequel'
require 'json'
require 'rest-open-uri'
require './db'
DEGUB = true
Purchase = DB[:purchase]
##
## Verifies with Apple that the receipt is valid
##
post '/verifyReceipt' do
content_type 'application/json'
result = open(appleURL(), :method => :post, :body => {"receipt-data" => params[:receipt_data]}.to_json)
json = JSON.parse(result.string)
if (json[:status].to_i == 0)
result(0, json)
else
result(1, json.merge({:original_receipt => params[:receipt_data]}))
end
end
##
## Registers a purchase in the local database
##
post '/registerPurchase' do
begin
Purchase.insert({
:product_identifier => params[:product_identifier],
:device_id => params[:device_id],
:bought_at => Date.new
})
result(0)
rescue Exception => e
result(1, nil, e)
end
end
##
## Gathers local data to see if a purchase is valid or not,
## and also checks if it's validity expired or not (if needed)
##
post '/verifyPurchase' do
purchase = Purchase.where({
:product_identifier => params[:product_identifier],
:device_id => params[:device_id]
}).first
res = {:purchased => purchase.nil?}
if !purchase.nil? and !purchase[:expires_at].nil?
res.merge!({:expired => Date.new >= purchase[:expires_at]})
end
result(0, res)
end
private
def log_error(error, result = {})
result.merge! ({"error" => {"message" => error.message}}) unless error.nil?
result
end
def result(value, data = nil, error = nil)
result = {"result" => value}
result.merge! ({:data => data}) unless data.nil?
log_error(error, result).to_json
end
def appleURL
if DEGUB
"https://sandbox.itunes.apple.com/verifyReceipt"
else
"https://buy.itunes.apple.com/verifyReceipt"
end
end