hello i wold like to integrate in app purchases in corona app and i fallowed the inAppDemo
tutorial that can be found
my problem is that all items that i want are returned as invalid. i have setup the iTunes connect and downloaded new provisioning profile to the app… but still nothing
[lua]-- Requires Corona build #261 or later.
– Version: 1.0 (January 7, 2010)
– Sample code is MIT licensed, see http://developer.anscamobile.com/code/license
– Copyright © 2010 ANSCA Inc. All Rights Reserved.
local ui = require(“ui”)
local store = require(“store”) – Available in Corona build #261 or later
local isSimulator = “simulator” == system.getInfo(“environment”)
display.setStatusBar( display.HiddenStatusBar )
– Unbuffer console output for debugging
io.output():setvbuf(‘no’) – Remove me for production code
local titlecard
function showTitle()
if isSimulator then
local myAlert = native.showAlert( “iTunes Store not available in Corona Simulator”,
“Offline testing: see console for output.”,
{ “OK” } )
end
titlecard = display.newImage( “titlecard.png”, true )
titlecard.x = display.contentCenterX
titlecard.y = display.contentCenterY
end
local bg
local validProducts, invalidProducts = {}, {}
local descriptionArea
– Product IDs should match the In App Purchase products set up in iTunes Connect.
– We cannot get them from the iTunes store so here they are hard coded;
– your app could obtain them dynamically from your server.
local listOfProducts =
{
– These Product IDs must already be set up in your store
– We’ll use this list to retrieve prices etc. for each item
– Note, this simple test only has room for about 4 items, please adjust accordingly
– The iTunes store will not validate bad Product IDs
“com.compan.app.something”,
“com.compan.app.noPick” ,
}
– Process and display product information obtained from store.
– Constructs a button for each item
function unpackValidProducts()
– Utility to build a buy button
function newBuyButton (index)
– Handler for buy button
local buttonDefault = “buttonBuy.png”
local buttonOver = “buttonBuyDown.png”
local buyThis = function ( product )
print (“Ka-ching! Purchasing " …product)
– Purchase the item
if store.canMakePurchases then
store.purchase( {product} )
else
native.showAlert(“Store purchases are not available, please try again later”,
{ “OK” } )
end
end
function buyThis_closure ( index )
– Closure wrapper for buyThis() to remember which button
return function ( event )
buyThis (validProducts[index].productIdentifier)
return true
end
end
local hideDescription = function ( )
descriptionArea.text = “Select a product…”
end
local describeThis = function ( description )
– Display product description for testing
print (“About this product: " …description)
– TODO wrap if necessary
descriptionArea.text = description
timer.performWithDelay( 2000, hideDescription)
end
function describeThis_closure ( index )
– Closure wrapper for describeThis() to remember which button
return function ( event )
describeThis (validProducts[index].description)
return true
end
end
local formatted = string.format(”%.2f”, validProducts[index].price)
local label = validProducts[index].title … " " …formatted
local myButton = ui.newButton{
default = buttonDefault, over = buttonOver,
onPress = describeThis_closure (index), onRelease = buyThis_closure (index),
text = “”, textColor = {2, 0, 127, 255}, font=“Marker Felt”, size = 14, emboss = false
}
myButton:setReferencePoint(display.CenterLeftReferencePoint)
myButton:setText(label)
return myButton
end
– Utility to build a restore button
function newRestoreButton ()
local buttonDefault = “buttonRestore.png”
local buttonOver = “buttonRestoreDown.png”
local restore = function ( product )
– Ask the iTunes Store to initiate restore transaction sequence
print ("Restoring " )
store.restore()
end
local hideDescription = function ( )
descriptionArea.text = “Select a product…”
end
local describeThis = function ()
– Display info in description area
print (“Test restore feature”)
descriptionArea.text = “Test restore feature”
timer.performWithDelay( 2000, hideDescription)
end
local label = “Test restore”
local myButton = ui.newButton{
default = buttonDefault, over = buttonOver,
onPress = describeThis, onRelease = restore,
text = “”, textColor = {255, 255, 1, 255}, font=“Marker Felt”, size = 14, emboss = false
}
myButton:setReferencePoint(display.CenterLeftReferencePoint)
myButton:setText(label)
return myButton
end
print (“Loading product list”)
if not validProducts then
native.showAlert( “In App features not available”, “initStore() failed”, { “OK” } )
else
print (“Product list loaded”)
print( "Country: " … system.getPreference( “locale”, “country” ) )
– Show store UI
titlecard:removeSelf()
bg = display.newImage( “storebg.png”, true )
bg.x = display.contentCenterX
bg.y = display.contentCenterY
descriptionArea = native.newTextBox (10, 0.7*display.contentHeight, display.contentCenterX - 20, display.contentCenterY - 10)
descriptionArea.text = “Select a product…”
descriptionArea:setTextColor (2, 0, 127)
descriptionArea.size = 18
descriptionArea.hasBackground = false
local buttonSpacing = 5
print( "Found " … #validProducts … " valid items ")
– display the valid products in buttons
for i=1, #validProducts do
– Debug: print out product info
print ("Item " … i … “: " … validProducts[i].productIdentifier
… " (” … validProducts[i].price … “)”)
print (validProducts[i].title … ", "… validProducts[i].description)
– create and position product button
local myButton = newBuyButton(i)
myButton.x = display.contentWidth - myButton.width - buttonSpacing
myButton.y = i * buttonSpacing + (2 * i - 1) * myButton.height / 2
end
– create and position Restore button
local myButton = newRestoreButton()
myButton.x = display.contentWidth - myButton.width - buttonSpacing
myButton.y = display.contentHeight - myButton.height / 2 - buttonSpacing
for i=1, #invalidProducts do
– Debug: display the product info
native.showAlert( “Item " … invalidProducts[i] … " is invalid.”,
{ “OK” } )
print(“Item " … invalidProducts[i] … " is invalid.”)
end
end
end
– Handler to receive product information
– This callback is set up by store.loadProducts()
function loadProductsCallback( event )
– Debug info for testing
print(“In loadProductsCallback() to load itoons poroducts”)
print(“event, event.name”, event, event.name)
print(event.products)
print(event.products.title)
print("#event.products", #event.products)
io.flush() – remove for production
– save for later use
validProducts = event.products
invalidProducts = event.invalidProducts
unpackValidProducts ()
end
– Handler for all store transactions
– This callback is set up by store.init()
function transactionCallback( event )
local infoString
print("transactionCallback: Received event ", event.name)
– Also available for your app to use:
print(“transaction”, event.transaction)
print(“state”, event.transaction.state)
print(“errorType”, event.transaction.errorType)
print(“errorString”, event.transaction.errorString)
print(“testing”, store.transactionStatePurchased, store.transactionErrorPaymentCancelled, store.transactionStateFailed )
if event.transaction.state == “purchased” then
infoString = “Transaction successful!”
print (infoString)
descriptionArea.text = infoString
elseif event.transaction.state == “restored” then
– Reminder: your app must store this information somewhere
– Here we just display some of it
infoString = “Restoring transaction:” …
"\n Original ID: " …event.transaction.originalTransactionIdentifier …
"\n Original date: "…event.transaction.originalDate
print (infoString)
descriptionArea.text = infoString
print(“productIdentifier”, event.transaction.productIdentifier)
print(“receipt”, event.transaction.receipt)
print(“transactionIdentifier”, event.transaction.transactionIdentifier)
print(“date”, event.transaction.date)
print(“originalReceipt”, event.transaction.originalReceipt)
elseif event.transaction.state == “cancelled” then
infoString = “Transaction cancelled by user.”
print (infoString)
descriptionArea.text = infoString
elseif event.transaction.state == “failed” then
infoString = "Transaction failed, type: ",
event.transaction.errorType, event.transaction.errorString
print (infoString)
descriptionArea.text = infoString
else
infoString = “Unknown event”
print (infoString)
descriptionArea.text = infoString
end
– Tell the store we are done with the transaction.
– If you are providing downloadable content, do not call this until
– the download has completed.
store.finishTransaction( event.transaction )
end
– Setter upper
function setupMyStore (event)
store.loadProducts( listOfProducts, loadProductsCallback )
print (“After store.loadProducts, waiting for callback”)
if isSimulator then
print(“loaded lis of valid for SIMULATOR”)
– No Store, so no callbacks, so exercise our GUI “manually”
validProducts[1] = {}
validProducts[1].title = “Lemonade refill”
validProducts[1].description = “A wonderful dummy product for testing”
validProducts[1].price = 0.99
validProducts[1].productIdentifier = “com.lemonadestand.consumable.001”
validProducts[2] = {}
validProducts[2].title = “Drinking glass”
validProducts[2].description = “Makes lemonade easier to drink.”
validProducts[2].price = 1.99
validProducts[2].productIdentifier = “com.lemonadestand.nonconsumable.001”
validProducts[3] = {}
validProducts[3].title = “Daily dose”
validProducts[3].description = “Made fresh daily!”
validProducts[3].price = 19.99
validProducts[3].productIdentifier = “com.lemonadestand.subscription.001”
unpackValidProducts()
end
end
– Main
– Show title card
showTitle ()
– Connect to store at startup
store.init (transactionCallback )
print (“After store init”)
– Hide title card, run store
timer.performWithDelay (1000, setupMyStore)
i have changed the listOfProducts contents for the post! but in application are the same as in itoons connect.
can somoen help me a bit?
[import]uid: 169726 topic_id: 32531 reply_id: 332531[/import]