日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iap如何初始化_IAP超级详解

發布時間:2025/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iap如何初始化_IAP超级详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在程序中添加Store功能

本章為添加購買功能的指導

詳細流程:

準備工作當然是添加StoreKit.framework了。

然后是具體的步驟:

1. 決定在程序內出售的商品的類型。

之前提到過,程序內可以出售的新feature類型是有限制的。 Store Kit不允許我們下載新的代碼。 你的商品要么可以通過當前的代碼工作(bundle類型),要么可以通過服務器下載(當然,這里下載的為數據文件,代碼是不可以的)。 如果要修改源代碼,就只能老實的升級了。

2. 通過iTunes Connect注冊商品

每次添加新商品的時候都需要執行這一步驟。 每個商品都需要一個唯一的商品標識。 App Store通過這個標識來查找商品信息并處理支付流程。 注冊商品標識的方法和注冊程序的方法類似。

要了解如何創建和注冊商品信息,請參考“iTunes Connect Developer Guide”文檔。

3. 檢測是否可以進行支付

用戶可以禁用在程序內部支付的功能。在發送支付請求之前,程序應該檢查該功能是否被開啟。程序可在顯示商店界面之前就檢查該設置(沒啟用就不顯示商店界面了),也可以在用戶發送支付請求前再檢查,這樣用戶就可以看到可購買的商品列表了。

例子:

if([SKPaymentQueue canMakePayments])

{

...//Display a store to the user

}

else

{

...//Warn the user that purchases are disabled.

}

4. 獲得商品的信息

程序創建SKProductsRequest對象,用想要出售的商品的標識來初始化, 然后附加上對應的委托對象。 該請求的響應包含了可用商品的本地化信息。

//這里發送請求

- (void)requestProductData

{

SKProductsRequest *request = [[SKProductsRequest alloc]initWithProductIdentifiers:

[NSSet setWithObject: kMyFeatureIdentifier]];

request.delegate = self;

[request start];

}

//這個是響應的delegate方法

- (void)productsRequest: (SKProductsRequest *)request

didReceiveResponse: (SKProductsResponse *)response

{

NSArray *myProduct = response.products;

//生成商店的UI

[request autorelease];

}

5. 添加一個展示商品的界面

Store Kit不提供界面的類。 這個界面需要我們自己來設計并實現。

6. 為支付隊列(payment queue)注冊一個觀察者對象

你的程序需要初始化一個transaction observer對象并把它指定為payment queue的觀察者。

上代碼:

MyStoreObserver *observer = [[MyStoreObserver alloc]init];

[[SKPaymentQueue defaultQueue]addTransactionObserver: observer];

應該在程序啟動的時候就添加好觀察者,原因前面說過,重啟后程序會繼續上次未完的交易,這時就添加觀察者對象就不會漏掉之前的交易信息。

7. 在MyStoreObserver類中執行paymentQueue: updatedTransactions: 方法。

這個方法會在有新的交易被創建,或者交易被更新的時候被調用。

- (void)paymentQueue: (SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions

{

for(SKPaymentTransaction * transaction in transactions)

{

switch(transaction.transactionState)

{

case SKPaymentTransactionStatePurchased:

[self completeTransaction: transaction];

break;

case SKPaymentTransactionStateFailed:

[self failedTransaction: transaction];

break;

case SKPaymentTransactionStateRestored:

[self restoreTransaction: transaction];

default:

break;

}

}

}

上面的函數針對不同的交易返回狀態,調用對應的處理函數。

8. 觀察者對象在用戶成功購買一件商品時,提供相應的內容,以下是在交易成功后調用的方法

- (void) completeTransaction: (SKPaymentTransaction *)transaction

{

//你的程序需要實現這兩個方法

[self recordTransaction: transaction];

[self provideContent: transaction.payment.productIdentifier];

//將完成后的交易信息移出隊列

[[SKPaymentQueue defaultQueue]finishTransaction: transaction];

}

交易成功的信息包含transactionIdentifier和transactionReceipt的屬性。其中,transactionReceipt記錄了支付的詳細信息,這個信息可以幫助你跟蹤、審(我們的)查交易,如果你的程序是用服務器來交付內容,transactionReceipt可以被傳送到服務器,然后通過App Store驗證交易。(之前提到的server模式,可以參考以前的圖)

9. 如果交易是恢復過來的(restore),我們用這個方法來處理:

- (void) restoreTransaction: (SKPaymentTransaction *)transaction

{

[self recordTransaction: transaction];

[self provideContent: transaction.payment.productIdentifier];

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

這個過程完成購買的過程類似。 恢復的購買內容提供一個新的交易信息,這個信息包含了新的transaction的標識和receipt數據。 如果需要的話,你可以把這些信息單獨保存下來,供追溯審(我們的)查之用。但更多的情況下,在交易完成時,你可能需要覆蓋原始的transaction數據,并使用其中的商品標識。

10. 交易過程失敗的話,我們調用如下的方法:

- (void)failedTransaction: (SKPaymentTransaction *)transaction

{

if(transaction.error.code != SKErrorPaymentCancelled)

{

//在這類顯示除用戶取消之外的錯誤信息

}

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

通常情況下,交易失敗的原因是取消購買商品的流程。 程序可以從error中讀出交易失敗的詳細信息。

顯示錯誤信息不是必須的,但在上面的處理方法中,需要將失敗的交易從支付隊列中移除。 一般來說,我們用一個對話框來顯示錯誤信息,這時就應避免將用戶取消購買這個error顯示出來。

11. 組織好程序內“商店”的UI。當用戶選擇一件商品時, 創建一個支付對象,并放到隊列中。

SKPayment *payment = [SKPayment paymentWithProductIdentifier: kMyFeatureIdentifier];

[[SKPaymentQueue defaultQueue] addPayment: payment];

如果你的商店支持選擇同一件商品的數量,你可以設置支付對象的quantity屬性

SKMutablePayment *payment = [SKMutablePayment paymentWithProductIdentifier: kMyFeatureIdentifier];

payment.quantity = 3;

[[SKPaymentQueue defaultQueue] addPayment: payment];

下一步:

本章中所示代碼可用于內置型商品模式(Built-in)。 如果你的程序要使用服務器來發布商品,你需要負責設計和執行iPhone程序和你的服務器之間的通信。服務器應該驗證數據并為程序提供內容。

驗證store的收據

使用服務器來交付內容,我們還需要做些額外的工作來驗證從Store Kit發送的收據信息。

重要信息:來自Store的收據信息的格式是專用的。 你的程序不應直接解析這類數據。可使用如下的機制來取出其中的信息。

驗證App Store返回的收據信息

當交易完成時,Store Kit告知payment observer這個消息,并返回完成的transaction。 SKPaymentTransaction的transactionReceipt屬性就包含了一個經過簽名的收據信息,其中記錄了交易的關鍵信息。你的服務器要負責提交收據信息來確定其有效性,并保證它未經過篡改。 這個過程中,信息被以JSON數據格式發送給App Store,App Store也以JSON的格式返回數據。

(大家可以先了解一下JSON的格式)

驗證收據的過程:

1. 從transaction的transactionReceipt屬性中得到收據的數據,并以base64方式編碼。

2. 創建JSON對象,字典格式,單鍵值對,鍵名為"receipt-data", 值為上一步編碼后的數據。效果為:

{

"receipt-data"????: "(編碼后的數據)"

}

3. 發送HTTP POST的請求,將數據發送到App Store,其地址為:

https://buy.itunes.apple.com/verfyReceipt

4. App Store的返回值也是一個JSON格式的對象,包含兩個鍵值對, status和receipt:

{

"status"????: 0,

"receipt"????: { … }

}

如果status的值為0, 就說明該receipt為有效的。 否則就是無效的。

App Store的收據

發送給App Store的收據數據是通過對transaction中對應的信息編碼而創建的。 當App Store驗證收據時, 將從其中解碼出數據,并以"receipt"的鍵返回。 返回的響應信息是JSON格式,被包含在SKPaymentTransaction的對象中(transactionReceipt屬性)。Server可通過這些值來了解交易的詳細信息。 Apple建議只發送receipt數據到服務器并使用receipt數據驗證和獲得交易詳情。 因為App Store可驗證收據信息,返回信息,保證信息不被篡改,這種方式比同時提交receipt和transaction的數據要安全。(這段得再看看)

表5-1為交易信息的所有鍵,很多的鍵都對應SKPaymentTransaction的屬性。

備注:一些鍵取決于你的程序是鏈接到App Store還是測試用的Sandbox環境。更多關于sandbox的信息,請查看"Testing a Store"一章。

Table 5-1 購買信息的鍵:

鍵名????????描述

quantity???? 購買商品的數量。對應SKPayment對象中的quantity屬性

product_id????商品的標識,對應SKPayment對象的productIdentifier屬性。

transaction_id????????交易的標識,對應SKPaymentTransaction的transactionIdentifier屬性

purchase_date????交易的日期,對應SKPaymentTransaction的transactionDate屬性

original_-transaction_id????對于恢復的transaction對象,該鍵對應了原始的transaction標識

original_purchase_-date????對于恢復的transaction對象,該鍵對應了原始的交易日期

app_item_id????App Store用來標識程序的字符串。一個服務器可能需要支持多個server的支付功能,可以用這個標識來區分程序。鏈接sandbox用來測試的程序的不到這個值,因此該鍵不存在。

version_external_-identifier????用來標識程序修訂數。該鍵在sandbox環境下不存在

bid????iPhone程序的bundle標識

bvrs????iPhone程序的版本號

測試Store功能

開發過程中,我們需要測試支付功能以保證其工作正常。然而,我們不希望在測試時對用戶收費。 Apple提供了sandbox的環境供我們測試。

備注:Store Kit在模擬器上無法運行。 當在模擬器上運行Store Kit的時候,訪問payment queue的動作會打出一條警告的log。測試store功能必須在真機上進行。

Sandbox環境

使用Sandbox環境的話,Store Kit并沒有鏈接到真實的App Store,而是鏈接到專門的Sandbox環境。 SandBox的內容和App Store一致,只是它不執行真實的支付動作。 它會返回交易成功的信息。 Sandbox使用專門的iTunes Connect測試 賬戶。不能使用正式的iTunes Connect賬戶來測試。

要測試程序,需要創建一個專門的測試賬戶。你至少需要為程序的每個區域創建至少一個測試賬戶。詳細信息,請查看iTunes Connect Developer Guide文檔。

在Sandbox環境中測試

步驟:

1. 在測試的iPhone上退出iTunes賬戶

Settings中可能會記錄之前登錄的賬戶,進入并退出。

重要信息:不能在Settings 程序中通過測試賬戶登錄。

2. 運行程序

當你在程序的store中購買商品后,Store kit提示你去驗證交易。用測試賬戶登錄,并批準支付。 這樣虛擬的交易就完成了。

在Sandbox中驗證收據

驗證的URL不同了:

NSURL *sandboxStoreURL = [[NSURL alloc]initWithString:

@"https://sandbox.itunes.apple.com/verifyReceipt"];

總結

以上是生活随笔為你收集整理的iap如何初始化_IAP超级详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。