iOS內(nèi)購IAP(六) —— 編程指南之請求支付(一)

版本記錄

版本號 時(shí)間
V1.0 2018.07.25

前言

大家都知道,ios虛擬商品如寶石、金幣等都需要走內(nèi)購,和蘋果三七分成,如果這類商品不走內(nèi)購那么上不去架或者上架以后被發(fā)現(xiàn)而被下架。最近有一個(gè)項(xiàng)目需要增加內(nèi)購支付功能,所以最近又重新集成并整理了下,希望對大家有所幫助。感興趣的可以參考上面幾篇。
1. iOS內(nèi)購IAP(一) —— 基礎(chǔ)配置篇(一)
2. iOS內(nèi)購IAP(二) —— 工程實(shí)踐(一)
3. iOS內(nèi)購IAP(三) —— 編程指南之關(guān)于內(nèi)購(一)
4. iOS內(nèi)購IAP(四) —— 編程指南之設(shè)計(jì)您的應(yīng)用程序的產(chǎn)品(一)
5. iOS內(nèi)購IAP(五) —— 編程指南之檢索產(chǎn)品信息(一)

Requesting Payment - 請求支付

在購買過程的第二部分中,在用戶選擇購買特定產(chǎn)品后,您的應(yīng)用程序會(huì)向App Store提交付款請求,如圖3-1所示。

Figure 3-1 Stages of the purchase process—requesting payment

Creating a Payment Request - 創(chuàng)建一個(gè)支付請求

當(dāng)用戶選擇要購買的產(chǎn)品時(shí),使用產(chǎn)品對象創(chuàng)建付款請求,并在需要時(shí)設(shè)置數(shù)量,如Listing 3-1所示。 產(chǎn)品對象來自應(yīng)用程序產(chǎn)品請求返回的產(chǎn)品數(shù)組,如 Retrieving Product Information中所述

// Listing 3-1  Creating a payment request

SKProduct *product = <# Product returned by a products request #>;
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
payment.quantity = 2;

Detecting Irregular Activity - 檢測無規(guī)律活動(dòng)

App Store使用不規(guī)則活動(dòng)檢測引擎來幫助打擊欺詐行為。某些應(yīng)用程序可以提供其他信息,以提高引擎檢測異常事務(wù)的能力。如果您的用戶擁有您的帳戶,除了他們的App Store帳戶外,請?jiān)诟犊顣r(shí)提供此額外信息。

作為說明,考慮以下兩個(gè)例子。在正常情況下,您服務(wù)器上的許多不同用戶都購買了在您的游戲中使用的硬幣,并且每個(gè)用戶都從不同的App Store帳戶支付購買費(fèi)用。相比之下,服務(wù)器上的單個(gè)用戶多次購買硬幣是非常不尋常的,從不同的App Store帳戶支付每次購買的費(fèi)用。 App Store無法自行檢測此類不規(guī)則活動(dòng) - 它需要您的應(yīng)用程序提供有關(guān)您的服務(wù)器上的哪個(gè)帳戶與該交易相關(guān)聯(lián)的信息。

要提供此信息,請使用服務(wù)器上用戶帳戶名的單向哈希填充付款對象的applicationUsername屬性,例如LIsting 3-2中所示的示例。

// Listing 3-2  Providing an application username

#import <CommonCrypto/CommonCrypto.h>
 
// Custom method to calculate the SHA-256 hash using Common Crypto
- (NSString *)hashedValueForAccountName:(NSString*)userAccountName
{
    const int HASH_SIZE = 32;
    unsigned char hashedChars[HASH_SIZE];
    const char *accountName = [userAccountName UTF8String];
    size_t accountNameLen = strlen(accountName);
 
    // Confirm that the length of the user name is small enough
    // to be recast when calling the hash function.
    if (accountNameLen > UINT32_MAX) {
        NSLog(@"Account name too long to hash: %@", userAccountName);
        return nil;
    }
    CC_SHA256(accountName, (CC_LONG)accountNameLen, hashedChars);
 
    // Convert the array of bytes into a string showing its hex representation.
    NSMutableString *userAccountHash = [[NSMutableString alloc] init];
    for (int i = 0; i < HASH_SIZE; i++) {
        // Add a dash every four bytes, for readability.
        if (i != 0 && i%4 == 0) {
            [userAccountHash appendString:@"-"];
        }
        [userAccountHash appendFormat:@"%02x", hashedChars[i]];
    }
 
    return userAccountHash;
}

如果使用其他方法填充此屬性,請確保您提供的值是與服務(wù)器上用戶帳戶唯一關(guān)聯(lián)的不透明標(biāo)識符。 不要將Apple ID用于您的開發(fā)者帳戶,用戶的Apple ID或服務(wù)器上用戶未hash的帳戶名稱。


Submitting a Payment Request - 提交付款申請

將支付請求添加到事務(wù)隊(duì)列會(huì)將其提交到App Store。 如果您多次向隊(duì)列添加付款對象,則會(huì)多次提交 - 用戶需要多次付費(fèi),并且您的應(yīng)用預(yù)計(jì)會(huì)多次發(fā)放該產(chǎn)品。

[[SKPaymentQueue defaultQueue] addPayment:payment];

對于您的應(yīng)用提交的每個(gè)付款請求,它會(huì)返回必須處理的相應(yīng)交易。 在 Waiting for the App Store to Process Transactions中會(huì)對交易和交易隊(duì)列進(jìn)行說明。

后記

本篇主要講述了請求支付,感興趣的給個(gè)贊或者關(guān)注~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容