[iOS]iOS內(nèi)購(gòu)教程

最全的內(nèi)購(gòu)圖文教程番捂,首先是填各種資料个唧,最后是代碼,廢話不多說(shuō)设预,直接上圖

======================第一部分協(xié)議===============

第一步.png


第二步.jpg


第三步.jpg


第四步.png


第五步.png


第六步.png


第七步.jpg


第八步.jpg


第九步.jpg


第十步.png


CNAPS CODE 查詢地址:
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

十一步.jpg


十二步.jpg


十三步.png


十四步.png


十五步.jpg


十七步.jpg


十八步.jpg


十九步.png


二十步.png


=============第二部分創(chuàng)建內(nèi)購(gòu)項(xiàng)目============

1.png


2.png


3.png


4.png


5.png


6.png


7.png


===========第三部分貼加內(nèi)購(gòu)項(xiàng)目測(cè)試賬號(hào)==========

創(chuàng)建測(cè)試賬號(hào).png


沙盒測(cè)試員.png


賬號(hào)信息.png


=============第四部分主要實(shí)現(xiàn)代碼==========

首先導(dǎo)入StoreKit.framework庫(kù)

  • .h文件
#import <StoreKit/StoreKit.h>

enum{
IAP0p20=20,
IAP1p100,
IAP4p600,
IAP9p1000,
IAP24p6000,
}buyCoinsTag;

//代理
@interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >

{
int buyType;
}

- (void) requestProUpgradeProductData;

-(void)RequestProductData;

-(void)buy:(int)type;

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

-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;

- (void) completeTransaction: (SKPaymentTransaction *)transaction;

- (void) failedTransaction: (SKPaymentTransaction *)transaction;

-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;

-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;

- (void) restoreTransaction: (SKPaymentTransaction *)transaction;

-(void)provideContent:(NSString *)product;

-(void)recordTransaction:(NSString *)product;

@end
  • .m文件
#import "RechargeVC.h"

//在內(nèi)購(gòu)項(xiàng)目中創(chuàng)的商品單號(hào)
#define ProductID_IAP0p20 @"Nada.JPYF01"http://20
#define ProductID_IAP1p100 @"Nada.JPYF02" //100
#define ProductID_IAP4p600 @"Nada.JPYF03" //600
#define ProductID_IAP9p1000 @"Nada.JPYF04" //1000
#define ProductID_IAP24p6000 @"Nada.JPYF05" //6000

@interface RechargeVC ()

@end

@implementation RechargeVC

- (void)viewDidLoad {

    [super viewDidLoad];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [self buy:IAP0p20];

}

-(void)buy:(int)type
{
    buyType = type;
    if ([SKPaymentQueue canMakePayments]) {
    [self RequestProductData];
    NSLog(@"允許程序內(nèi)付費(fèi)購(gòu)買(mǎi)");
}
else
{
    NSLog(@"不允許程序內(nèi)付費(fèi)購(gòu)買(mǎi)");
    UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"提示"
    message:@"您的手機(jī)沒(méi)有打開(kāi)程序內(nèi)付費(fèi)購(gòu)買(mǎi)"
    delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];

    [alerView show];

    }
}

-(void)RequestProductData
{
    NSLog(@"---------請(qǐng)求對(duì)應(yīng)的產(chǎn)品信息------------");
    NSArray *product = nil;
    switch (buyType) {
        case IAP0p20:
        product=[[NSArray alloc] initWithObjects:ProductID_IAP0p20,nil];
        break;
        case IAP1p100:
        product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil];
        break;
        case IAP4p600:
        product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil];
        break;
        case IAP9p1000:
        product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil];
        break;
        case IAP24p6000:
        product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil];
        break;

        default:
        break;
}
    NSSet *nsset = [NSSet setWithArray:product];
    SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
    request.delegate=self;
    [request start];

}

//<SKProductsRequestDelegate> 請(qǐng)求協(xié)議
//收到的產(chǎn)品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    NSLog(@"-----------收到產(chǎn)品反饋信息--------------");
    NSArray *myProduct = response.products;
    NSLog(@"產(chǎn)品Product ID:%@",response.invalidProductIdentifiers);
    NSLog(@"產(chǎn)品付費(fèi)數(shù)量: %d", (int)[myProduct count]);
    // populate UI
    for(SKProduct *product in myProduct){
    NSLog(@"product info");
    NSLog(@"SKProduct 描述信息%@", [product description]);
    NSLog(@"產(chǎn)品標(biāo)題 %@" , product.localizedTitle);
    NSLog(@"產(chǎn)品描述信息: %@" , product.localizedDescription);
    NSLog(@"價(jià)格: %@" , product.price);
    NSLog(@"Product id: %@" , product.productIdentifier);
}
    SKPayment *payment = nil;
    switch (buyType) {
        case IAP0p20:
        payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20];    //支付25
        break;
        case IAP1p100:
        payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100];    //支付108
        break;
        case IAP4p600:
        payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600];    //支付618
        break;
        case IAP9p1000:
        payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000];    //支付1048
        break;
        case IAP24p6000:
        payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000];    //支付5898
        break;
        default:
        break;
}
    NSLog(@"---------發(fā)送購(gòu)買(mǎi)請(qǐng)求------------");
    [[SKPaymentQueue defaultQueue] addPayment:payment];

}
- (void)requestProUpgradeProductData
{
    NSLog(@"------請(qǐng)求升級(jí)數(shù)據(jù)---------");
    NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
    SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];

}
//彈出錯(cuò)誤信息
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"-------彈出錯(cuò)誤信息----------");
    UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
    delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
    [alerView show];

}

-(void) requestDidFinish:(SKRequest *)request
{
    NSLog(@"----------反饋信息結(jié)束--------------");

}

-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
    NSLog(@"-----PurchasedTransaction----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}

//<SKPaymentTransactionObserver> 千萬(wàn)不要忘記綁定徙歼,代碼如下:
//----監(jiān)聽(tīng)購(gòu)買(mǎi)結(jié)果
//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易結(jié)果
{
    NSLog(@"-----paymentQueue--------");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:{//交易完成
            [self completeTransaction:transaction];
            NSLog(@"-----交易完成 --------");

            UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@""
            message:@"購(gòu)買(mǎi)成功"
            delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];

            [alerView show];

        } break;
        case SKPaymentTransactionStateFailed://交易失敗
            { [self failedTransaction:transaction];
            NSLog(@"-----交易失敗 --------");
            UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"提示"
            message:@"購(gòu)買(mǎi)失敗,請(qǐng)重新嘗試購(gòu)買(mǎi)"
            delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];

            [alerView2 show];

        }break;
        case SKPaymentTransactionStateRestored://已經(jīng)購(gòu)買(mǎi)過(guò)該商品
            [self restoreTransaction:transaction];
            NSLog(@"-----已經(jīng)購(gòu)買(mǎi)過(guò)該商品 --------");
            case SKPaymentTransactionStatePurchasing:      //商品添加進(jìn)列表
            NSLog(@"-----商品添加進(jìn)列表 --------");
            break;
            default:
            break;
        }
    }
}
- (void) completeTransaction: (SKPaymentTransaction *)transaction

{
    NSLog(@"-----completeTransaction--------");
    // Your application should implement these two methods.
    NSString *product = transaction.payment.productIdentifier;
    if ([product length] > 0) {

    NSArray *tt = [product componentsSeparatedByString:@"."];
    NSString *bookid = [tt lastObject];
    if ([bookid length] > 0) {
    [self recordTransaction:bookid];
    [self provideContent:bookid];
}
}

    // Remove the transaction from the payment queue.

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

//記錄交易
-(void)recordTransaction:(NSString *)product{
    NSLog(@"-----記錄交易--------");
}

//處理下載內(nèi)容
-(void)provideContent:(NSString *)product{
    NSLog(@"-----下載--------");
}

- (void) failedTransaction: (SKPaymentTransaction *)transaction{
    NSLog(@"失敗");
    if (transaction.error.code != SKErrorPaymentCancelled)
    {

    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}
-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{

}

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
    NSLog(@" 交易恢復(fù)處理");

}

-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
    NSLog(@"-------paymentQueue----");
}

#pragma mark connection delegate
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"%@",  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    switch([(NSHTTPURLResponse *)response statusCode]) {
        case 200:
        case 206:
        break;
        case 304:
        break;
        case 400:
        break;
        case 404:
        break;
        case 416:
        break;
        case 403:
        break;
        case 401:
        case 500:
        break;
        default:
        break;
    }
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"test");
}

-(void)dealloc
{
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除監(jiān)聽(tīng)

}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳖枕,一起剝皮案震驚了整個(gè)濱河市魄梯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耕魄,老刑警劉巖画恰,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吸奴,居然都是意外死亡允扇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)则奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)考润,“玉大人,你說(shuō)我怎么就攤上這事读处『危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵罚舱,是天一觀的道長(zhǎng)井辜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)管闷,這世上最難降的妖魔是什么粥脚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮包个,結(jié)果婚禮上刷允,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好树灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布纤怒。 她就那樣靜靜地躺著,像睡著了一般天通。 火紅的嫁衣襯著肌膚如雪泊窘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天土砂,我揣著相機(jī)與錄音州既,去河邊找鬼。 笑死萝映,一個(gè)胖子當(dāng)著我的面吹牛吴叶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播序臂,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蚌卤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了奥秆?” 一聲冷哼從身側(cè)響起逊彭,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎构订,沒(méi)想到半個(gè)月后侮叮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悼瘾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年囊榜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亥宿。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸勺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烫扼,到底是詐尸還是另有隱情曙求,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布映企,位于F島的核電站悟狱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堰氓。R本人自食惡果不足惜挤渐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豆赏。 院中可真熱鬧,春花似錦、人聲如沸掷邦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抚岗。三九已至或杠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宣蔚,已是汗流浹背向抢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胚委,地道東北人挟鸠。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亩冬,于是被迫代替她去往敵國(guó)和親艘希。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 為一名iOS開(kāi)發(fā)硅急,蘋(píng)果已經(jīng)在強(qiáng)制推行內(nèi)購(gòu)了覆享,所以,你不得不了解一下啦营袜∪龆伲可能還有些人不知道哪種情況下一定要用到內(nèi)購(gòu),...
    獨(dú)酌丿紅顏閱讀 3,701評(píng)論 2 7
  • 做了很多電商的項(xiàng)目了荚板,都在用各大第三方支付凤壁,作為一名iOS開(kāi)發(fā),蘋(píng)果已經(jīng)在強(qiáng)制推行內(nèi)購(gòu)了啸驯,所以客扎,你不得不了解一下啦...
    Xcode_6閱讀 1,201評(píng)論 0 0
  • 做學(xué)問(wèn)徙鱼,做事業(yè),在人生中都只能算是第二樁事针姿,人生第一樁事是生活袱吆,我所謂的“生活”是“享受”,是“領(lǐng)略”距淫,是“培養(yǎng)生...
    momo狂想閱讀 359評(píng)論 9 0
  • web.xml除了用來(lái)配置過(guò)濾器外绞绒,還可以用來(lái)配置 會(huì)話時(shí)間、歡迎頁(yè)榕暇、錯(cuò)誤頁(yè)蓬衡、監(jiān)聽(tīng)頁(yè)喻杈、控制器等等。 web.xml...
    秋高靠古今閱讀 497評(píng)論 0 1
  • 01 糖,百度如是解釋?zhuān)簭母收岜谏埂⑻鸩舜擅恰⒚住Ⅺ湹忍嶂瞥鰜?lái)的甜的物質(zhì)秒咐。換言之谬晕,糖是“甜”的代名詞,它滋養(yǎng)人携取。 糖精攒钳,百...
    西瓜甜甜啦閱讀 508評(píng)論 8 20