蘋(píng)果內(nèi)購(gòu)那些事

在內(nèi)購(gòu)項(xiàng)目中的那些奇葩事

一、 首先就是在自己的開(kāi)發(fā)者賬號(hào)中設(shè)置的一些亂七八糟的東西,在我們公司這些東西都是運(yùn)營(yíng)的哥哥姐姐們搞得,不過(guò)在其它的博客中也有詳細(xì)的說(shuō)明,我也不再多說(shuō)。

注意:在開(kāi)始擼代碼的時(shí)候銀行卡的一些稅務(wù)信息必須是通過(guò)蘋(píng)果審核通過(guò)的,否則是無(wú)法擼代碼進(jìn)行測(cè)試的。

二、 接下來(lái)就是搞代碼的時(shí)候了:

1、 #import <StoreKit/StoreKit.h>導(dǎo)入文件
2、 <SKPaymentTransactionObserver,SKProductsRequestDelegate,SKRequestDelegate>這些代理協(xié)議是必須遵守的
3、 在你的充值控制器里面自定義自己的方法
/**
 請(qǐng)求產(chǎn)品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product;
/**
是否允許購(gòu)買(mǎi)
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy;
/**
交易結(jié)果
 @param queue queue
 @param transactions ransactions
 * /
- (void)paymentQueue:(SKPaymentQueue *)queue         updatedTransactions:(NSArray *)transactions;
/**
 購(gòu)買(mǎi)交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
/**
 交易失敗
@param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
去實(shí)現(xiàn)這些方法
1.、在ViewDidLoad里面添加蘋(píng)果的監(jiān)聽(tīng)
//添加蘋(píng)果支付監(jiān)聽(tīng)
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2、 在dealloc里面接觸這個(gè)監(jiān)聽(tīng)
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除監(jiān)聽(tīng)
3、 #pragma mark -- /*蘋(píng)果支付*/
/**
 是否允許購(gòu)買(mǎi)
 @param buy buy
 */
- (void)allowedBuy:(NSString *)buy {
    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"允許程序內(nèi)購(gòu)買(mǎi)此商品");
        [self requestProductData:buy];    
    }else {
        NSLog(@"不允許程序內(nèi)購(gòu)買(mǎi)此商品");
    }
}
/**
 請(qǐng)求產(chǎn)品信息
 @param product prodect
 */
-(void)requestProductData:(NSString *)product {
    NSArray *productArray = @[product];
    NSSet *productSet = [NSSet setWithArray:productArray];//集合
    //開(kāi)始請(qǐng)求
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];
    request.delegate = self;
    [request start];
}
/**
 收到產(chǎn)品的反饋信息
 @param request request
 @param response response
 */
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSArray *myProduct = response.products;
    SKProduct *p = nil;
    for (SKProduct *product in myProduct) {    
    p = product;
    }
    SKPayment *payment = [SKPayment paymentWithProduct:p];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
/**
 請(qǐng)求失敗
 @param request request
 @param error error
 */
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    [self.loading stop];
    UIAlertController *alertController = [[UIAlertController alloc] init];
    UIAlertAction *errorAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Alert", NULL) style:UIAlertActionStyleCancel handler:nil];
    [alertController addAction:errorAction];
    [self presentViewController:alertController animated:YES completion:nil];
}
/**
 結(jié)束反饋
 @param request request
 */
- (void)requestDidFinish:(SKRequest *)request {
    NSLog(@"-----反饋結(jié)束-----");
}
/**
 交易結(jié)果
 @param queue queue
 @param transactions ransactions
 */
- (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: {    
            }
                break;
            case SKPaymentTransactionStatePurchasing:      //商品添加進(jìn)列表
                break;
            default:
                break;
        }
    }
}
/**
 購(gòu)買(mǎi)交易
 @param transaction transaction
 */
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction {
    NSLog(@"-----購(gòu)買(mǎi)交易----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
/**
 交易完成
 @param transaction transaction
 */
- (void) completeTransaction: (SKPaymentTransaction *)transaction { 
    NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];
    NSDictionary *requestContents = @{
                                  @"receipt": [receipt base64EncodedStringWithOptions:0]
                                  };
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
/*中間在這個(gè)地方做二次驗(yàn)證,可以去服務(wù)器驗(yàn)證也可以在客戶端完成驗(yàn)證,建議在服務(wù)器驗(yàn)證(但是時(shí)間稍微慢一點(diǎn)) 根據(jù)個(gè)人需求吧 */
}
/**
 交易失敗
 @param transaction transaction
 */
- (void) failedTransaction: (SKPaymentTransaction *)transaction     {    
    [self.loading stop];
    if (transaction.error.code != SKErrorPaymentCancelled)
{    
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

特別注意:
1、 在提交審核的時(shí)候App內(nèi)購(gòu)項(xiàng)目的產(chǎn)品名稱建議統(tǒng)一化,包括在購(gòu)買(mǎi)界面的顯示問(wèn)題。否則被蘋(píng)果打回的可能性非常高??
2、 記得在內(nèi)購(gòu)的地方上傳內(nèi)購(gòu)的照片,有的app上傳的是購(gòu)買(mǎi)列表的照片,有的app是上傳的購(gòu)買(mǎi)成功的照片。
3、 具體是哪一張后續(xù)繼續(xù)更新??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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