/
apple_receipt_validator.py
executable file
·80 lines (62 loc) · 2.53 KB
/
apple_receipt_validator.py
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
#!/usr/bin/python3
import sys
import getopt
import json
import urllib3
VERIFY_RECEIPT_SANDBOX = "https://sandbox.itunes.apple.com/verifyReceipt"
VERIFY_RECEIPT_PROD = "https://buy.itunes.apple.com/verifyReceipt"
VERIFY_RECEIPT_STATUS = {}
VERIFY_RECEIPT_STATUS[0] = "🎉 Receipt is valid"
VERIFY_RECEIPT_STATUS[21002] = "💣 The encoded receipt is malformed"
VERIFY_RECEIPT_STATUS[21004] = "🔐The shared secret does not match what's on file with Apple"
VERIFY_RECEIPT_STATUS[21007] = "🔬 The receipt is from Sandbox. Add --use_sandbox"
VERIFY_RECEIPT_STATUS[21008] = "🖥 The receipt is from Production. Remove --use_sandbox"
def verify_receipt(encoded_receipt, shared_secret, use_sandbox, show_response):
if use_sandbox:
url = VERIFY_RECEIPT_SANDBOX
else:
url = VERIFY_RECEIPT_PROD
requestBody = {}
requestBody["receipt-data"] = encoded_receipt
if shared_secret:
requestBody["password"] = shared_secret
http = urllib3.PoolManager()
response = http.request("POST",
url,
headers={"content-type": "application/json"},
body=json.dumps(requestBody).encode("utf-8")
)
if response.status == 200:
responseBody = json.loads(response.data)
status = responseBody.get("status")
if status in VERIFY_RECEIPT_STATUS:
print(f"{VERIFY_RECEIPT_STATUS[status]} (status {status})")
if status == 0 and show_response:
print(responseBody)
else:
print(f"👎 Unable to validate receipt (status {status})")
else:
print(f"💣 Error: {response.status}")
if __name__ == "__main__":
help_message = "apple_receipt_validator.py [receipt_file] <OPTIONAL: -s [appstore_shared_secret] --use_sandbox --quiet>"
if len(sys.argv) < 2:
print(help_message)
sys.exit(2)
with open(sys.argv[1], "r") as f:
receipt_data = f.read().splitlines()[0]
shared_secret = None
use_sandbox = False
show_response = True
try:
opts, args = getopt.getopt(sys.argv[2:],"s:", ["secret=", "use_sandbox", "quiet"])
except getopt.GetoptError:
print(help_message)
sys.exit(2)
for opt, arg in opts:
if opt in ("--use_sandbox"):
use_sandbox = True
if opt in ("-s", "--secret"):
shared_secret = arg
if opt in ("--quiet"):
show_response = False
verify_receipt(receipt_data, shared_secret, use_sandbox, show_response)