iOS內(nèi)購(gòu)全流程

======================第一部分協(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

2016/11/18號(hào)更新

十九步(1).png

十九步(2).png

沒(méi)顯示的都是可以不填的,主要是打鉤? title 和最后面的Self

二十步.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;

//代理

@interfaceRechargeVC:UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate>

{

intbuyType;

}

- (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"http://100

#define ProductID_IAP4p600 @"Nada.JPYF03"http://600

#define ProductID_IAP9p1000 @"Nada.JPYF04"http://1000

#define ProductID_IAP24p6000@"Nada.JPYF05"http://6000

@interfaceRechargeVC()

@end

@implementation RechargeVC

- (void)viewDidLoad {

? [superviewDidLoad];? ?

[[SKPaymentQueuedefaultQueue] addTransactionObserver:self];? ?

[selfbuy:IAP0p20];

}

-(void)buy:(int)type{?

? buyType = type;

if([SKPaymentQueuecanMakePayments]) {

? [selfRequestProductData];

NSLog(@"允許程序內(nèi)付費(fèi)購(gòu)買(mǎi)");

}else{

NSLog(@"不允許程序內(nèi)付費(fèi)購(gòu)買(mǎi)");

UIAlertView*alerView =? [[UIAlertViewalloc] initWithTitle:@"提示"message:@"您的手機(jī)沒(méi)有打開(kāi)程序內(nèi)付費(fèi)購(gòu)買(mǎi)"delegate:nilcancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];? ?

[alerView show];? ?

}

}

-(void)RequestProductData{

NSLog(@"---------請(qǐng)求對(duì)應(yīng)的產(chǎn)品信息------------");

NSArray*product =nil;

switch(buyType) {

caseIAP0p20:? ? ? ?

product=[[NSArrayalloc] initWithObjects:ProductID_IAP0p20,nil];

break;

caseIAP1p100:? ? ??

product=[[NSArrayalloc] initWithObjects:ProductID_IAP1p100,nil];

break;

caseIAP4p600:? ? ? ?

product=[[NSArrayalloc] initWithObjects:ProductID_IAP4p600,nil];

break;

caseIAP9p1000:? ? ??

product=[[NSArrayalloc] initWithObjects:ProductID_IAP9p1000,nil];

break;

caseIAP24p6000:? ? ? ?

product=[[NSArrayalloc] initWithObjects:ProductID_IAP24p6000,nil];

break;

default:

break;

}

NSSet*nsset = [NSSetsetWithArray:product];

SKProductsRequest*request=[[SKProductsRequestalloc] initWithProductIdentifiers: nsset];? ? request.delegate=self;?

? [request start];

}

// 請(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*productinmyProduct){

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) {

caseIAP0p20:? ? ? ?

payment? = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP0p20];//支付25

break;

caseIAP1p100:? ? ?

payment? = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP1p100];//支付108

break;

caseIAP4p600:? ? ? ?

payment? = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP4p600];//支付618

break;

caseIAP9p1000:? ? ??

payment? = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP9p1000];//支付1048

break;

caseIAP24p6000:? ? ? ?

payment? = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP24p6000];//支付5898

break;

default:

break;

}NSLog(@"---------發(fā)送購(gòu)買(mǎi)請(qǐng)求------------");?

? [[SKPaymentQueuedefaultQueue] addPayment:payment];

}

- (void)requestProUpgradeProductData{

NSLog(@"------請(qǐng)求升級(jí)數(shù)據(jù)---------");

NSSet*productIdentifiers = [NSSetsetWithObject:@"com.productid"];

SKProductsRequest* productsRequest = [[SKProductsRequestalloc] initWithProductIdentifiers:productIdentifiers];??

productsRequest.delegate =self;??

[productsRequest start];

}

//彈出錯(cuò)誤信息

- (void)request:(SKRequest*)request didFailWithError:(NSError*)error{

NSLog(@"-------彈出錯(cuò)誤信息----------");

UIAlertView*alerView =? [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]? ? delegate:nilcancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];?

? [alerView show];

}

-(void) requestDidFinish:(SKRequest*)request{

NSLog(@"----------反饋信息結(jié)束--------------");

}

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

NSLog(@"-----PurchasedTransaction----");

NSArray*transactions =[[NSArrayalloc] initWithObjects:transaction,nil];??

[selfpaymentQueue:[SKPaymentQueuedefaultQueue] updatedTransactions:transactions];

}

// 千萬(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*transactionintransactions)? ? {

switch(transaction.transactionState){

caseSKPaymentTransactionStatePurchased:{

//交易完成

[selfcompleteTransaction:transaction];

NSLog(@"-----交易完成 --------");

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

? ? ? }

break;

caseSKPaymentTransactionStateFailed:/

/交易失敗

{

[selffailedTransaction:transaction];

NSLog(@"-----交易失敗 --------");

UIAlertView*alerView2 =? [[UIAlertViewalloc] initWithTitle:@"提示"message:@"購(gòu)買(mǎi)失敗,請(qǐng)重新嘗試購(gòu)買(mǎi)"delegate:nilcancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];? ? ? ? ? ? [alerView2 show];? ??

? }

break;

caseSKPaymentTransactionStateRestored:

//已經(jīng)購(gòu)買(mǎi)過(guò)該商品[selfrestoreTransaction:transaction];

NSLog(@"-----已經(jīng)購(gòu)買(mǎi)過(guò)該商品 --------");

caseSKPaymentTransactionStatePurchasing:

//商品添加進(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) {

? [selfrecordTransaction:bookid];

? [selfprovideContent:bookid];

}

}

// Remove the transaction from the payment queue.

[[SKPaymentQueuedefaultQueue] finishTransaction: transaction];

}

//記錄交易

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

NSLog(@"-----記錄交易--------");

}

//處理下載內(nèi)容

-(void)provideContent:(NSString*)product{NSLog(@"-----下載--------");

}

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

NSLog(@"失敗");

if(transaction.error.code !=SKErrorPaymentCancelled)? ? {?

? }??

[[SKPaymentQueuedefaultQueue] 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(@"%@",? [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);

}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection{}- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{

switch([(NSHTTPURLResponse*)response statusCode]) {

case200:

case206:

break;

case304:

break;

case400:

break;

case404:

break;

case416:

break;

case403:

break;

case401:

case500:

break;

default:

break;??

}

}

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {

NSLog(@"test");

}

-(void)dealloc{

? ? [[SKPaymentQueuedefaultQueue] removeTransactionObserver:self];

//解除監(jiān)聽(tīng)

}

@end

2016/11/22更新

內(nèi)購(gòu)項(xiàng)目不再是單獨(dú)提交審核了跌造,只要app提交審核內(nèi)購(gòu)項(xiàng)目自然跟著改變狀態(tài)鼻由,不消耗物品請(qǐng)不要選擇 托管那一項(xiàng),不然會(huì)出現(xiàn)問(wèn)題

更多經(jīng)驗(yàn)請(qǐng)點(diǎn)擊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市止吐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侨糟,老刑警劉巖碍扔,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秕重,居然都是意外死亡不同,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)溶耘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)二拐,“玉大人,你說(shuō)我怎么就攤上這事凳兵“傩拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵庐扫,是天一觀的道長(zhǎng)饭望。 經(jīng)常有香客問(wèn)我澜倦,道長(zhǎng),這世上最難降的妖魔是什么杰妓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任藻治,我火速辦了婚禮,結(jié)果婚禮上巷挥,老公的妹妹穿的比我還像新娘桩卵。我一直安慰自己,他們只是感情好倍宾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布雏节。 她就那樣靜靜地躺著,像睡著了一般高职。 火紅的嫁衣襯著肌膚如雪钩乍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天怔锌,我揣著相機(jī)與錄音寥粹,去河邊找鬼。 笑死埃元,一個(gè)胖子當(dāng)著我的面吹牛涝涤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岛杀,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼阔拳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了类嗤?” 一聲冷哼從身側(cè)響起糊肠,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遗锣,沒(méi)想到半個(gè)月后货裹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄伊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年泪酱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片还最。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墓阀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拓轻,到底是詐尸還是另有隱情斯撮,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布扶叉,位于F島的核電站勿锅,受9級(jí)特大地震影響帕膜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溢十,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一垮刹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧张弛,春花似錦荒典、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刻剥,卻和暖如春遮咖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背造虏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工御吞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酗电。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓魄藕,卻偏偏與公主長(zhǎng)得像内列,于是被迫代替她去往敵國(guó)和親撵术。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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