Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Apple In App Purchase
Search
Sing Jie Lee
May 22, 2015
Technology
30
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Apple In App Purchase
Sing Jie Lee
May 22, 2015
More Decks by Sing Jie Lee
See All by Sing Jie Lee
Infocomm Media Youth Festival 2016 - Career Talk
singjie
0
64
Sprite Kit
singjie
0
67
SiriKit
singjie
0
210
React Native
singjie
1
110
Arduino
singjie
0
48
Software Engineering
singjie
0
67
Advanced Core Data
singjie
0
50
Amazon Echo and Home Integration
singjie
0
120
CS3216 Garena Project X
singjie
0
59
Other Decks in Technology
See All in Technology
SLOを阻む不安
sraku2159
0
190
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
450
ドメインエキスパートは いかにして AI を使って プロダクト開発をするか
tatsuyashiraishi
1
250
これだけは抑えておきたい!後悔しない re:Invent の過ごし方 / AWS re:Invent 2026 prestudy
kinunori
2
620
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
870
AIテスト自動化と評価駆動開発EDD
happysamurai294
0
120
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
290
AI Search (Foundry IQ) におけるRAGデータの準備と配置
ryomaru0825
1
110
AIがGISを代替する日:〜すべてをAIが創る時代に、私たちがFOSS4Gに関わる意味〜
lehupa
0
170
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
1
200
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
160
[re:Invent2026事前勉強会(有志開催)]続きは、ラスベガスの廊下で / continue-in-the-vegas-hallway
sh_fk2
0
450
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
950
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
870
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
How STYLIGHT went responsive
nonsquared
100
6.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Visualization
eitanlees
153
17k
Transcript
In App Purchase iOS
Why?
Background Story
None
5 types of IAP • Consumable • Non Consumable •
Auto Renewable Subscription • Non-Renewing Subscription • Free Subscription
Products • Products are identified by ProductID • e.g. com.garena.fishfood.100
productID - Product Name (Localized) - Product Price (Tier) - Product Description
Pricing Tier
Pricing Tier
Live/Sandbox App Store Live Sandbox BeeFlight IAP Apple Review Real
AppleID, Real $$ Test AppleID, No $$
Request for SKProduct Add SKProduct to Payment Queue Finish Transaction
ProductID (NSString) 1 2 3 4
Request for SKProduct ProductID (NSString) 1 2 typedef void(^PaymentBlock)(BOOL success);
- (void)buyProductID:(NSString *)productID onCompletion:(PaymentBlock)onCompletion; { NSSet *identifiers = [NSSet setWithObject:productID]; SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers]; request.delegate = self; [request start]; self.paymentBlock = onCompletion; }
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { SKProduct *product =
[response.products firstObject]; SKPayment *payment = [SKPayment paymentWithProduct:product]; [[SKPaymentQueue defaultQueue] addPayment:payment]; } Add SKProduct to Payment Queue 3
- (void)paymentCompleted:(SKPaymentTransaction *)transaction { [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; } Finish Transaction
4
IAP Crackable
IAP Crackable
Request for SKProduct Add SKProduct to Payment Queue Verify Transaction
Finish Transaction ProductID (NSString) 1 2 3 4 5
Receive Receipt Our Server Apple Server Verification
Receive Receipt Our Server Apple Server Encrypted receipt Verification
Receive Receipt Our Server Apple Server Encrypted receipt Encrypted receipt
Verification
Receive Receipt Our Server Apple Server Encrypted receipt Encrypted receipt
Decrypted receipt Verification
iOS Client, receive receipt Our Server Apple Server Encrypted receipt
Encrypted receipt Decrypted receipt OK/Not OK Verification
Verification { "receipt": { "original_purchase_date_pst": "2015-05-20 03:26:29 America/Los_Angeles" "unique_identifier": "c1b17ca2d3ceb9b77797fc2c4826ba4aece18370",
"original_transaction_id": "340000068545339", "bvrs": "1.1", "app_item_id": "530942747", "transaction_id": "340000068545339", "quantity": "1", "unique_vendor_identifier": "D39AC063-4817-4DCE-B061-EB5EEE073A5B", "product_id": "com.singjie.btt.full.package", "item_id": "532592602", "version_external_identifier": "11626777", "bid": "com.singjie.BTT", "purchase_date_ms": "1432117589538", "purchase_date": "2015-05-20 10:26:29 Etc/GMT", "purchase_date_pst": "2015-05-20 03:26:29 America/Los_Angeles", "original_purchase_date": "2015-05-20 10:26:29 Etc/GMT", "original_purchase_date_ms": "1432117589538" }, "status": 0 }
Verification { "receipt": { "original_purchase_date_pst": "2012-07-12 05:54:35 America/Los_Angeles" "purchase_date_ms": "1342097675882",
"original_transaction_id": "170000029449420", "original_purchase_date_ms": "1342097675882", "app_item_id": "450542233", "transaction_id": "170000029449420", "quantity": "1", "bvrs": "1.4", "version_external_identifier": "9051236", "bid": "com.zeptolab.ctrexperiments", "product_id": "com.zeptolab.ctrbonus.superpower1", "purchase_date": "2012-07-12 12:54:35 Etc/GMT", "purchase_date_pst": "2012-07-12 05:54:35 America/Los_Angeles", "original_purchase_date": "2012-07-12 12:54:35 Etc/GMT", "item_id": "534185042" }, "status": 0 }
Verification { "receipt": { "original_purchase_date_pst": "2015-05-20 03:26:29 America/Los_Angeles" "unique_identifier": "c1b17ca2d3ceb9b77797fc2c4826ba4aece18370",
"original_transaction_id": "340000068545339", "bvrs": "1.1", "app_item_id": "530942747", "transaction_id": "340000068545339", "quantity": "1", "unique_vendor_identifier": "D39AC063-4817-4DCE-B061-EB5EEE073A5B", "product_id": "com.singjie.btt.full.package", "item_id": "532592602", "version_external_identifier": "11626777", "bid": "com.singjie.BTT", "purchase_date_ms": "1432117589538", "purchase_date": "2015-05-20 10:26:29 Etc/GMT", "purchase_date_pst": "2015-05-20 03:26:29 America/Los_Angeles", "original_purchase_date": "2015-05-20 10:26:29 Etc/GMT", "original_purchase_date_ms": "1432117589538" }, "status": 0 }
Demo
iTunesConnect • Create Products • Create Test Account
Q&A