In app purchases - kuimoani/defold GitHub Wiki
μΈ-μ± κ΅¬λ§€ (λλ μΈ-μ± κ²°μ )λ μ μ λ νλ μ΄μ΄μκ² μΆκ° 컨ν μΈ λ μΆκ° κΈ°λ₯μ λν λΉμ©μ μ²κ΅¬ν μ μμ΅λλ€. μ΄ λ§€λ΄μΌμ μ΄ κΈ°λ₯μ μν Defold APIλ₯Ό μ€λͺ ν©λλ€.
Defoldλ Appleμ iOS μ± μ€ν μ΄μ "in-app purchases" μ Android μ₯μΉμμ Google Play λλ Amazonμ "in-app billing"λ₯Ό μν μ¬ννκ³ ν΅μΌλ μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. Facebook Canvas "game payments"λ Facebook Canvasμμ μ§μλ©λλ€. μ΄λ€ μλΉμ€λ λ€μκ³Ό κ°μ΄ μ νμ νλ§€ν μ μλ κΈ°νλ₯Ό μ 곡ν©λλ€.
- μλͺ¨μ± λλ λΉμλͺ¨μ±μ νμ€ μΈ-μ± μ ν (1ν κ²°μ )
- ꡬλ (Subscription) (λ°λ³΅ κ²°μ , μλ κ²°μ )
νμ¬ Defold μΈν°νμ΄μ€λ Appleμ Storekit κΈ°λ₯κ³Ό μλ²½ν μνΈμμ© λ©λλ€. Google Playμ Facebook Canvasμ κ²½μ°λ μΈν°νμ΄μ€λ λμΌνλ―λ‘ κ° νλ«νΌμμ λμΌν μ½λλ₯Ό μ€νν μ μμ΅λλ€. νμ§λ§ μΌλΆ νλ‘μΈμ€ νλ¦μ νλ«νΌ λ§λ€ λ€λ₯Ό μ μμ΅λλ€. λν, νμ¬ Mac Appstoreλ₯Ό ν΅νΈ OS X ꡬ맀λ μ§μλκ³ μμ§ μμ΅λλ€.
Apple, Google, Amazon, Facebook μμ μμΈν μ€λͺ μ λ³Ό μ μμ΅λλ€.
- In-App Purchase Programming Guide.
- Google Play In-app Billing documentation.
- Amazon In-app Purchase documentation.
- Facebook game payments documentation.
Android μμλ Google Play λ‘λΆν° μ μ μλ΅(static responses)μ μ¬μ©νμ¬ μ±μμ IAP ꡬνμ μμνλ κ²μ μΆμ²ν©λλ€. μ΄λ κ² νλ©΄ μ±μ κ²μνκΈ° μ μ λͺ¨λ μ±μ λμμ΄ μ λλ‘ λμκ°λμ§ μΈμ¦νλ κ²μ νμ±ν ν μ μμ΅λλ€. μ¬κΈ°μ μ μ μΈμ± λΉλ§ μλ΅(static In-app Billing responses)μ ν μ€νΈνκΈ° μν 4κ°μ μμ½λ νλ‘λνΈ μμ΄λκ° μμ΅λλ€.
Google Playλ μμ΄ν μ΄ μ±κ³΅μ μΌλ‘ κ²°μ λμλμ§ μλ΅ν©λλ€. μ΄ μλ΅μ κ°μ§ ꡬ맀 μ 보 (μ, κ°μ§ order ID)λ ν¬ν¨ν JSON λ¬Έμμ΄μ ν¬ν¨νκ³ μμ΅λλ€.
Google Playλ κ²°μ κ° μ·¨μλμλμ§ μλ΅νλλ€. μ΄λ μ ν¨νμ§ μμ μ μ©μΉ΄λμ΄κ±°λ κ²°μ μ§μ μ μ¬μ©μκ° μ£Όλ¬Έμ μ·¨μ νλ λ±μ μ£Όλ¬Έ κ³Όμ μ€ μλ¬κ° λ°μνμ λ λνλ μ μμ΅λλ€.
Google Playλ κ²°μ κ° νλΆ λμλμ§ μλ΅ν©λλ€.
Google Playλ ꡬ맀μ€μΈ μμ΄ν μ΄ μ¬μ©μμ μ΄ν리μΌμ΄μ μ ν λͺ©λ‘μ μμ κ²½μ° μλ΅ν©λλ€.
iOS μ Android μ ꡬ맀 μ μ°¨λ λΉμ·ν©λλ€.
-
Apple μ΄λ Google Play μ κ°λ°μλ‘ λ±λ‘λμλμ§ νμΈν©λλ€.
-
λμ λλ°μ΄μ€(target device)μμ λμνλλ‘ νλ‘μ νΈλ₯Ό μ€μ ν©λλ€. iOS development κ·Έλ¦¬κ³ Android development κ°μ΄λλ₯Ό μ°Έκ³ νμΈμ.
-
ν μ€νΈμ© μ±μ μ€μ ν©λλ€:
- Androidλ Google Play Developer Console μμ ν μ μμ΅λλ€.
- iOSλ iTunes Connect μμ ν μ μμ΅λλ€. App ID (https://developer.apple.com μ "Member Center"μμ λ§λ€μλ) μμ "In-App Purchase" κ° νμ±ν λμ΄μλμ§ νμΈνμμμ€.
-
Google Playμ κ²½μ°, μν .apk νμΌμ μ λ‘λνκ³ κ²μ(publish)ν΄μΌ ν©λλ€. iTunes Connectμ κ²½μ°μλ μ΄ν리μΌμ΄μ μ΄ App Review μΉμΈμ λ°μ λ κΉμ§λ λ°μ΄λ리λ₯Ό μ λ‘λ νμ§ λ§μμμ€. iTunes Connectμ μ λ‘λ νλλ° μ λλ‘ λμνμ§ μλλ€λ©΄ Appleμ΄ μ΄λ₯Ό 리μ (reject)ν μλ μμ΅λλ€.
-
μ±μ μν νλ‘λνΈλ₯Ό μμ±ν©λλ€.
--
-
ν μ€νΈ μ¬μ©μλ₯Ό μΆκ°ν©λλ€.
-
iTunes Connect νμ΄μ§μ Users and Rolesμμλ μλλ°μ€ νκ²½μμ κ²°μ λ₯Ό ν μ€νΈν μ μλ μ¬μ©μλ₯Ό μΆκ°ν μ μμ΅λλ€. Developer μΈμ¦μλ₯Ό μ±μ μλͺ νκ³ ν μ€νΈ μ₯μΉμ Appstoreμμ μλλ°μ€ κ³μ μ μ¬μ©ν΄μΌ ν©λλ€.
-
Google Play Developer Console μμλ Settings > Account Details μμ License Testing μΉμ μ μ¬μ©μ μ΄λ©μΌμ μΆκ°ν μ μμ΅λλ€. μ΄λ©μΌμ μΌν(,)λ‘ κ΅¬λΆν΄ μ¬λ¬ μ΄λ©μΌμ μΆκ°ν μ μμΌλ©°, μ΄ μ¬μ©μλ€μ μ€μ λμ κ²°μ νμ§ μκ³ κ΅¬λ§€ μ μ°¨λ₯Ό ν μ€νΈ ν μ μμ΅λλ€.
-
λν Google Play μμλ Google Group μ μ€μ ν΄μ Alphaμ Beta μ€ν μ΄μμ μ±μ λ€μ΄λ‘λ ν μ μκ² ν μ€ν° κ·Έλ£Ήμ κ΄λ¦¬ν μλ μμ΅λλ€. Alpha Testing νμ ν΄λ¦νκ³ Manage list of testersλ₯Ό λλ¬μ Alpha ν μ€ν°λ‘ Google Groupμ μΆκ°ν ν λνλλ λ§ν¬λ₯Ό 곡μ νλ©΄ λ©λλ€.
-
Facebookμμμ μ μ°¨:
-
Facebook developer μ λ±λ‘λμ΄ μλμ§ νμΈν©λλ€. Facebook for developersμ "My Apps" κ³Ό "Register as a developer" λ¨κ³λ₯Ό λ°λΌ νμμμ€.
-
Facebookμ νλμ κ²°μ κΈ°λ₯μ κ°μ§κ³ μμΌλ©° λκΈ°μ(synchronous)κ³Ό λΉλκΈ°(asynchronous)μ κ²°μ λ₯Ό μ§μνλ κ²μ μꡬνκ³ μμ΅λλ€. λ λ§μ μ 보λ Payment overview μμ νμΈ λ°λλλ€.
-
μ± νΈμ€ν (app hosting)κ³Ό μ½λ°± μλ²(callback server)λ₯Ό μ€μ ν©λλ€:
- νλ‘μ νΈλ₯Ό νΈμ€ν νλ secure canvas URLμ μ€μ ν΄μΌ ν©λλ€. μμΈν μ€λͺ μ Games on Facebook μμ λ³Ό μ μμ΅λλ€.
- λ€μμΌλ‘ μ½λ°± μλ²λ₯Ό μ€μ νκΈ° μν΄ Setting up your callback server λ¨κ³λ₯Ό μνν΄ μ£Όμμμ€.
-
Facebook Developer Dashboardμμ μΊλ²μ€ μ±(canvas app)μ μ€μ ν©λλ€.
-
μ± λμ¬λ³΄λμ "Canvas Payments"μμ ν μ€νΈ μ¬μ©μλ₯Ό μΆκ°ν©λλ€.
-
Defining products μμ νλ‘λνΈ μ±μ μμ±ν©λλ€.
IAP APIλ λΉλκΈ° λ°©μμ λλ€. μ¦ νλ‘κ·Έλ¨μ΄ μλ²λ‘ κ° μμ²μ λ³΄λΈ νμλ νλ‘κ·Έλ¨μ μ€λ¨νμ§ μμ μ±λ‘ μλ΅μ κΈ°λ€λ¦¬λ κ²μ λ§ν©λλ€. λμ νλ‘κ·Έλ¨μ μ μμ μΌλ‘ λμνλ©° μλ΅μ΄ λμ°©νλ©΄ μ΄ μλ΅ λ°μ΄ν°μ λ°μνλ μ½λ°± ν¨μ(callback function)κ° νΈμΆ(invoke)λ©λλ€.
μ¬μ©κ°λ₯ν λͺ¨λ μ ν λͺ©λ‘μ κ°μ Έμ€λ €λ©΄ μλμ κ°μ΄ ν μ μμ΅λλ€.
local COINS_ID = "com.defold.examples.coins"
local LOGO_ID = "com.defold.examples.logo"
local function product_list(self, products, error)
if error == nil then
for i,p in pairs(products) do
print(p.ident)
print(p.title)
print(p.description)
print(p.currency_code)
print(p.price_string)
end
else
print(error.error)
end
end
function init(self)
-- Initiate a fetch of products
iap.list({ COINS_ID, LOGO_ID }, product_list)
endμ€μ νΈλμμ μ μννλ €λ©΄, λ¨Όμ νΈλμμ κ²°κ³Όλ₯Ό μμ νλ ν¨μλ₯Ό λ±λ‘νκ³ μ λΉν λμ μ΄ ν¨μλ₯Ό νΈμΆνλ©΄ λ©λλ€.
local function iap_listener(self, transaction, error)
if error == nil then
if transaction.state == iap.TRANS_STATE_PURCHASING then
print("Purchasing...")
elseif transaction.state == iap.TRANS_STATE_PURCHASED then
print("Purchased!")
elseif transaction.state == iap.TRANS_STATE_UNVERIFIED then
print("Unverified!")
elseif transaction.state == iap.TRANS_STATE_FAILED then
print("Failed!")
elseif transaction.state == iap.TRANS_STATE_RESTORED then
print("Restored")
end
else
print(error.error)
end
end
function on_message(self, message_id, message, sender)
...
-- IAP νΈλμμ
μ μμ νλ ν¨μλ₯Ό λ±λ‘νκΈ°
iap.set_listener(iap_listener)
-- μ½μΈ ꡬ맀 μ΄κΈ°ννκΈ°
iap.buy(COINS_ID)
...
endμ₯μΉμ μ΄μ체μ λ μ¬μ©μκ° κ΅¬λ§€λ₯Ό ν μ μλ νμ μ°½μ μλμΌλ‘ λμμ€λλ€. μ΄ μΈν°νμ΄μ€λ ν μ€νΈ/μλλ°μ€ νκ²½μμ μ€νμ€μΈμ§ μ¬λΆλ₯Ό 보μ¬μ€λλ€.
λλΆλΆμ κ²°μ μ 곡μ(payment providers)λ λκΈ°μ κ²°μ λ§μ μ§μν©λλ€. μ¦ ν΄λΌμ΄μΈνΈ(λΉμ μ μ΄ν리μΌμ΄μ )μ κ²°μ κ° μλ£λ λ TRANS_STATE_PURCHASED μ κ°μ μλ¦Όμ λ°λλ€λ κ²μ λ»ν©λλ€. μ΄λ κ²°μ μ λ§μ§λ§ μν(final state)μ΄λ©° μ΄ νΈλμμ μμ λ μ΄μμ μ½λ°±μ μ 곡νμ§ μμ΅λλ€.
μΌλΆ κ²°μ μ 곡μλ λΉλκΈ° κ²°μ λ₯Ό μ§μν κ²μ μꡬνκ³ μμ΅λλ€. μ¦ ν΄λΌμ΄μΈνΈ(λΉμ μ μ΄ν리μΌμ΄μ )μ κ²°μ κ° μ΄κΈ°ν λ λλ§ μλ¦Όμ λ°μ μ μμ΅λλ€. κ²°μ μλ£λ₯Ό νμΈνκΈ° μν΄μλ κ°λ°μ μλ²(λλ ν΄λΌμ΄μΈνΈ)μ ν΅μ νμ¬ κ²°μ κ° μ ν¨νμ§ νμΈν΄μΌ ν©λλ€. λΉλκΈ° κ²°μ λ₯Ό μ΄κΈ°ν νμ κ²½μ° iap μμ μ(iap listener)λ TRANS_STATE_UNVERIFIED λλ TRANS_STATE_PURCHASED λ₯Ό λ°μ μ μμ΅λλ€. μ΄λ κ²°μ μ λ§μ§λ§ μν(final state)μ΄λ―λ‘ μ΄ νΈλμμ μμ λ μ΄μμ μ½λ°±μ μ 곡νμ§ μμ΅λλ€.
κ²°μ μ 곡μλ‘λΆν° ꡬ맀λ₯Ό μλ£νκΈ° μν΄μλ, μ΄ν리μΌμ΄μ μ ꡬ맀 μ΄νμ(purchase fulfillment)λ₯Ό κ²°μ μ 곡μμκ² μ릴 νμκ° μμ΅λλ€.(μ: κ°λ°μ μλ² μ¬μ΄λμμ νμΈ). Iapλ κ΅¬λ§€κ° μλ£λ κ²½μ°(κΈ°λ³Έ λμ) 곡κΈμμκ² μλμΌλ‘ μ΄νμ(fulfillment)λ₯Ό μλ €μ£Όλ μλ-μμ± κΈ°λ₯μ μ§μν©λλ€. λν game project μ€μ μμ μ΄ κΈ°λ₯μ λΉνμ±ν ν μλ μμ΅λλ€. κ·Έλ¬λ©΄ νΈλμμ μ΄ μλ£λ λ iap.finish()λ₯Ό νΈμΆν΄μ ꡬ맀 μ΄νμλ₯Ό μ 곡μμκ² λκΈΈ μ μμ΅λλ€.
μμμ¦(receipt)μ κ²°μ κ° μ±κ³΅μ μΌλ‘ μ²λ¦¬λμλμ§ νμΈνκΈ° μν΄μ App Storeλ‘ μ μ‘νλ μλͺ λ λ°μ΄ν°μ λ¬Άμ(chunk)μ λλ€. μ΄λ λ³λμ μλ²λ₯Ό μ¬μ©νμ¬ κ²°μ μ§νμ νμΈνλ μμ μ μ€κ³ν λ λ§€μ° μ μ©ν©λλ€.
Google Play Developer Console μ alphaλ beta μ±λμ .apkλ₯Ό μ λ‘λνκ³ κ²μ(publish)ν΄μΌ ν©λλ€. λν λΉμ μ μ₯μΉμ μκ°μ΄λ λ μ§κ° μ ννμ§ νμΈν΄ 보μΈμ.
iOS Paid Applications κ³μ μ μμ²ν΄μ μ¬λ°λ₯Έ λ¬Έμκ° μ μΆλμλμ§ νμΈν©λλ€. μ μ ν μΉμΈ(authorization) μμ΄λ iOS μ± κ΅¬λ§€(ν μ€νΈ ꡬ맀λ)κ° μ λλ‘ λμνμ§ μμ΅λλ€.
"Member Center" μ AppIdμμ in-app purchasesκ° νμ±ν(activated)λμ΄ μλμ§ νμΈνκ³ μ±(λλ dev-app)μ νλ‘λΉμ Έλ νλ‘νμΌμ΄ AppIdμ μ¬λ°λ₯Έ λ μ§λ‘ μλͺ λμ΄ μλμ§ νμΈν©λλ€. ("Member Center"μ "Certificates, Identifiers & Profiles"μμ provisioning profile details μ "Enabled Services:" νλ νμΈ)
μ¬κΈ°μ In-App product IDκ° μλλ°μ€ νκ²½μΌλ‘ μ νλλλ° λͺ μκ°μ΄ 걸릴 μλ μμ΅λλ€.
iap.listλ μ€μ²© νΈμΆ(nested calls)λ₯Ό μ§μνμ§ μμ΅λλ€. iap.list μ½λ°±ν¨μμμ iap.list λ₯Ό νΈμΆνλ κ²μ μ΄ μλ¬λ₯Ό μμ§νλ μμ§μμ 무μνκ² λ©λλ€.
~ λ¬Έμλ ν°νΈ νμΌμμ μΌμΉνλ λ¬Έμλ₯Ό μ°Ύμ μ μλ placeholdersμ λλ€. iap.list()λ₯Ό μ¬μ©νλ κ²½μ° μ ν λͺ©λ‘μμ λ°νλ "price_string" νλλ μ΄ κ°κ³Ό νν λΆλͺ¨(currency denominator) μ¬μ΄μμ μ€ λ°κΏ μλ 곡백(non breaking space (\u00a0))μΌλ‘ νμν λ©λλ€. λ§μ½ GUIμμ μ΄ λ¬Έμμ΄μ λ λλ§νλ €λ©΄, ν°νΈμ extra_characters νλμ μ΄ λ¬Έμλ₯Ό μΆκ°ν νμκ° μμ΅λλ€. Mac OS Xμμλ μ€ λ°κΏ μλ 곡백(non breaking spaces)μ Option-<SPACE> λ₯Ό λλ¬μ μ λ ₯ν μ μμ΅λλ€. μμΈν μ 보λ https://ko.wikipedia.org/wiki/μ€ λ°κΏ μλ 곡백 λ₯Ό νμΈ λ°λλλ€.
--




